From acfca619eb889ed341f7ae99c244cd6d71021c15 Mon Sep 17 00:00:00 2001 From: Tommy Ettinger Date: Sun, 9 Oct 2022 23:04:59 -0700 Subject: [PATCH] Release 0.8.3 ! Former-commit-id: 10ba07a91a910f573d5ee723914397e11246300b --- README.md | 20 +- build.gradle | 2 +- .../apidocs/allclasses-index.html | 90 +- .../apidocs/allpackages-index.html | 2 +- .../colorful/pure/FloatColors.html | 2 +- ...Gain.html => Interpolations.BiasGain.html} | 46 +- ...Bounce.html => Interpolations.Bounce.html} | 54 +- ...ceIn.html => Interpolations.BounceIn.html} | 54 +- ...Out.html => Interpolations.BounceOut.html} | 54 +- ...astic.html => Interpolations.Elastic.html} | 52 +- ...Out.html => Interpolations.ElasticIn.html} | 56 +- ...In.html => Interpolations.ElasticOut.html} | 56 +- ...ation.Exp.html => Interpolations.Exp.html} | 52 +- ...n.ExpIn.html => Interpolations.ExpIn.html} | 52 +- ...ExpOut.html => Interpolations.ExpOut.html} | 52 +- .../pure/Interpolations.Interpolation.html | 191 + ...ation.Pow.html => Interpolations.Pow.html} | 52 +- ...n.PowIn.html => Interpolations.PowIn.html} | 52 +- ...PowOut.html => Interpolations.PowOut.html} | 52 +- ...n.Swing.html => Interpolations.Swing.html} | 50 +- ...ingIn.html => Interpolations.SwingIn.html} | 50 +- ...gOut.html => Interpolations.SwingOut.html} | 50 +- ...Interpolation.html => Interpolations.html} | 289 +- .../colorful/pure/MathTools.html | 78 +- .../colorful/pure/cielab/ColorTools.html | 118 +- .../colorful/pure/cielab/GradientTools.html | 76 +- .../colorful/pure/cielab/Palette.html | 2 +- .../colorful/pure/cielab/SimplePalette.html | 2 +- .../pure/cielab/class-use/ColorTools.html | 2 +- .../pure/cielab/class-use/GradientTools.html | 2 +- .../pure/cielab/class-use/Palette.html | 2 +- .../pure/cielab/class-use/SimplePalette.html | 2 +- .../colorful/pure/cielab/package-summary.html | 2 +- .../colorful/pure/cielab/package-tree.html | 2 +- .../colorful/pure/cielab/package-use.html | 2 +- .../colorful/pure/class-use/FloatColors.html | 2 +- .../class-use/Interpolations.BiasGain.html | 61 + ...wingIn.html => Interpolations.Bounce.html} | 18 +- ...icIn.html => Interpolations.BounceIn.html} | 18 +- ...Out.html => Interpolations.BounceOut.html} | 24 +- ...astic.html => Interpolations.Elastic.html} | 24 +- ...Out.html => Interpolations.ElasticIn.html} | 18 +- ...In.html => Interpolations.ElasticOut.html} | 18 +- ...ation.Exp.html => Interpolations.Exp.html} | 28 +- ....ExpOut.html => Interpolations.ExpIn.html} | 22 +- ....ExpIn.html => Interpolations.ExpOut.html} | 22 +- ...html => Interpolations.Interpolation.html} | 290 +- ...ation.Pow.html => Interpolations.Pow.html} | 36 +- ....PowOut.html => Interpolations.PowIn.html} | 40 +- ....PowIn.html => Interpolations.PowOut.html} | 40 +- ....Bounce.html => Interpolations.Swing.html} | 18 +- ...ngOut.html => Interpolations.SwingIn.html} | 18 +- ...wing.html => Interpolations.SwingOut.html} | 18 +- ...tion.BiasGain.html => Interpolations.html} | 10 +- .../colorful/pure/class-use/MathTools.html | 2 +- .../colorful/pure/hsluv/ColorTools.html | 72 +- .../colorful/pure/hsluv/GradientTools.html | 76 +- .../colorful/pure/hsluv/Palette.html | 2 +- .../colorful/pure/hsluv/SimplePalette.html | 2 +- .../pure/hsluv/class-use/ColorTools.html | 2 +- .../pure/hsluv/class-use/GradientTools.html | 2 +- .../pure/hsluv/class-use/Palette.html | 2 +- .../pure/hsluv/class-use/SimplePalette.html | 2 +- .../colorful/pure/hsluv/package-summary.html | 2 +- .../colorful/pure/hsluv/package-tree.html | 2 +- .../colorful/pure/hsluv/package-use.html | 2 +- .../colorful/pure/ipt/ColorTools.html | 104 +- .../colorful/pure/ipt/GradientTools.html | 76 +- .../colorful/pure/ipt/Palette.html | 2 +- .../pure/ipt/class-use/ColorTools.html | 2 +- .../pure/ipt/class-use/GradientTools.html | 2 +- .../colorful/pure/ipt/class-use/Palette.html | 2 +- .../colorful/pure/ipt/package-summary.html | 2 +- .../colorful/pure/ipt/package-tree.html | 2 +- .../colorful/pure/ipt/package-use.html | 2 +- .../colorful/pure/ipt_hq/ColorTools.html | 2 +- .../colorful/pure/ipt_hq/GradientTools.html | 76 +- .../colorful/pure/ipt_hq/Palette.html | 2 +- .../colorful/pure/ipt_hq/SimplePalette.html | 2 +- .../pure/ipt_hq/class-use/ColorTools.html | 2 +- .../pure/ipt_hq/class-use/GradientTools.html | 2 +- .../pure/ipt_hq/class-use/Palette.html | 2 +- .../pure/ipt_hq/class-use/SimplePalette.html | 2 +- .../colorful/pure/ipt_hq/package-summary.html | 2 +- .../colorful/pure/ipt_hq/package-tree.html | 2 +- .../colorful/pure/ipt_hq/package-use.html | 2 +- .../colorful/pure/oklab/ColorTools.html | 193 +- .../colorful/pure/oklab/GradientTools.html | 76 +- .../colorful/pure/oklab/Palette.html | 1344 ++-- .../colorful/pure/oklab/SimplePalette.html | 378 +- .../pure/oklab/class-use/ColorTools.html | 2 +- .../pure/oklab/class-use/GradientTools.html | 2 +- .../pure/oklab/class-use/Palette.html | 2 +- .../pure/oklab/class-use/SimplePalette.html | 2 +- .../colorful/pure/oklab/package-summary.html | 2 +- .../colorful/pure/oklab/package-tree.html | 2 +- .../colorful/pure/oklab/package-use.html | 2 +- .../colorful/pure/package-summary.html | 42 +- .../colorful/pure/package-tree.html | 37 +- .../colorful/pure/package-use.html | 80 +- .../colorful/pure/rgb/ColorTools.html | 305 +- .../colorful/pure/rgb/GradientTools.html | 76 +- .../colorful/pure/rgb/Palette.html | 2 +- .../colorful/pure/rgb/SimplePalette.html | 4 +- .../pure/rgb/class-use/ColorTools.html | 2 +- .../pure/rgb/class-use/GradientTools.html | 2 +- .../colorful/pure/rgb/class-use/Palette.html | 2 +- .../pure/rgb/class-use/SimplePalette.html | 2 +- .../colorful/pure/rgb/package-summary.html | 2 +- .../colorful/pure/rgb/package-tree.html | 2 +- .../colorful/pure/rgb/package-use.html | 2 +- .../colorful/pure/ycwcm/ColorTools.html | 2 +- .../colorful/pure/ycwcm/GradientTools.html | 76 +- .../colorful/pure/ycwcm/Palette.html | 2 +- .../pure/ycwcm/class-use/ColorTools.html | 2 +- .../pure/ycwcm/class-use/GradientTools.html | 2 +- .../pure/ycwcm/class-use/Palette.html | 2 +- .../colorful/pure/ycwcm/package-summary.html | 2 +- .../colorful/pure/ycwcm/package-tree.html | 2 +- .../colorful/pure/ycwcm/package-use.html | 2 +- .../apidocs/constant-values.html | 384 +- docs/colorful-pure/apidocs/help-doc.html | 2 +- docs/colorful-pure/apidocs/index-all.html | 944 +-- docs/colorful-pure/apidocs/index.html | 4 +- .../apidocs/member-search-index.js | 2 +- .../apidocs/overview-summary.html | 2 +- docs/colorful-pure/apidocs/overview-tree.html | 37 +- .../colorful/pure/FloatColors.html | 2 +- .../colorful/pure/Interpolation.Exp.html | 557 -- .../colorful/pure/Interpolation.ExpIn.html | 557 -- .../colorful/pure/Interpolation.ExpOut.html | 557 -- .../colorful/pure/Interpolation.Pow.html | 557 -- .../colorful/pure/Interpolation.PowIn.html | 557 -- .../colorful/pure/Interpolation.Swing.html | 557 -- .../colorful/pure/Interpolation.html | 557 -- ...icIn.html => Interpolations.BiasGain.html} | 902 +-- .../colorful/pure/Interpolations.Bounce.html | 565 ++ .../pure/Interpolations.BounceIn.html | 565 ++ ...Out.html => Interpolations.BounceOut.html} | 902 +-- ...ngOut.html => Interpolations.Elastic.html} | 902 +-- .../pure/Interpolations.ElasticIn.html | 565 ++ .../pure/Interpolations.ElasticOut.html | 565 ++ ...n.SwingIn.html => Interpolations.Exp.html} | 902 +-- ....PowOut.html => Interpolations.ExpIn.html} | 902 +-- .../colorful/pure/Interpolations.ExpOut.html | 565 ++ .../pure/Interpolations.Interpolation.html | 565 ++ ....BiasGain.html => Interpolations.Pow.html} | 902 +-- ....Bounce.html => Interpolations.PowIn.html} | 902 +-- .../colorful/pure/Interpolations.PowOut.html | 565 ++ .../colorful/pure/Interpolations.Swing.html | 565 ++ ...nceIn.html => Interpolations.SwingIn.html} | 902 +-- ...eOut.html => Interpolations.SwingOut.html} | 902 +-- ...ation.Elastic.html => Interpolations.html} | 902 +-- .../colorful/pure/MathTools.html | 2105 +++--- .../colorful/pure/cielab/ColorTools.html | 2775 ++++---- .../colorful/pure/cielab/GradientTools.html | 493 +- .../colorful/pure/hsluv/ColorTools.html | 1720 ++--- .../colorful/pure/hsluv/GradientTools.html | 477 +- .../colorful/pure/ipt/ColorTools.html | 2057 +++--- .../colorful/pure/ipt/GradientTools.html | 473 +- .../colorful/pure/ipt_hq/GradientTools.html | 493 +- .../colorful/pure/oklab/ColorTools.html | 2796 ++++---- .../colorful/pure/oklab/GradientTools.html | 493 +- .../colorful/pure/oklab/Palette.html | 1466 ++-- .../colorful/pure/oklab/SimplePalette.html | 1669 ++--- .../colorful/pure/rgb/ColorTools.html | 1021 +-- .../colorful/pure/rgb/GradientTools.html | 473 +- .../colorful/pure/rgb/SimplePalette.html | 180 +- .../colorful/pure/ycwcm/ColorTools.html | 2 +- .../colorful/pure/ycwcm/GradientTools.html | 473 +- .../apidocs/type-search-index.js | 2 +- docs/colorful/apidocs/allclasses-index.html | 7 +- docs/colorful/apidocs/allpackages-index.html | 2 +- .../tommyettinger/colorful/FloatColors.html | 2 +- .../tommyettinger/colorful/Shaders.html | 397 +- .../tommyettinger/colorful/TrigTools.html | 1806 +++-- .../colorful/cielab/ColorTools.html | 2 +- .../colorful/cielab/ColorfulBatch.html | 2 +- .../colorful/cielab/ColorfulSprite.html | 2 +- .../colorful/cielab/GradientTools.html | 2 +- .../colorful/cielab/Palette.html | 2 +- .../colorful/cielab/SimplePalette.html | 2 +- .../colorful/cielab/class-use/ColorTools.html | 2 +- .../cielab/class-use/ColorfulBatch.html | 2 +- .../cielab/class-use/ColorfulSprite.html | 2 +- .../cielab/class-use/GradientTools.html | 2 +- .../colorful/cielab/class-use/Palette.html | 2 +- .../cielab/class-use/SimplePalette.html | 2 +- .../colorful/cielab/package-summary.html | 2 +- .../colorful/cielab/package-tree.html | 2 +- .../colorful/cielab/package-use.html | 2 +- .../colorful/class-use/FloatColors.html | 2 +- .../colorful/class-use/Shaders.html | 2 +- .../colorful/class-use/TrigTools.html | 2 +- .../colorful/hsluv/ColorTools.html | 70 +- .../colorful/hsluv/ColorfulBatch.html | 2 +- .../colorful/hsluv/ColorfulSprite.html | 2 +- .../colorful/hsluv/GradientTools.html | 2 +- .../tommyettinger/colorful/hsluv/Palette.html | 2 +- .../colorful/hsluv/SimplePalette.html | 2 +- .../colorful/hsluv/class-use/ColorTools.html | 2 +- .../hsluv/class-use/ColorfulBatch.html | 2 +- .../hsluv/class-use/ColorfulSprite.html | 2 +- .../hsluv/class-use/GradientTools.html | 2 +- .../colorful/hsluv/class-use/Palette.html | 2 +- .../hsluv/class-use/SimplePalette.html | 2 +- .../colorful/hsluv/package-summary.html | 2 +- .../colorful/hsluv/package-tree.html | 2 +- .../colorful/hsluv/package-use.html | 2 +- .../colorful/ipt/ColorTools.html | 2 +- .../colorful/ipt/ColorfulBatch.html | 2 +- .../colorful/ipt/ColorfulSprite.html | 2 +- .../colorful/ipt/GradientTools.html | 2 +- .../tommyettinger/colorful/ipt/Palette.html | 2 +- .../colorful/ipt/class-use/ColorTools.html | 2 +- .../colorful/ipt/class-use/ColorfulBatch.html | 2 +- .../ipt/class-use/ColorfulSprite.html | 2 +- .../colorful/ipt/class-use/GradientTools.html | 2 +- .../colorful/ipt/class-use/Palette.html | 2 +- .../colorful/ipt/package-summary.html | 2 +- .../colorful/ipt/package-tree.html | 2 +- .../colorful/ipt/package-use.html | 2 +- .../colorful/ipt_hq/ColorTools.html | 2 +- .../colorful/ipt_hq/ColorfulBatch.html | 2 +- .../colorful/ipt_hq/ColorfulSprite.html | 2 +- .../colorful/ipt_hq/GradientTools.html | 2 +- .../colorful/ipt_hq/Palette.html | 2 +- .../colorful/ipt_hq/SimplePalette.html | 2 +- .../colorful/ipt_hq/class-use/ColorTools.html | 2 +- .../ipt_hq/class-use/ColorfulBatch.html | 2 +- .../ipt_hq/class-use/ColorfulSprite.html | 2 +- .../ipt_hq/class-use/GradientTools.html | 2 +- .../colorful/ipt_hq/class-use/Palette.html | 2 +- .../ipt_hq/class-use/SimplePalette.html | 2 +- .../colorful/ipt_hq/package-summary.html | 2 +- .../colorful/ipt_hq/package-tree.html | 2 +- .../colorful/ipt_hq/package-use.html | 2 +- .../colorful/oklab/ColorTools.html | 177 +- .../colorful/oklab/ColorfulBatch.html | 2 +- .../colorful/oklab/ColorfulSprite.html | 2 +- .../colorful/oklab/GradientTools.html | 2 +- .../tommyettinger/colorful/oklab/Palette.html | 1866 ++--- .../colorful/oklab/SimplePalette.html | 266 +- .../colorful/oklab/class-use/ColorTools.html | 2 +- .../oklab/class-use/ColorfulBatch.html | 2 +- .../oklab/class-use/ColorfulSprite.html | 2 +- .../oklab/class-use/GradientTools.html | 2 +- .../colorful/oklab/class-use/Palette.html | 2 +- .../oklab/class-use/SimplePalette.html | 2 +- .../colorful/oklab/package-summary.html | 2 +- .../colorful/oklab/package-tree.html | 2 +- .../colorful/oklab/package-use.html | 2 +- .../colorful/package-summary.html | 7 +- .../tommyettinger/colorful/package-tree.html | 2 +- .../tommyettinger/colorful/package-use.html | 2 +- .../colorful/rgb/ColorTools.html | 127 +- .../colorful/rgb/ColorfulBatch.html | 150 +- .../colorful/rgb/ColorfulSprite.html | 2 +- .../colorful/rgb/GradientTools.html | 2 +- .../tommyettinger/colorful/rgb/Palette.html | 2 +- .../colorful/rgb/SimplePalette.html | 6 +- .../colorful/rgb/class-use/ColorTools.html | 2 +- .../colorful/rgb/class-use/ColorfulBatch.html | 2 +- .../rgb/class-use/ColorfulSprite.html | 2 +- .../colorful/rgb/class-use/GradientTools.html | 2 +- .../colorful/rgb/class-use/Palette.html | 2 +- .../colorful/rgb/class-use/SimplePalette.html | 2 +- .../colorful/rgb/package-summary.html | 2 +- .../colorful/rgb/package-tree.html | 2 +- .../colorful/rgb/package-use.html | 2 +- .../colorful/ycwcm/ColorTools.html | 4 +- .../colorful/ycwcm/ColorfulBatch.html | 2 +- .../colorful/ycwcm/ColorfulSprite.html | 2 +- .../colorful/ycwcm/GradientTools.html | 2 +- .../tommyettinger/colorful/ycwcm/Palette.html | 6 +- .../colorful/ycwcm/class-use/ColorTools.html | 2 +- .../ycwcm/class-use/ColorfulBatch.html | 2 +- .../ycwcm/class-use/ColorfulSprite.html | 2 +- .../ycwcm/class-use/GradientTools.html | 2 +- .../colorful/ycwcm/class-use/Palette.html | 2 +- .../colorful/ycwcm/package-summary.html | 2 +- .../colorful/ycwcm/package-tree.html | 2 +- .../colorful/ycwcm/package-use.html | 2 +- docs/colorful/apidocs/constant-values.html | 525 +- docs/colorful/apidocs/help-doc.html | 2 +- docs/colorful/apidocs/index-all.html | 1023 +-- docs/colorful/apidocs/index.html | 4 +- docs/colorful/apidocs/member-search-index.js | 2 +- docs/colorful/apidocs/overview-summary.html | 2 +- docs/colorful/apidocs/overview-tree.html | 2 +- .../tommyettinger/colorful/FloatColors.html | 3 +- .../tommyettinger/colorful/Shaders.html | 3278 ++++----- .../tommyettinger/colorful/TrigTools.html | 2223 +++--- .../colorful/cielab/ColorTools.html | 32 +- .../colorful/hsluv/ColorTools.html | 1724 ++--- .../colorful/ipt/ColorTools.html | 4 +- .../colorful/oklab/ColorTools.html | 2660 +++---- .../tommyettinger/colorful/oklab/Palette.html | 6289 +++++++++-------- .../colorful/oklab/SimplePalette.html | 292 +- .../colorful/rgb/ColorTools.html | 1078 +-- .../colorful/rgb/ColorfulBatch.html | 2419 +++---- .../colorful/rgb/SimplePalette.html | 208 +- .../colorful/ycwcm/ColorTools.html | 2 +- .../tommyettinger/colorful/ycwcm/Palette.html | 2 +- gradle.properties | 6 +- 305 files changed, 36493 insertions(+), 33918 deletions(-) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.BiasGain.html => Interpolations.BiasGain.html} (65%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.Bounce.html => Interpolations.Bounce.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.BounceIn.html => Interpolations.BounceIn.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.BounceOut.html => Interpolations.BounceOut.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.Elastic.html => Interpolations.Elastic.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.ElasticOut.html => Interpolations.ElasticIn.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.ElasticIn.html => Interpolations.ElasticOut.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.Exp.html => Interpolations.Exp.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.ExpIn.html => Interpolations.ExpIn.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.ExpOut.html => Interpolations.ExpOut.html} (58%) create mode 100644 docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Interpolation.html rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.Pow.html => Interpolations.Pow.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.PowIn.html => Interpolations.PowIn.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.PowOut.html => Interpolations.PowOut.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.Swing.html => Interpolations.Swing.html} (59%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.SwingIn.html => Interpolations.SwingIn.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.SwingOut.html => Interpolations.SwingOut.html} (58%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/{Interpolation.html => Interpolations.html} (58%) create mode 100644 docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolations.BiasGain.html rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.SwingIn.html => Interpolations.Bounce.html} (80%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.ElasticIn.html => Interpolations.BounceIn.html} (80%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.BounceOut.html => Interpolations.BounceOut.html} (74%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.Elastic.html => Interpolations.Elastic.html} (74%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.ElasticOut.html => Interpolations.ElasticIn.html} (80%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.BounceIn.html => Interpolations.ElasticOut.html} (77%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.Exp.html => Interpolations.Exp.html} (73%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.ExpOut.html => Interpolations.ExpIn.html} (78%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.ExpIn.html => Interpolations.ExpOut.html} (75%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.html => Interpolations.Interpolation.html} (61%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.Pow.html => Interpolations.Pow.html} (70%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.PowOut.html => Interpolations.PowIn.html} (69%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.PowIn.html => Interpolations.PowOut.html} (67%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.Bounce.html => Interpolations.Swing.html} (81%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.SwingOut.html => Interpolations.SwingIn.html} (80%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.Swing.html => Interpolations.SwingOut.html} (78%) rename docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/{Interpolation.BiasGain.html => Interpolations.html} (88%) delete mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Exp.html delete mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpIn.html delete mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpOut.html delete mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Pow.html delete mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.PowIn.html delete mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Swing.html delete mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.html rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.ElasticIn.html => Interpolations.BiasGain.html} (79%) create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Bounce.html create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BounceIn.html rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.ElasticOut.html => Interpolations.BounceOut.html} (79%) rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.SwingOut.html => Interpolations.Elastic.html} (79%) create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticIn.html create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticOut.html rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.SwingIn.html => Interpolations.Exp.html} (79%) rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.PowOut.html => Interpolations.ExpIn.html} (79%) create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ExpOut.html create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Interpolation.html rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.BiasGain.html => Interpolations.Pow.html} (79%) rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.Bounce.html => Interpolations.PowIn.html} (79%) create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.PowOut.html create mode 100644 docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Swing.html rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.BounceIn.html => Interpolations.SwingIn.html} (79%) rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.BounceOut.html => Interpolations.SwingOut.html} (79%) rename docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/{Interpolation.Elastic.html => Interpolations.html} (79%) diff --git a/README.md b/README.md index adcaee37..d4aab9d6 100644 --- a/README.md +++ b/README.md @@ -344,14 +344,16 @@ has been fixed since 0.6.0 , and shouldn't affect code using the current version Using the Maven Central dependency is recommended, and Gradle and Maven can both depend on this library using that repository. +To depend on colorful, which is the main way to use the library and uses libGDX, use: + Gradle dependency (`implementation` should be changed to `api` if any other dependencies use `api`): ```groovy -implementation 'com.github.tommyettinger:colorful:0.8.2' +implementation 'com.github.tommyettinger:colorful:0.8.3' ``` Gradle dependency if also using GWT to make an HTML application: ```groovy -implementation 'com.github.tommyettinger:colorful:0.8.2:sources' +implementation 'com.github.tommyettinger:colorful:0.8.3:sources' ``` And also for GWT, in your application's `.gwt.xml` file (usually `GdxDefinition.gwt.xml`) @@ -364,24 +366,24 @@ If you don't use Gradle, here's the Maven dependency: com.github.tommyettinger colorful - 0.8.2 + 0.8.3 ``` -Using colorful-pure is similar: +Using colorful-pure is similar; note that **Most Client-Side Applications Do Not Need These Following Steps**. Gradle dependency (`implementation` should be changed to `api` if any other dependencies use `api`): ```groovy -implementation 'com.github.tommyettinger:colorful-pure:0.8.2' +implementation 'com.github.tommyettinger:colorful-pure:0.8.3' ``` Gradle dependency if also using GWT to make an HTML application: ```groovy implementation 'com.github.tommyettinger:funderby:0.0.1:sources' -implementation 'com.github.tommyettinger:digital:0.1.0:sources' -implementation 'com.github.tommyettinger:juniper:0.1.2:sources' +implementation 'com.github.tommyettinger:digital:0.1.4:sources' +implementation 'com.github.tommyettinger:juniper:0.1.6:sources' implementation 'com.github.tommyettinger:jdkgdxds:1.0.4:sources' -implementation 'com.github.tommyettinger:colorful-pure:0.8.2:sources' +implementation 'com.github.tommyettinger:colorful-pure:0.8.3:sources' ``` And also for GWT, in your application's `.gwt.xml` file (usually `GdxDefinition.gwt.xml`) @@ -398,7 +400,7 @@ If you don't use Gradle, here's the Maven dependency (GWT dependencies should be com.github.tommyettinger colorful-pure - 0.8.2 + 0.8.3 ``` diff --git a/build.gradle b/build.gradle index 69c912a8..f970d2b1 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { gradlePluginPortal() } dependencies { - classpath 'com.vanniktech:gradle-maven-publish-plugin:0.21.0' + classpath 'com.vanniktech:gradle-maven-publish-plugin:0.22.0' } } diff --git a/docs/colorful-pure/apidocs/allclasses-index.html b/docs/colorful-pure/apidocs/allclasses-index.html index 6f3ee3f1..1fdcfe15 100644 --- a/docs/colorful-pure/apidocs/allclasses-index.html +++ b/docs/colorful-pure/apidocs/allclasses-index.html @@ -2,7 +2,7 @@ -All Classes and Interfaces (colorful-pure 0.8.2 API) +All Classes and Interfaces (colorful-pure 0.8.3 API) @@ -115,98 +115,100 @@

All Classes and Interfaces<
Static methods for handling gradients of smoothly-changing colors, typically inside of FloatLists.
- +
Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
- +
A wrapper around MathTools.barronSpline(float, float, float) to use it as an Interpolation.
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- +
 
- -
+ +
 
+ +
Some alternative approximations to sin(), cos(), asin(), acos(), atan(), and atan2(), including the option to measure most values in turns instead of radians (where 1 turn equals 2pi radians).
- -
+ +
A palette of predefined colors as packed IPT floats, the kind ColorTools works with.
- -
+ +
A palette of predefined colors as packed HSLuv floats, the kind ColorTools works with.
- -
+ +
A palette of predefined colors as packed IPT floats, the kind ColorTools works with.
- -
+ +
A palette of predefined colors as packed IPT floats, the kind ColorTools works with.
- -
+ +
A palette of predefined colors as packed IPT floats, the kind ColorTools works with.
- -
+ +
A palette of predefined colors as packed RGB(A) floats, the kind ColorTools works with.
- -
+ +
A palette of predefined colors as packed YCwCm floats, the kind FloatColors works with.
- -
+ +
A palette of predefined colors as packed CIELAB floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments.
- -
+ +
A palette of predefined colors as packed HSLuv floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments.
- -
+ +
A palette of predefined colors as packed IPT floats, the kind ColorTools works with.
- -
+ +
A palette of predefined colors as packed Oklab floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments.
- -
+ +
A palette of predefined colors as packed RGB floats, the kind ColorTools works with, plus a way to describe colors by combinations and adjustments.
diff --git a/docs/colorful-pure/apidocs/allpackages-index.html b/docs/colorful-pure/apidocs/allpackages-index.html index 00ce04cc..143806a4 100644 --- a/docs/colorful-pure/apidocs/allpackages-index.html +++ b/docs/colorful-pure/apidocs/allpackages-index.html @@ -2,7 +2,7 @@ -All Packages (colorful-pure 0.8.2 API) +All Packages (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html index 3691df44..94465ba1 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/FloatColors.html @@ -2,7 +2,7 @@ -FloatColors (colorful-pure 0.8.2 API) +FloatColors (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BiasGain.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BiasGain.html similarity index 65% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BiasGain.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BiasGain.html index d0f9b2f8..f83678c0 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BiasGain.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BiasGain.html @@ -2,10 +2,10 @@ -Interpolation.BiasGain (colorful-pure 0.8.2 API) +Interpolations.BiasGain (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,7 +44,7 @@
    - @@ -160,8 +148,8 @@

    Method Summary

    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -179,7 +167,7 @@

    Field Details

  • shape

    -
    public final float shape
    +
    public final float shape
    The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the values ease into their starting and ending levels), or to be the inverse when less than 1 (where values start like square root does, taking off very quickly, but also end like square does, landing abruptly at @@ -189,7 +177,7 @@

    shape

  • turning

    -
    public final float turning
    +
    public final float turning
    A value between 0.0 and 1.0, inclusive, where the shape changes.
  • @@ -204,7 +192,7 @@

    Constructor Details

  • BiasGain

    -
    public BiasGain(float shape, +
    public BiasGain(float shape, float turning)
  • @@ -219,10 +207,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Specified by:
    -
    apply in class Interpolation
    +
    apply in class Interpolations.Interpolation
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Bounce.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Bounce.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Bounce.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Bounce.html index 15d1bd34..cb2d176c 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Bounce.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Bounce.html @@ -2,10 +2,10 @@ -Interpolation.Bounce (colorful-pure 0.8.2 API) +Interpolations.Bounce (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,44 +69,26 @@
    -

    Class Interpolation.Bounce

    +

    Class Interpolations.Bounce

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.BounceOut -
    com.github.tommyettinger.colorful.pure.Interpolation.Bounce
    +
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.Bounce -extends Interpolation.BounceOut
    +
    public static class Interpolations.Bounce +extends Interpolations.BounceOut
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -160,14 +142,14 @@

    Constructor Details

  • Bounce

    -
    public Bounce(float[] widths, +
    public Bounce(float[] widths, float[] heights)
  • Bounce

    -
    public Bounce(int bounces)
    +
    public Bounce(int bounces)
  • @@ -181,10 +163,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Overrides:
    -
    apply in class Interpolation.BounceOut
    +
    apply in class Interpolations.BounceOut
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BounceIn.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BounceIn.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BounceIn.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BounceIn.html index 092ec8b8..47a9d1af 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BounceIn.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BounceIn.html @@ -2,10 +2,10 @@ -Interpolation.BounceIn (colorful-pure 0.8.2 API) +Interpolations.BounceIn (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,44 +69,26 @@
    -

    Class Interpolation.BounceIn

    +

    Class Interpolations.BounceIn

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.BounceOut -
    com.github.tommyettinger.colorful.pure.Interpolation.BounceIn
    +
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.BounceIn -extends Interpolation.BounceOut
    +
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -160,14 +142,14 @@

    Constructor Details

  • BounceIn

    -
    public BounceIn(float[] widths, +
    public BounceIn(float[] widths, float[] heights)
  • BounceIn

    -
    public BounceIn(int bounces)
    +
    public BounceIn(int bounces)
  • @@ -181,10 +163,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Overrides:
    -
    apply in class Interpolation.BounceOut
    +
    apply in class Interpolations.BounceOut
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BounceOut.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BounceOut.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BounceOut.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BounceOut.html index 7569245d..1ef8def0 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.BounceOut.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.BounceOut.html @@ -2,10 +2,10 @@ -Interpolation.BounceOut (colorful-pure 0.8.2 API) +Interpolations.BounceOut (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,46 +69,28 @@
    -

    Class Interpolation.BounceOut

    +

    Class Interpolations.BounceOut

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.BounceOut
    +
    com.github.tommyettinger.colorful.pure.Interpolations.Interpolation +
    com.github.tommyettinger.colorful.pure.Interpolations.BounceOut
    Direct Known Subclasses:
    -
    Interpolation.Bounce, Interpolation.BounceIn
    +
    Interpolations.Bounce, Interpolations.BounceIn
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.BounceOut -extends Interpolation
    +
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply
  • Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -162,14 +144,14 @@

    Constructor Details

  • BounceOut

    -
    public BounceOut(float[] widths, +
    public BounceOut(float[] widths, float[] heights)
  • BounceOut

    -
    public BounceOut(int bounces)
    +
    public BounceOut(int bounces)
  • @@ -183,10 +165,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Specified by:
    -
    apply in class Interpolation
    +
    apply in class Interpolations.Interpolation
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Elastic.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Elastic.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Elastic.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Elastic.html index cacb6c4c..9b847199 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Elastic.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Elastic.html @@ -2,10 +2,10 @@ -Interpolation.Elastic (colorful-pure 0.8.2 API) +Interpolations.Elastic (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,46 +69,28 @@
    -

    Class Interpolation.Elastic

    +

    Class Interpolations.Elastic

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.Elastic
    +
    com.github.tommyettinger.colorful.pure.Interpolations.Interpolation +
    com.github.tommyettinger.colorful.pure.Interpolations.Elastic
    Direct Known Subclasses:
    -
    Interpolation.ElasticIn, Interpolation.ElasticOut
    +
    Interpolations.ElasticIn, Interpolations.ElasticOut
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.Elastic -extends Interpolation
    +
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply
  • Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -162,7 +144,7 @@

    Constructor Details

  • Elastic

    -
    public Elastic(float value, +
    public Elastic(float value, float power, int bounces, float scale)
    @@ -179,10 +161,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Specified by:
    -
    apply in class Interpolation
    +
    apply in class Interpolations.Interpolation
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.ElasticOut.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.ElasticIn.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.ElasticOut.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.ElasticIn.html index bc2621b4..63489c91 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.ElasticOut.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.ElasticIn.html @@ -2,10 +2,10 @@ -Interpolation.ElasticOut (colorful-pure 0.8.2 API) +Interpolations.ElasticIn (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,44 +69,26 @@
    -

    Class Interpolation.ElasticOut

    +

    Class Interpolations.ElasticIn

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.Elastic -
    com.github.tommyettinger.colorful.pure.Interpolation.ElasticOut
    +
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.ElasticOut -extends Interpolation.Elastic
    +

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -159,8 +141,8 @@

    Constructor Details

    @@ -173,10 +155,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Specified by:
    -
    apply in class Interpolation
    +
    apply in class Interpolations.Interpolation
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.PowIn.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.PowIn.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.PowIn.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.PowIn.html index edd193c7..baf94103 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.PowIn.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.PowIn.html @@ -2,10 +2,10 @@ -Interpolation.PowIn (colorful-pure 0.8.2 API) +Interpolations.PowIn (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,44 +69,26 @@
    -

    Class Interpolation.PowIn

    +

    Class Interpolations.PowIn

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.Pow -
    com.github.tommyettinger.colorful.pure.Interpolation.PowIn
    +
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.PowIn -extends Interpolation.Pow
    +
    public static class Interpolations.PowIn +extends Interpolations.Pow
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -157,7 +139,7 @@

    Constructor Details

  • PowIn

    -
    public PowIn(int power)
    +
    public PowIn(int power)
  • @@ -171,10 +153,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Overrides:
    -
    apply in class Interpolation.Pow
    +
    apply in class Interpolations.Pow
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.PowOut.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.PowOut.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.PowOut.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.PowOut.html index 9387ae82..2f79c5d9 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.PowOut.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.PowOut.html @@ -2,10 +2,10 @@ -Interpolation.PowOut (colorful-pure 0.8.2 API) +Interpolations.PowOut (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,44 +69,26 @@
    -

    Class Interpolation.PowOut

    +

    Class Interpolations.PowOut

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.Pow -
    com.github.tommyettinger.colorful.pure.Interpolation.PowOut
    +
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.PowOut -extends Interpolation.Pow
    +
    public static class Interpolations.PowOut +extends Interpolations.Pow
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -157,7 +139,7 @@

    Constructor Details

  • PowOut

    -
    public PowOut(int power)
    +
    public PowOut(int power)
  • @@ -171,10 +153,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Overrides:
    -
    apply in class Interpolation.Pow
    +
    apply in class Interpolations.Pow
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Swing.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Swing.html similarity index 59% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Swing.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Swing.html index 29ac0508..397d0643 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.Swing.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.Swing.html @@ -2,10 +2,10 @@ -Interpolation.Swing (colorful-pure 0.8.2 API) +Interpolations.Swing (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,42 +69,24 @@
    -

    Class Interpolation.Swing

    +

    Class Interpolations.Swing

    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply
  • Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -155,7 +137,7 @@

    Constructor Details

  • Swing

    -
    public Swing(float scale)
    +
    public Swing(float scale)
  • @@ -169,10 +151,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Specified by:
    -
    apply in class Interpolation
    +
    apply in class Interpolations.Interpolation
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.SwingIn.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.SwingIn.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.SwingIn.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.SwingIn.html index 0e0d8601..a10feac7 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.SwingIn.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.SwingIn.html @@ -2,10 +2,10 @@ -Interpolation.SwingIn (colorful-pure 0.8.2 API) +Interpolations.SwingIn (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,42 +69,24 @@
    -

    Class Interpolation.SwingIn

    +

    Class Interpolations.SwingIn

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.SwingIn
    +
    com.github.tommyettinger.colorful.pure.Interpolations.Interpolation +
    com.github.tommyettinger.colorful.pure.Interpolations.SwingIn
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.SwingIn -extends Interpolation
    +
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply
  • Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -155,7 +137,7 @@

    Constructor Details

  • SwingIn

    -
    public SwingIn(float scale)
    +
    public SwingIn(float scale)
  • @@ -169,10 +151,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Specified by:
    -
    apply in class Interpolation
    +
    apply in class Interpolations.Interpolation
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.SwingOut.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.SwingOut.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.SwingOut.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.SwingOut.html index d190c3d2..9a739fea 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.SwingOut.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.SwingOut.html @@ -2,10 +2,10 @@ -Interpolation.SwingOut (colorful-pure 0.8.2 API) +Interpolations.SwingOut (colorful-pure 0.8.3 API) - + @@ -34,7 +34,7 @@
  • Overview
  • Package
  • -
  • Use
  • +
  • Use
  • Tree
  • Index
  • Help
  • @@ -44,8 +44,8 @@
    @@ -69,42 +69,24 @@
    -

    Class Interpolation.SwingOut

    +

    Class Interpolations.SwingOut

    java.lang.Object -
    com.github.tommyettinger.colorful.pure.Interpolation -
    com.github.tommyettinger.colorful.pure.Interpolation.SwingOut
    +
    com.github.tommyettinger.colorful.pure.Interpolations.Interpolation +
    com.github.tommyettinger.colorful.pure.Interpolations.SwingOut
    Enclosing class:
    -
    Interpolation
    +
    Interpolations

    -
    public static class Interpolation.SwingOut -extends Interpolation
    +
    -

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolation

    -apply
    +

    Methods inherited from class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation

    +apply
  • Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -155,7 +137,7 @@

    Constructor Details

  • SwingOut

    -
    public SwingOut(float scale)
    +
    public SwingOut(float scale)
  • @@ -169,10 +151,10 @@

    Method Details

  • apply

    -
    public float apply(float a)
    +
    public float apply(float a)
    Specified by:
    -
    apply in class Interpolation
    +
    apply in class Interpolations.Interpolation
    Parameters:
    a - Alpha value between 0 and 1.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.html similarity index 58% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.html index 94059e27..a463d2e1 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolation.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/Interpolations.html @@ -2,10 +2,10 @@ -Interpolation (colorful-pure 0.8.2 API) +Interpolations (colorful-pure 0.8.3 API) - + @@ -15,11 +15,7 @@ -
  • @@ -312,7 +307,7 @@

    Constructor Summary

    Constructor
    Description
    - +
     
    @@ -321,24 +316,6 @@

    Constructor Summary

  • Method Summary

    -
    -
    -
    -
    -
    Modifier and Type
    -
    Method
    -
    Description
    -
    abstract float
    -
    apply(float a)
    -
     
    -
    float
    -
    apply(float start, - float end, - float a)
    -
     
    -
    -
    -

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    @@ -356,269 +333,269 @@

    Field Details

  • linear

    -
    public static final Interpolation linear
    +
    public static final Interpolations.Interpolation linear
  • smooth

    -
    public static final Interpolation smooth
    +
    public static final Interpolations.Interpolation smooth
    Aka "smoothstep".
  • smooth2

    -
    public static final Interpolation smooth2
    +
  • smoother

    -
    public static final Interpolation smoother
    +
    By Ken Perlin.
  • fade

    -
    public static final Interpolation fade
    +
    public static final Interpolations.Interpolation fade
  • pow2

    -
    public static final Interpolation.Pow pow2
    +
    public static final Interpolations.Pow pow2
  • pow2In

    -
    public static final Interpolation.PowIn pow2In
    +
    public static final Interpolations.PowIn pow2In
    Slow, then fast.
  • slowFast

    -
    public static final Interpolation.PowIn slowFast
    +
    public static final Interpolations.PowIn slowFast
  • pow2Out

    -
    public static final Interpolation.PowOut pow2Out
    +
    public static final Interpolations.PowOut pow2Out
    Fast, then slow.
  • fastSlow

    -
    public static final Interpolation.PowOut fastSlow
    +
    public static final Interpolations.PowOut fastSlow
  • pow2InInverse

    -
    public static final Interpolation pow2InInverse
    +
  • pow2OutInverse

    -
    public static final Interpolation pow2OutInverse
    +
  • pow3

    -
    public static final Interpolation.Pow pow3
    +
    public static final Interpolations.Pow pow3
  • pow3In

    -
    public static final Interpolation.PowIn pow3In
    +
    public static final Interpolations.PowIn pow3In
  • pow3Out

    -
    public static final Interpolation.PowOut pow3Out
    +
    public static final Interpolations.PowOut pow3Out
  • pow3InInverse

    -
    public static final Interpolation pow3InInverse
    +
  • pow3OutInverse

    -
    public static final Interpolation pow3OutInverse
    +
  • pow4

    -
    public static final Interpolation.Pow pow4
    +
    public static final Interpolations.Pow pow4
  • pow4In

    -
    public static final Interpolation.PowIn pow4In
    +
    public static final Interpolations.PowIn pow4In
  • pow4Out

    -
    public static final Interpolation.PowOut pow4Out
    +
    public static final Interpolations.PowOut pow4Out
  • pow5

    -
    public static final Interpolation.Pow pow5
    +
    public static final Interpolations.Pow pow5
  • pow5In

    -
    public static final Interpolation.PowIn pow5In
    +
    public static final Interpolations.PowIn pow5In
  • pow5Out

    -
    public static final Interpolation.PowOut pow5Out
    +
    public static final Interpolations.PowOut pow5Out
  • sine

    -
    public static final Interpolation sine
    +
    public static final Interpolations.Interpolation sine
  • sineIn

    -
    public static final Interpolation sineIn
    +
    public static final Interpolations.Interpolation sineIn
  • sineOut

    -
    public static final Interpolation sineOut
    +
  • exp10

    -
    public static final Interpolation.Exp exp10
    +
    public static final Interpolations.Exp exp10
  • exp10In

    -
    public static final Interpolation.ExpIn exp10In
    +
    public static final Interpolations.ExpIn exp10In
  • exp10Out

    -
    public static final Interpolation.ExpOut exp10Out
    +
    public static final Interpolations.ExpOut exp10Out
  • exp5

    -
    public static final Interpolation.Exp exp5
    +
    public static final Interpolations.Exp exp5
  • exp5In

    -
    public static final Interpolation.ExpIn exp5In
    +
    public static final Interpolations.ExpIn exp5In
  • exp5Out

    -
    public static final Interpolation.ExpOut exp5Out
    +
    public static final Interpolations.ExpOut exp5Out
  • circle

    -
    public static final Interpolation circle
    +
    public static final Interpolations.Interpolation circle
  • circleIn

    -
    public static final Interpolation circleIn
    +
  • circleOut

    -
    public static final Interpolation circleOut
    +
  • elastic

    -
    public static final Interpolation.Elastic elastic
    +
    public static final Interpolations.Elastic elastic
  • elasticIn

    -
    public static final Interpolation.ElasticIn elasticIn
    +
    public static final Interpolations.ElasticIn elasticIn
  • elasticOut

    -
    public static final Interpolation.ElasticOut elasticOut
    +
  • swing

    -
    public static final Interpolation.Swing swing
    +
    public static final Interpolations.Swing swing
  • swingIn

    -
    public static final Interpolation.SwingIn swingIn
    +
    public static final Interpolations.SwingIn swingIn
  • swingOut

    -
    public static final Interpolation.SwingOut swingOut
    +
    public static final Interpolations.SwingOut swingOut
  • bounce

    -
    public static final Interpolation.Bounce bounce
    +
    public static final Interpolations.Bounce bounce
  • bounceIn

    -
    public static final Interpolation.BounceIn bounceIn
    +
    public static final Interpolations.BounceIn bounceIn
  • bounceOut

    -
    public static final Interpolation.BounceOut bounceOut
    +
    public static final Interpolations.BounceOut bounceOut
  • @@ -631,38 +608,8 @@

    Constructor Details

    -
    -
  • - -
  • -
    -

    Method Details

    -
      -
    • -
      -

      apply

      -
      public abstract float apply(float a)
      -
      -
      Parameters:
      -
      a - Alpha value between 0 and 1.
      -
      -
      -
    • -
    • -
      -

      apply

      -
      public float apply(float start, - float end, - float a)
      -
      -
      Parameters:
      -
      a - Alpha value between 0 and 1.
      -
      +

      Interpolations

      +
      public Interpolations()
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html index 51dce046..8266c1d6 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/MathTools.html @@ -2,7 +2,7 @@ -MathTools (colorful-pure 0.8.2 API) +MathTools (colorful-pure 0.8.3 API) @@ -76,7 +76,7 @@

    Class MathTools


  • -
    public class MathTools +
    public class MathTools extends Object
    Some alternative approximations to sin(), cos(), asin(), acos(), atan(), and atan2(), including the option to measure most values in turns instead of radians (where 1 turn equals 2pi radians). The convention here is to have methods @@ -86,6 +86,10 @@

    Class MathTools

    measure turns in degrees, either from -180 to 180 for atan2Degrees(float, float) or from 0 to 360 for atan2Degrees360(float, float). Also has lerp(float, float, float), why not.
    + New code should use TrigTools for trigonometric methods instead; it has + sinTurns() instead of sin_(), and other naming has similar changes, but should be faster and more precise. The other + methods have parallels in MathTools. +
    Created by Tommy Ettinger on 8/6/2019.
    @@ -362,7 +366,7 @@

    Constructor Details

  • MathTools

    -
    public MathTools()
    +
    public MathTools()
  • @@ -376,7 +380,7 @@

    Method Details

  • sin

    -
    public static double sin(double radians)
    +
    public static double sin(double radians)
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a @@ -409,7 +413,7 @@

    sin

  • cos

    -
    public static double cos(double radians)
    +
    public static double cos(double radians)
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a @@ -442,7 +446,7 @@

    cos

  • sin

    -
    public static float sin(float radians)
    +
    public static float sin(float radians)
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a @@ -475,7 +479,7 @@

    sin

  • cos

    -
    public static float cos(float radians)
    +
    public static float cos(float radians)
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should consider its more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a @@ -508,7 +512,7 @@

    cos

  • sinDegrees

    -
    public static float sinDegrees(float degrees)
    +
    public static float sinDegrees(float degrees)
    A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method. Because this method doesn't rely on a @@ -543,7 +547,7 @@

    sinDegrees

  • cosDegrees

    -
    public static float cosDegrees(float degrees)
    +
    public static float cosDegrees(float degrees)
    A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.cosDeg() method. Because this method doesn't rely on a @@ -578,7 +582,7 @@

    cosDegrees

  • sin_

    -
    public static double sin_(double turns)
    +
    public static double sin_(double turns)
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide @@ -608,7 +612,7 @@

    sin_

  • cos_

    -
    public static double cos_(double turns)
    +
    public static double cos_(double turns)
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide @@ -638,7 +642,7 @@

    cos_

  • sin_

    -
    public static float sin_(float turns)
    +
    public static float sin_(float turns)
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to @@ -669,7 +673,7 @@

    sin_

  • cos_

    -
    public static float cos_(float turns)
    +
    public static float cos_(float turns)
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal @@ -700,7 +704,7 @@

    cos_

  • atan

    -
    public static double atan(double i)
    +
    public static double atan(double i)
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the second-fastest and second-least precise). This method is usually much faster than Math.atan(double), @@ -716,7 +720,7 @@

    atan

  • atan

    -
    public static float atan(float i)
    +
    public static float atan(float i)
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the second-fastest and second-least precise). This method is usually much faster than Math.atan(double), @@ -732,7 +736,7 @@

    atan

  • atan2

    -
    public static double atan2(double y, +
    public static double atan2(double y, double x)
    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 approximation. Maximum error is below 0.00009 radians. @@ -762,7 +766,7 @@

    atan2

  • atan2

    -
    public static float atan2(float y, +
    public static float atan2(float y, float x)
    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 approximation. Maximum error is below 0.00009 radians. @@ -792,7 +796,7 @@

    atan2

  • atan2_

    -
    public static double atan2_(double y, +
    public static double atan2_(double y, double x)
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as doubles and returning an angle measured in turns from 0.0 to 1.0 (inclusive), with one cycle over the range @@ -821,7 +825,7 @@

    atan2_

  • atan2_

    -
    public static float atan2_(float y, +
    public static float atan2_(float y, float x)
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as floats and returning an angle measured in turns from 0.0f to 1.0f, with one cycle over the range equivalent to 360 @@ -850,7 +854,7 @@

    atan2_

  • atanDegrees

    -
    public static double atanDegrees(double i)
    +
    public static double atanDegrees(double i)
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the second-fastest and second-least precise). This method is usually much faster than Math.atan(double), @@ -867,7 +871,7 @@

    atanDegrees

  • atanDegrees

    -
    public static float atanDegrees(float i)
    +
    public static float atanDegrees(float i)
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the second-fastest and second-least precise). This method is usually much faster than Math.atan(double), @@ -884,7 +888,7 @@

    atanDegrees

  • atan2Degrees

    -
    public static double atan2Degrees(double y, +
    public static double atan2Degrees(double y, double x)
    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision than libGDX's atan2 approximation. The range for this is -180 to 180. @@ -913,7 +917,7 @@

    atan2Degrees

  • atan2Degrees

    -
    public static float atan2Degrees(float y, +
    public static float atan2Degrees(float y, float x)
    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision than libGDX's atan2 approximation. The range for this is -180 to 180. @@ -942,7 +946,7 @@

    atan2Degrees

  • atan2Degrees360

    -
    public static double atan2Degrees360(double y, +
    public static double atan2Degrees360(double y, double x)
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as doubles and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range @@ -969,7 +973,7 @@

    atan2Degrees360

  • atan2Degrees360

    -
    public static float atan2Degrees360(float y, +
    public static float atan2Degrees360(float y, float x)
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as floats and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range @@ -996,7 +1000,7 @@

    atan2Degrees360

  • asin

    -
    public static float asin(float x)
    +
    public static float asin(float x)
    Arc sine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest and least precise). This method is usually much faster than Math.asin(double), but is somewhat less @@ -1012,7 +1016,7 @@

    asin

  • acos

    -
    public static float acos(float x)
    +
    public static float acos(float x)
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest and least precise). This method is usually much faster than Math.acos(double), but is somewhat less @@ -1030,7 +1034,7 @@

    acos

  • asin

    -
    public static double asin(double x)
    +
    public static double asin(double x)
    Arc sine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest and least precise). This method is usually much faster than Math.asin(double), but is somewhat less @@ -1049,7 +1053,7 @@

    asin

  • acos

    -
    public static double acos(double x)
    +
    public static double acos(double x)
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest and least precise). This method is usually much faster than Math.acos(double), but is somewhat less @@ -1068,7 +1072,7 @@

    acos

  • asin_

    -
    public static double asin_(double x)
    +
    public static double asin_(double x)
    Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this range from 0.75 (inclusive) to 1.0 (exclusive), and continuing past that to 0.0 (inclusive) to 0.25 (inclusive).
    @@ -1084,7 +1088,7 @@

    asin_

  • acos_

    -
    public static double acos_(double x)
    +
    public static double acos_(double x)
    Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this range from 0.0 (inclusive) to 0.5 (inclusive).
    @@ -1100,7 +1104,7 @@

    acos_

  • asin_

    -
    public static float asin_(float x)
    +
    public static float asin_(float x)
    Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this range from 0.75f (inclusive) to 1.0f (exclusive), and continuing past that to 0.0f (inclusive) to 0.25f (inclusive). @@ -1117,7 +1121,7 @@

    asin_

  • acos_

    -
    public static float acos_(float x)
    +
    public static float acos_(float x)
    Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this range from 0.0f (inclusive) to 0.5f (inclusive).
    @@ -1133,7 +1137,7 @@

    acos_

  • lerp

    -
    public static float lerp(float fromValue, +
    public static float lerp(float fromValue, float toValue, float progress)
    Linearly interpolates between fromValue to toValue on progress position.
    @@ -1148,7 +1152,7 @@

    lerp

  • norm

    -
    public static float norm(float rangeStart, +
    public static float norm(float rangeStart, float rangeEnd, float value)
    Linearly normalizes value from a range. Range must not be empty. This is the inverse of @@ -1166,7 +1170,7 @@

    norm

  • floor

    -
    public static int floor(float value)
    +
    public static int floor(float value)
    Returns the largest integer less than or equal to the specified float. This method will only properly floor floats from -16384 to Float.MAX_VALUE - 16384.
    @@ -1180,7 +1184,7 @@

    floor

  • barronSpline

    -
    public static float barronSpline(float x, +
    public static float barronSpline(float x, float shape, float turning)
    A generalization on bias and gain functions that can represent both; this version is branch-less. diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html index 1dd08f0c..416fca62 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html @@ -2,7 +2,7 @@ -ColorTools (colorful-pure 0.8.2 API) +ColorTools (colorful-pure 0.8.3 API) @@ -76,7 +76,7 @@

    Class ColorTools


    -
    public class ColorTools +
    public class ColorTools extends Object
    Contains code for manipulating colors as int and packed float values in the CIE L*A*B* color space. This is the old standard (and for some things, gold standard) of color spaces, introduced in 1976 and never fully @@ -507,7 +507,7 @@

    Constructor Details

  • ColorTools

    -
    public ColorTools()
    +
    public ColorTools()
  • @@ -521,7 +521,7 @@

    Method Details

  • cielab

    -
    public static float cielab(float l, +
    public static float cielab(float l, float a, float b, float alpha)
    @@ -547,7 +547,7 @@

    cielab

  • clamp

    -
    public static float clamp(float l, +
    public static float clamp(float l, float a, float b, float alpha)
    @@ -576,7 +576,7 @@

    clamp

  • toRGBA8888

    -
    public static int toRGBA8888(float packed)
    +
    public static int toRGBA8888(float packed)
    Converts a packed float color in the format produced by cielab(float, float, float, float) to an RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
    @@ -590,7 +590,7 @@

    toRGBA8888

  • toRGBA

    -
    public static float toRGBA(float packed)
    +
    public static float toRGBA(float packed)
    Converts a packed float color in the format produced by cielab(float, float, float, float) to a packed float in ABGR8888 format. This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    @@ -605,7 +605,7 @@

    toRGBA

  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    +
    public static float fromRGBA8888(int rgba)
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the CIELAB format this uses.
    Parameters:
    @@ -618,7 +618,7 @@

    fromRGBA8888

  • fromRGBA

    -
    public static float fromRGBA(float packed)
    +
    public static float fromRGBA(float packed)
    Takes a color encoded as an ABGR packed float and converts to a packed float in the CIELAB format this uses.
    Parameters:
    @@ -631,7 +631,7 @@

    fromRGBA

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -650,7 +650,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -663,7 +663,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -676,7 +676,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -689,7 +689,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -703,7 +703,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -716,7 +716,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -729,7 +729,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -742,7 +742,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -755,7 +755,7 @@

    alpha

  • chroma

    -
    public static float chroma(float encoded)
    +
    public static float chroma(float encoded)
    Gets the "chroma" or "colorfulness" of a given CIELAB color. Chroma is similar to saturation in that grayscale values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is that colors that are perceptually more-colorful have higher chroma than colors that are perceptually @@ -775,7 +775,7 @@

    chroma

  • chromaLimit

    -
    public static float chromaLimit(float hue, +
    public static float chromaLimit(float hue, float lightness)
    Given a hue and lightness, this gets the (very approximate) maximum chroma possible for that hue-lightness combination, using CIELAB's versions of lightness and hue (not HSL). This is useful to know the bounds of @@ -793,7 +793,7 @@

    chromaLimit

  • maximizeSaturation

    -
    public static float maximizeSaturation(float packed)
    +
    public static float maximizeSaturation(float packed)
    Gets the color with the same L as the CIELAB color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color. This is very similar to calling enrich(float, float) with a very large change value.
    @@ -814,7 +814,7 @@

    maximizeSaturation

  • maximizeSaturation

    -
    public static float maximizeSaturation(float L, +
    public static float maximizeSaturation(float L, float A, float B, float alpha)
    @@ -842,7 +842,7 @@

    maximizeSaturation

  • cielabHue

    -
    public static float cielabHue(float packed)
    +
    public static float cielabHue(float packed)
    Gets the hue of the given CIELAB float color, but as CIELAB understands hue rather than how HSL does. This is different from hue(float), which uses HSL. This gives a float between 0 (inclusive) and 1 (exclusive).
    @@ -857,7 +857,7 @@

    cielabHue

  • cielabSaturation

    -
    public static float cielabSaturation(float packed)
    +
    public static float cielabSaturation(float packed)
    Gets the saturation of the given CIELAB float color, but as CIELAB understands saturation rather than how HSL does. Saturation here is a fraction of the chroma limit (see chromaLimit(float, float)) for a given hue and lightness, and is between 0 and 1. This gives a float between 0 (inclusive) and 1 (inclusive).
    @@ -872,7 +872,7 @@

    cielabSaturation

  • cielabLightness

    -
    public static float cielabLightness(float packed)
    +
    public static float cielabLightness(float packed)
    Gets the lightness of the given CIELAB float color, but as CIELAB understands lightness rather than how HSL does. This is different from lightness(float), which uses HSL. This gives a float between 0 (inclusive) and 1 (inclusive). @@ -889,7 +889,7 @@

    cielabLightness

  • cielabByHSL

    -
    public static float cielabByHSL(float hue, +
    public static float cielabByHSL(float hue, float saturation, float lightness, float alpha)
    @@ -921,7 +921,7 @@

    cielabByHSL

  • cielabByHCL

    -
    public static float cielabByHCL(float hue, +
    public static float cielabByHCL(float hue, float chroma, float lightness, float alpha)
    @@ -952,7 +952,7 @@

    cielabByHCL

  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -978,7 +978,7 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f, inclusive. This is different from chroma(float); see that method's documentation for details.
    @@ -992,7 +992,7 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    +
    public static float lightness(float encoded)
    Defined as per HSL; normally you only need channelL(float) to get accurate lightness for CIELAB. This ranges from 0.0f (black) to 1.0f (white).
    @@ -1006,7 +1006,7 @@

    lightness

  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
    @@ -1021,7 +1021,7 @@

    hue

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -1053,7 +1053,7 @@

    toEditedFloat

  • editCIELAB

    -
    public static float editCIELAB(float encoded, +
    public static float editCIELAB(float encoded, float addL, float addA, float addB, @@ -1077,7 +1077,7 @@

    editCIELAB

  • editCIELAB

    -
    public static float editCIELAB(float encoded, +
    public static float editCIELAB(float encoded, float addL, float addA, float addB, @@ -1115,7 +1115,7 @@

    editCIELAB

  • channelL

    -
    public static float channelL(float encoded)
    +
    public static float channelL(float encoded)
    The "L" channel of the given packed float in CIELAB format, which is its lightness; ranges from 0.0f to 1.0f . You can edit the L of a color with lighten(float, float) and darken(float, float).
    @@ -1129,7 +1129,7 @@

    channelL

  • channelA

    -
    public static float channelA(float encoded)
    +
    public static float channelA(float encoded)
    The "A" channel of the given packed float in CIELAB format, which when combined with the B channel describes the hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with @@ -1145,7 +1145,7 @@

    channelA

  • channelB

    -
    public static float channelB(float encoded)
    +
    public static float channelB(float encoded)
    The "B" channel of the given packed float in CIELAB format, which when combined with the A channel describes the hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit @@ -1161,7 +1161,7 @@

    channelB

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -1187,7 +1187,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -1213,7 +1213,7 @@

    darken

  • raiseA

    -
    public static float raiseA(float start, +
    public static float raiseA(float start, float change)
    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from @@ -1239,7 +1239,7 @@

    raiseA

  • lowerA

    -
    public static float lowerA(float start, +
    public static float lowerA(float start, float change)
    Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from @@ -1265,7 +1265,7 @@

    lowerA

  • raiseB

    -
    public static float raiseB(float start, +
    public static float raiseB(float start, float change)
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed @@ -1291,7 +1291,7 @@

    raiseB

  • lowerB

    -
    public static float lowerB(float start, +
    public static float lowerB(float start, float change)
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed @@ -1317,7 +1317,7 @@

    lowerB

  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -1342,7 +1342,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -1367,7 +1367,7 @@

    fade

  • dullen

    -
    public static float dullen(float start, +
    public static float dullen(float start, float change)
    Brings the chromatic components of start closer to grayscale by change (desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -1390,7 +1390,7 @@

    dullen

  • enrich

    -
    public static float enrich(float start, +
    public static float enrich(float start, float change)
    Pushes the chromatic components of start away from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1416,7 +1416,7 @@

    enrich

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float CIELAB color mainColor and another CIELAB color that it should be made to contrast with, gets a packed float CIELAB color with roughly inverted intnsity but the same chromatic channels and opacity (P and T @@ -1440,7 +1440,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float CIELAB color mainColor and another CIELAB color that it should be made to contrast with, gets a packed float CIELAB color with L that should be quite different from contrastingColor's L, @@ -1463,7 +1463,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that with the original L. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    @@ -1478,7 +1478,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive CIELAB color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1496,7 +1496,7 @@

    lessenChange

  • inGamut

    -
    public static boolean inGamut(float packed)
    +
    public static boolean inGamut(float packed)
    Returns true if the given packed float color, as CIELAB, is valid to convert losslessly back to RGBA.
    Parameters:
    @@ -1509,7 +1509,7 @@

    inGamut

  • inGamut

    -
    public static boolean inGamut(float L, +
    public static boolean inGamut(float L, float A, float B)
    Returns true if the given CIELAB values are valid to convert losslessly back to RGBA.
    @@ -1526,7 +1526,7 @@

    inGamut

  • limitToGamut

    -
    public static float limitToGamut(float packed)
    +
    public static float limitToGamut(float packed)
    Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if it isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the L of the color, only bringing A and B closer to grayscale. Note that this version of limitToGamut() is much slower than Oklab's version, because Oklab @@ -1548,7 +1548,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B)
    Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if it @@ -1573,7 +1573,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B, float alpha)
    @@ -1600,7 +1600,7 @@

    limitToGamut

  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1624,7 +1624,7 @@

    randomEdit

  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    Parameters:
    @@ -1637,7 +1637,7 @@

    randomColor

  • randomizedColor

    -
    public static float randomizedColor(com.github.tommyettinger.random.EnhancedRandom random)
    +
    public static float randomizedColor(com.github.tommyettinger.random.EnhancedRandom random)
    Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed. This is named differently from randomColor(Random) to avoid confusion when a class both extends Random and EnhancedRandom.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html index a32233ba..a7cf7165 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html @@ -2,7 +2,7 @@ -GradientTools (colorful-pure 0.8.2 API) +GradientTools (colorful-pure 0.8.3 API) @@ -76,16 +76,16 @@

    Class GradientTools


  • -
    public class GradientTools +
    public class GradientTools extends Object
    Static methods for handling gradients of smoothly-changing colors, typically inside of FloatLists. The intent is for the FloatList to be used as a sequence of packed float CIELAB colors. You can create a new - FloatList gradient with makeGradient(float, float, int, Interpolation), but any FloatList will work + FloatList gradient with makeGradient(float, float, int, Interpolation), but any FloatList will work (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can - pass it to appendGradient(FloatList, float, float, int, Interpolation) to make a gradient between two - colors, or appendGradientChain(FloatList, int, Interpolation, float...) to make a gradient between more + pass it to appendGradient(FloatList, float, float, int, Interpolation) to make a gradient between two + colors, or appendGradientChain(FloatList, int, Interpolation, float...) to make a gradient between more than two colors. You can also customize each section between colors with - appendPartialGradient(FloatList, float, float, int, Interpolation), which is just like appendGradient() but + appendPartialGradient(FloatList, float, float, int, Interpolation), which is just like appendGradient() but doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    @@ -114,11 +114,11 @@

    Method Summary

    taking the specified number of steps and using linear Interpolation for how it transitions.
    static com.github.tommyettinger.ds.FloatList
    -
    appendGradient(com.github.tommyettinger.ds.FloatList appending, +
    appendGradient(com.github.tommyettinger.ds.FloatList appending, float start, float end, int steps, - Interpolation interpolation)
    + Interpolations.Interpolation interpolation)
    Appends a gradient from the packed float CIELAB color start to the packed float CIELAB color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    @@ -131,17 +131,17 @@

    Method Summary

    Appends a gradient between several packed float CIELAB colors provided in chain.
    static com.github.tommyettinger.ds.FloatList
    -
    appendGradientChain(com.github.tommyettinger.ds.FloatList appending, +
    appendGradientChain(com.github.tommyettinger.ds.FloatList appending, int steps, - Interpolation interpolation, + Interpolations.Interpolation interpolation, float... chain)
    Appends a gradient between several packed float CIELAB colors provided in chain.
    static com.github.tommyettinger.ds.FloatList
    -
    appendGradientChain(com.github.tommyettinger.ds.FloatList appending, +
    appendGradientChain(com.github.tommyettinger.ds.FloatList appending, int steps, - Interpolation interpolation, + Interpolations.Interpolation interpolation, com.github.tommyettinger.ds.FloatList chain)
    Appends a gradient between several packed float CIELAB colors provided in chain.
    @@ -163,13 +163,13 @@

    Method Summary

    end in what it appends to appending.
    static com.github.tommyettinger.ds.FloatList
    -
    appendPartialGradient(com.github.tommyettinger.ds.FloatList appending, +
    appendPartialGradient(com.github.tommyettinger.ds.FloatList appending, float start, float end, int steps, - Interpolation interpolation)
    + Interpolations.Interpolation interpolation)
    -
    Exactly like appendGradient(FloatList, float, float, int, Interpolation), but does not include +
    Exactly like appendGradient(FloatList, float, float, int, Interpolation), but does not include end in what it appends to appending.
    static com.github.tommyettinger.ds.FloatList
    @@ -181,10 +181,10 @@

    Method Summary

    end, taking the specified number of steps and using linear interpolation.
    static com.github.tommyettinger.ds.FloatList
    -
    makeGradient(float start, +
    makeGradient(float start, float end, int steps, - Interpolation interpolation)
    + Interpolations.Interpolation interpolation)
    Creates a FloatList gradient from the packed float CIELAB color start to the packed float CIELAB color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    @@ -209,7 +209,7 @@

    Method Details

  • makeGradient

    -
    public static com.github.tommyettinger.ds.FloatList makeGradient(float start, +
    public static com.github.tommyettinger.ds.FloatList makeGradient(float start, float end, int steps)
    Creates a FloatList gradient from the packed float CIELAB color start to the packed float CIELAB color @@ -227,12 +227,12 @@

    makeGradient

  • -
    +

    makeGradient

    -
    public static com.github.tommyettinger.ds.FloatList makeGradient(float start, +
    public static com.github.tommyettinger.ds.FloatList makeGradient(float start, float end, int steps, - Interpolation interpolation)
    + Interpolations.Interpolation interpolation)
    Creates a FloatList gradient from the packed float CIELAB color start to the packed float CIELAB color end, taking the specified number of steps and using the specified Interpolation for how it transitions. This limits individual steps of color to the correct CIELAB gamut, so even interpolations between colors at @@ -251,7 +251,7 @@

    makeGradient

  • appendGradient

    -
    public static com.github.tommyettinger.ds.FloatList appendGradient(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendGradient(com.github.tommyettinger.ds.FloatList appending, float start, float end, int steps)
    @@ -271,13 +271,13 @@

    appendGradient

  • -
    +

    appendGradient

    -
    public static com.github.tommyettinger.ds.FloatList appendGradient(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendGradient(com.github.tommyettinger.ds.FloatList appending, float start, float end, int steps, - Interpolation interpolation)
    + Interpolations.Interpolation interpolation)
    Appends a gradient from the packed float CIELAB color start to the packed float CIELAB color end, taking the specified number of steps and using the specified Interpolation for how it transitions. This limits individual steps of color to the correct CIELAB gamut, so even interpolations between colors at extreme points in @@ -297,7 +297,7 @@

    appendGradient

  • appendGradientChain

    -
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, int steps, float... chain)
    Appends a gradient between several packed float CIELAB colors provided in chain. This uses linear @@ -316,7 +316,7 @@

    appendGradientChain

  • appendGradientChain

    -
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, int steps, com.github.tommyettinger.ds.FloatList chain)
    Appends a gradient between several packed float CIELAB colors provided in chain. This uses linear @@ -333,11 +333,11 @@

    appendGradientChain

  • -
    +

    appendGradientChain

    -
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, int steps, - Interpolation interpolation, + Interpolations.Interpolation interpolation, com.github.tommyettinger.ds.FloatList chain)
    Appends a gradient between several packed float CIELAB colors provided in chain. This uses the specified Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the @@ -354,11 +354,11 @@

    appendGradientChain

  • -
    +

    appendGradientChain

    -
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendGradientChain(com.github.tommyettinger.ds.FloatList appending, int steps, - Interpolation interpolation, + Interpolations.Interpolation interpolation, float... chain)
    Appends a gradient between several packed float CIELAB colors provided in chain. This uses the specified Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the @@ -377,7 +377,7 @@

    appendGradientChain

  • appendPartialGradient

    -
    public static com.github.tommyettinger.ds.FloatList appendPartialGradient(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendPartialGradient(com.github.tommyettinger.ds.FloatList appending, float start, float end, int steps)
    @@ -397,14 +397,14 @@

    appendPartialGradient

  • -
    +

    appendPartialGradient

    -
    public static com.github.tommyettinger.ds.FloatList appendPartialGradient(com.github.tommyettinger.ds.FloatList appending, +
    public static com.github.tommyettinger.ds.FloatList appendPartialGradient(com.github.tommyettinger.ds.FloatList appending, float start, float end, int steps, - Interpolation interpolation)
    - +
    Exactly like appendGradient(FloatList, float, float, int, Interpolation), but does not include end in what it appends to appending. This is intended for the implementation of chained gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified number of steps, it just doesn't append end in the last step.
    diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/Palette.html index 330a38c4..e827450a 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/Palette.html @@ -2,7 +2,7 @@ -Palette (colorful-pure 0.8.2 API) +Palette (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/SimplePalette.html index d89460f6..5f486b37 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/SimplePalette.html @@ -2,7 +2,7 @@ -SimplePalette (colorful-pure 0.8.2 API) +SimplePalette (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/ColorTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/ColorTools.html index c1c1b873..58dce85f 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/ColorTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/ColorTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.cielab.ColorTools (colorful-pure 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.pure.cielab.ColorTools (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/GradientTools.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/GradientTools.html index b388bbfc..89a54ae0 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/GradientTools.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/GradientTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.cielab.GradientTools (colorful-pure 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.pure.cielab.GradientTools (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/Palette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/Palette.html index c485ffc1..702ea8a1 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/Palette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/Palette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.cielab.Palette (colorful-pure 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.pure.cielab.Palette (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/SimplePalette.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/SimplePalette.html index adaa086f..0382da46 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/SimplePalette.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/class-use/SimplePalette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.cielab.SimplePalette (colorful-pure 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.pure.cielab.SimplePalette (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-summary.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-summary.html index 66cde7b9..0f639449 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-summary.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-summary.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.pure.cielab (colorful-pure 0.8.2 API) +com.github.tommyettinger.colorful.pure.cielab (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-tree.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-tree.html index a4815fea..24415340 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-tree.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-tree.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.pure.cielab Class Hierarchy (colorful-pure 0.8.2 API) +com.github.tommyettinger.colorful.pure.cielab Class Hierarchy (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-use.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-use.html index 1c379c6c..776acf70 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-use.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/cielab/package-use.html @@ -2,7 +2,7 @@ -Uses of Package com.github.tommyettinger.colorful.pure.cielab (colorful-pure 0.8.2 API) +Uses of Package com.github.tommyettinger.colorful.pure.cielab (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html index f26d7cde..4f731a6c 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/FloatColors.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.pure.FloatColors (colorful-pure 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.pure.FloatColors (colorful-pure 0.8.3 API) diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolations.BiasGain.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolations.BiasGain.html new file mode 100644 index 00000000..0b19f19b --- /dev/null +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolations.BiasGain.html @@ -0,0 +1,61 @@ + + + + +Uses of Class com.github.tommyettinger.colorful.pure.Interpolations.BiasGain (colorful-pure 0.8.3 API) + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Uses of Class
    com.github.tommyettinger.colorful.pure.Interpolations.BiasGain

    +
    +No usage of com.github.tommyettinger.colorful.pure.Interpolations.BiasGain
    +
    +
    + +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolation.SwingIn.html b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolations.Bounce.html similarity index 80% rename from docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolation.SwingIn.html rename to docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolations.Bounce.html index 8e15f0ef..84eb80c0 100644 --- a/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolation.SwingIn.html +++ b/docs/colorful-pure/apidocs/com/github/tommyettinger/colorful/pure/class-use/Interpolations.Bounce.html @@ -2,10 +2,10 @@ -Uses of Class com.github.tommyettinger.colorful.pure.Interpolation.SwingIn (colorful-pure 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.pure.Interpolations.Bounce (colorful-pure 0.8.3 API) - + @@ -29,7 +29,7 @@
  • F

    -
    fade - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    fade - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    fade(float, float) - Static method in class com.github.tommyettinger.colorful.pure.cielab.ColorTools
    @@ -3848,7 +3864,7 @@

    F

    FADED_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Faded Blue" has RGBA8888 code 3F3FBFFF, L 0.33333334, A 0.50980395, B 0.4, alpha 1.0, hue 0.7655599, saturation 0.41548988, and chroma 0.20017387.
    +
    This color constant "Faded Blue" has RGBA8888 code 3F3FBFFF, L 0.33333334, A 0.50980395, B 0.40392157, alpha 1.0, hue 0.76980346, saturation 0.6282279, and chroma 0.19240016.
    FADED_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -3858,7 +3874,7 @@

    F

    This color constant "Faded Blue" has RGBA8888 code 3F3FBFFF, luma 0.30980393, warmth 0.24705884, mildness 0.24705884, alpha 1.0, hue 0.6666667, and saturation 0.5039369.
    -
    fastSlow - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    fastSlow - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    FAWN - Static variable in class com.github.tommyettinger.colorful.pure.cielab.Palette
    @@ -3878,7 +3894,7 @@

    F

    FAWN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Fawn" has RGBA8888 code BF7F3FFF, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18403731, saturation 0.4331543, and chroma 0.106691405.
    +
    This color constant "Fawn" has RGBA8888 code BF7F3FFF, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18118605, saturation 0.6984303, and chroma 0.106691405.
    FAWN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -3906,7 +3922,7 @@

    F

    FEATHER_DOWN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Feather Down" has RGBA8888 code E3E3FFFF, L 0.88235295, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.7676211, saturation 0.6200378, and chroma 0.0353726.
    +
    This color constant "Feather Down" has RGBA8888 code E3E3FFFF, L 0.89411765, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.78898686, saturation 0.9162457, and chroma 0.0353726.
    FEATHER_DOWN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -3930,7 +3946,7 @@

    F

    FERN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "fern" has RGBA8888 code 4E7942FF, L 0.43137255, A 0.4627451, B 0.5294118, alpha 1.0, hue 0.3936267, saturation 0.22094448, and chroma 0.0945603.
    +
    This color constant "fern" has RGBA8888 code 4E7942FF, L 0.43137255, A 0.4627451, B 0.5294118, alpha 1.0, hue 0.3843443, saturation 0.51240826, and chroma 0.0945603.
    FERN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -3954,7 +3970,7 @@

    F

    FERN_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Fern Green" has RGBA8888 code 0C5C0CFF, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.40522522, saturation 0.9969778, and chroma 0.14626285.
    +
    This color constant "Fern Green" has RGBA8888 code 0C5C0CFF, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.399282, saturation 0.95390135, and chroma 0.14626285.
    FERN_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -3982,7 +3998,7 @@

    F

    FLAMINGO - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Flamingo" has RGBA8888 code FC3A8CFF, L 0.5647059, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.8134724, and chroma 0.23076649.
    +
    This color constant "Flamingo" has RGBA8888 code FC3A8CFF, L 0.5647059, A 0.6117647, B 0.49411765, alpha 1.0, hue 0.99452704, saturation 0.90678865, and chroma 0.22296442.
    FLAMINGO - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4048,7 +4064,7 @@

    F

    FLORAL_FOAM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Floral Foam" has RGBA8888 code 0F6946FF, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.4596309, saturation 0.893996, and chroma 0.10895567.
    +
    This color constant "Floral Foam" has RGBA8888 code 0F6946FF, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.45250326, saturation 0.90676475, and chroma 0.10895567.
    FLORAL_FOAM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4076,7 +4092,7 @@

    F

    FOREST_GLEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Forest Glen" has RGBA8888 code 149605FF, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.40057325, saturation 0.9817451, and chroma 0.2070681.
    +
    This color constant "Forest Glen" has RGBA8888 code 149605FF, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.39636543, saturation 0.9778058, and chroma 0.2070681.
    FOREST_GLEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4112,7 +4128,7 @@

    F

    FROG_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Frog Green" has RGBA8888 code 73C805FF, L 0.6784314, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.37081593, saturation 0.78956354, and chroma 0.209995.
    +
    This color constant "Frog Green" has RGBA8888 code 73C805FF, L 0.68235296, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.36663744, saturation 0.96097314, and chroma 0.209995.
    FROG_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4229,7 +4245,7 @@

    F

    FRUIT_PUNCH - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Fruit Punch" has RGBA8888 code C80078FF, L 0.42745098, A 0.6117647, B 0.48235294, alpha 1.0, hue 0.9750635, saturation 0.85248, and chroma 0.22541466.
    +
    This color constant "Fruit Punch" has RGBA8888 code C80078FF, L 0.42745098, A 0.6117647, B 0.48235294, alpha 1.0, hue 0.9781724, saturation 0.95982176, and chroma 0.22541466.
    FRUIT_PUNCH - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4260,7 +4276,7 @@

    G

    GARTER_SNAKE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Garter Snake" has RGBA8888 code 64C082FF, L 0.6666667, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.43293634, saturation 0.3960396, and chroma 0.124142565.
    +
    This color constant "Garter Snake" has RGBA8888 code 64C082FF, L 0.67058825, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.42620972, saturation 0.5906595, and chroma 0.124142565.
    GARTER_SNAKE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4322,7 +4338,7 @@

    G

    GRAPE_LOLLIPOP - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Grape Lollipop" has RGBA8888 code 5A187BFF, L 0.24313726, A 0.5568628, B 0.43529412, alpha 1.0, hue 0.8647537, saturation 0.7002268, and chroma 0.17160846.
    +
    This color constant "Grape Lollipop" has RGBA8888 code 5A187BFF, L 0.23921569, A 0.5568628, B 0.43529412, alpha 1.0, hue 0.86987174, saturation 0.8600672, and chroma 0.17160846.
    GRAPE_LOLLIPOP - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4350,7 +4366,7 @@

    G

    GRAPE_SODA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Grape Soda" has RGBA8888 code 410062FF, L 0.16470589, A 0.54901963, B 0.43529412, alpha 1.0, hue 0.8531978, saturation 0.9058, and chroma 0.16172063.
    +
    This color constant "Grape Soda" has RGBA8888 code 410062FF, L 0.16470589, A 0.54901963, B 0.43529412, alpha 1.0, hue 0.8586049, saturation 0.98169184, and chroma 0.16172063.
    GRAPE_SODA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4378,7 +4394,7 @@

    G

    GRAPHITE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Graphite" has RGBA8888 code 373737FF, L 0.21176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.004326663, and chroma 0.0055242716.
    +
    This color constant "Graphite" has RGBA8888 code 373737FF, L 0.20784314, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    GRAPHITE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4418,11 +4434,11 @@

    G

    GRAY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0016803193, and chroma 0.0055242716.
    +
    This color constant "Gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    GRAY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0016803193, and chroma 0.0055242716.
    +
    This color constant "gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    GRAY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4454,7 +4470,7 @@

    G

    GRAY_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Gray Green" has RGBA8888 code 506450FF, L 0.3764706, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.41928825, saturation 0.07537778, and chroma 0.040217306.
    +
    This color constant "Gray Green" has RGBA8888 code 506450FF, L 0.37254903, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.3975709, saturation 0.22222222, and chroma 0.040217306.
    GRAY_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4522,11 +4538,11 @@

    G

    GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Green" has RGBA8888 code 00FF00FF, L 0.8, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39883053, saturation 0.9818446, and chroma 0.29610303.
    +
    This color constant "Green" has RGBA8888 code 00FF00FF, L 0.80784315, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39588714, saturation 1.0080564, and chroma 0.29610303.
    GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "green" has RGBA8888 code 00FF00FF, L 0.8, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39883053, saturation 0.9818446, and chroma 0.29610303.
    +
    This color constant "green" has RGBA8888 code 00FF00FF, L 0.80784315, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39588714, saturation 1.0080564, and chroma 0.29610303.
    GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4586,7 +4602,7 @@

    G

    GREYHOUND - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Greyhound" has RGBA8888 code A4A4A4FF, L 0.6509804, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0012193263, and chroma 0.0055242716.
    +
    This color constant "Greyhound" has RGBA8888 code A4A4A4FF, L 0.654902, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    GREYHOUND - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4617,7 +4633,7 @@

    H

    HAM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Ham" has RGBA8888 code EBACE1FF, L 0.7647059, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.90448654, saturation 0.28008983, and chroma 0.08992863.
    +
    This color constant "Ham" has RGBA8888 code EBACE1FF, L 0.77254903, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.91398114, saturation 0.5830952, and chroma 0.08992863.
    HAM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4645,7 +4661,7 @@

    H

    HELIOTROPE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Heliotrope" has RGBA8888 code FF52FFFF, L 0.6509804, A 0.6117647, B 0.42745098, alpha 1.0, hue 0.90835387, saturation 0.90332043, and chroma 0.26545262.
    +
    This color constant "Heliotrope" has RGBA8888 code FF52FFFF, L 0.654902, A 0.6117647, B 0.42745098, alpha 1.0, hue 0.91158056, saturation 0.9893361, and chroma 0.26545262.
    HELIOTROPE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4673,7 +4689,7 @@

    H

    HIDDEN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Hidden Blue" has RGBA8888 code 186ABDFF, L 0.41568628, A 0.4745098, B 0.42745098, alpha 1.0, hue 0.696238, saturation 0.681662, and chroma 0.15319274.
    +
    This color constant "Hidden Blue" has RGBA8888 code 186ABDFF, L 0.41568628, A 0.4745098, B 0.42745098, alpha 1.0, hue 0.6988043, saturation 0.88249606, and chroma 0.15319274.
    HIDDEN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4701,7 +4717,7 @@

    H

    HONEYDEW - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Honeydew" has RGBA8888 code C7E3ABFF, L 0.8352941, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.375, saturation 0.069975674, and chroma 0.071815535.
    +
    This color constant "Honeydew" has RGBA8888 code C7E3ABFF, L 0.84313726, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.3627901, saturation 0.28811076, and chroma 0.071815535.
    HONEYDEW - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4729,7 +4745,7 @@

    H

    HOSPITAL_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Hospital Green" has RGBA8888 code 3FBFBFFF, L 0.6666667, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54788184, saturation 0.7316009, and chroma 0.11861114.
    +
    This color constant "Hospital Green" has RGBA8888 code 3FBFBFFF, L 0.67058825, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54428434, saturation 0.83201253, and chroma 0.11861114.
    HOSPITAL_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4757,7 +4773,7 @@

    H

    HOT_SAUCE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Hot Sauce" has RGBA8888 code A5140AFF, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.08136994, saturation 0.8018141, and chroma 0.1836353.
    +
    This color constant "Hot Sauce" has RGBA8888 code A5140AFF, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.0826307, saturation 0.94850093, and chroma 0.1836353.
    HOT_SAUCE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4851,7 +4867,7 @@

    H

    HUNTER_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Hunter Green" has RGBA8888 code 1E2D23FF, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.44880432, saturation 0.2366864, and chroma 0.03705794.
    +
    This color constant "Hunter Green" has RGBA8888 code 1E2D23FF, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.42620972, saturation 0.4259177, and chroma 0.03705794.
    HUNTER_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4894,11 +4910,11 @@

    I

    INDIGO - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Indigo" has RGBA8888 code 231094FF, L 0.19215687, A 0.5058824, B 0.39607844, alpha 1.0, hue 0.75899065, saturation 0.85232514, and chroma 0.20736265.
    +
    This color constant "Indigo" has RGBA8888 code 231094FF, L 0.1882353, A 0.5058824, B 0.39607844, alpha 1.0, hue 0.76221764, saturation 0.9313146, and chroma 0.20736265.
    INDIGO - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "indigo" has RGBA8888 code 520FE0FF, L 0.32156864, A 0.53333336, B 0.36862746, alpha 1.0, hue 0.7895446, saturation 0.9090131, and chroma 0.27001202.
    +
    This color constant "indigo" has RGBA8888 code 520FE0FF, L 0.32156864, A 0.53333336, B 0.36862746, alpha 1.0, hue 0.79236877, saturation 0.95014614, and chroma 0.27001202.
    INDIGO - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4930,7 +4946,7 @@

    I

    INFECTION - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Infection" has RGBA8888 code 96DC19FF, L 0.75686276, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.3624701, saturation 0.743936, and chroma 0.2105755.
    +
    This color constant "Infection" has RGBA8888 code 96DC19FF, L 0.7647059, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.35831934, saturation 0.9158818, and chroma 0.2105755.
    INFECTION - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -4998,45 +5014,49 @@

    I

    The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to 1.0f .
    -
    Interpolation - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolation() - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations.Interpolation
    +
     
    +
    Interpolations - Class in com.github.tommyettinger.colorful.pure
    Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -
    Interpolation() - Constructor for class com.github.tommyettinger.colorful.pure.Interpolation
    +
    Interpolations() - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    Interpolation.BiasGain - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.BiasGain - Class in com.github.tommyettinger.colorful.pure
    A wrapper around MathTools.barronSpline(float, float, float) to use it as an Interpolation.
    -
    Interpolation.Bounce - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.Bounce - Class in com.github.tommyettinger.colorful.pure
    +
     
    +
    Interpolations.BounceIn - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.BounceIn - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.BounceOut - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.BounceOut - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.Elastic - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.Elastic - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.ElasticIn - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.ElasticIn - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.ElasticOut - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.ElasticOut - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.Exp - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.Exp - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.ExpIn - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.ExpIn - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.ExpOut - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.ExpOut - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.Interpolation - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.Pow - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.Pow - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.PowIn - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.PowIn - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.PowOut - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.PowOut - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.Swing - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.Swing - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.SwingIn - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.SwingIn - Class in com.github.tommyettinger.colorful.pure
     
    -
    Interpolation.SwingOut - Class in com.github.tommyettinger.colorful.pure
    +
    Interpolations.SwingOut - Class in com.github.tommyettinger.colorful.pure
     
    inverseLightness(float, float) - Static method in class com.github.tommyettinger.colorful.pure.cielab.ColorTools
    @@ -5097,7 +5117,7 @@

    I

    IOLITE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Iolite" has RGBA8888 code 494973FF, L 0.30980393, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.06848998, and chroma 0.07513822.
    +
    This color constant "Iolite" has RGBA8888 code 494973FF, L 0.30588236, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.25970548, and chroma 0.07513822.
    IOLITE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5137,7 +5157,7 @@

    I

    IRIS - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Iris" has RGBA8888 code 6241F6FF, L 0.41960785, A 0.5294118, B 0.38039216, alpha 1.0, hue 0.7883731, saturation 0.79392385, and chroma 0.24537967.
    +
    This color constant "Iris" has RGBA8888 code 6241F6FF, L 0.41960785, A 0.5294118, B 0.38039216, alpha 1.0, hue 0.7914705, saturation 0.8999522, and chroma 0.24537967.
    IRIS - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5165,7 +5185,7 @@

    I

    IRON - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Iron" has RGBA8888 code 6E6E6EFF, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0020156212, and chroma 0.0055242716.
    +
    This color constant "Iron" has RGBA8888 code 6E6E6EFF, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    IRON - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5193,7 +5213,7 @@

    I

    IVY_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Ivy Green" has RGBA8888 code 007F00FF, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.4036119, saturation 1.0868253, and chroma 0.18528971.
    +
    This color constant "Ivy Green" has RGBA8888 code 007F00FF, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.3989195, saturation 0.98336864, and chroma 0.18528971.
    IVY_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5236,11 +5256,11 @@

    J

    JADE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Jade" has RGBA8888 code 3FBF3FFF, L 0.6313726, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4055531, saturation 0.71121687, and chroma 0.20259848.
    +
    This color constant "Jade" has RGBA8888 code 3FBF3FFF, L 0.63529414, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4012713, saturation 0.806468, and chroma 0.20259848.
    JADE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "jade" has RGBA8888 code 3FBF3FFF, L 0.6313726, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4055531, saturation 0.71121687, and chroma 0.20259848.
    +
    This color constant "jade" has RGBA8888 code 3FBF3FFF, L 0.63529414, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4012713, saturation 0.806468, and chroma 0.20259848.
    JADE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5272,7 +5292,7 @@

    J

    JUICY_GRAPE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Juicy Grape" has RGBA8888 code 6010D0FF, L 0.32156864, A 0.54901963, B 0.38039216, alpha 1.0, hue 0.81189364, saturation 0.8997464, and chroma 0.2575164.
    +
    This color constant "Juicy Grape" has RGBA8888 code 6010D0FF, L 0.32156864, A 0.54901963, B 0.38039216, alpha 1.0, hue 0.8150709, saturation 0.9616342, and chroma 0.2575164.
    JUICY_GRAPE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5303,7 +5323,7 @@

    K

    KELLY_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Kelly Green" has RGBA8888 code 578F57FF, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.40801254, saturation 0.29565728, and chroma 0.107261956.
    +
    This color constant "Kelly Green" has RGBA8888 code 578F57FF, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.39991105, saturation 0.49459895, and chroma 0.107261956.
    KELLY_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5331,7 +5351,7 @@

    K

    KOA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Koa" has RGBA8888 code A04B05FF, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15239218, saturation 0.81816477, and chroma 0.12896542.
    +
    This color constant "Koa" has RGBA8888 code A04B05FF, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15127131, saturation 0.9299811, and chroma 0.12896542.
    KOA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5359,7 +5379,7 @@

    K

    KYANITE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Kyanite" has RGBA8888 code 3B7373FF, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.545517, saturation 0.4471342, and chroma 0.069218926.
    +
    This color constant "Kyanite" has RGBA8888 code 3B7373FF, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.53898686, saturation 0.63432395, and chroma 0.069218926.
    KYANITE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5402,11 +5422,11 @@

    L

    LAVENDER - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Lavender" has RGBA8888 code B991FFFF, L 0.67058825, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.82570946, saturation 0.84011585, and chroma 0.14500555.
    +
    This color constant "Lavender" has RGBA8888 code B991FFFF, L 0.6745098, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.83155453, saturation 0.9661873, and chroma 0.14500555.
    LAVENDER - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "lavender" has RGBA8888 code B991FFFF, L 0.67058825, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.82570946, saturation 0.84011585, and chroma 0.14500555.
    +
    This color constant "lavender" has RGBA8888 code B991FFFF, L 0.6745098, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.83155453, saturation 0.9661873, and chroma 0.14500555.
    LAVENDER - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5438,7 +5458,7 @@

    L

    LEAD - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Lead" has RGBA8888 code 5B5B5BFF, L 0.3647059, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716.
    +
    This color constant "Lead" has RGBA8888 code 5B5B5BFF, L 0.36078432, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    LEAD - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5523,7 +5543,7 @@

    L

    LIGHT_GRAY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Gray" has RGBA8888 code C9C9C9FF, L 0.78431374, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716.
    +
    This color constant "Light Gray" has RGBA8888 code C9C9C9FF, L 0.7921569, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    LIGHT_GRAY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5551,7 +5571,7 @@

    L

    LIGHT_SKIN_1 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 1" has RGBA8888 code 7E6E60FF, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.0229381, and chroma 0.022777155.
    +
    This color constant "Light Skin 1" has RGBA8888 code 7E6E60FF, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.18976586, and chroma 0.022777155.
    LIGHT_SKIN_1 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5579,7 +5599,7 @@

    L

    LIGHT_SKIN_2 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 2" has RGBA8888 code A0695FFF, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.078336, and chroma 0.068331465.
    +
    This color constant "Light Skin 2" has RGBA8888 code A0695FFF, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.2948119, and chroma 0.068331465.
    LIGHT_SKIN_2 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5607,7 +5627,7 @@

    L

    LIGHT_SKIN_3 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 3" has RGBA8888 code C07872FF, L 0.5647059, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.070401505, saturation 0.1291548, and chroma 0.0821242.
    +
    This color constant "Light Skin 3" has RGBA8888 code C07872FF, L 0.5686275, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.073790275, saturation 0.39929786, and chroma 0.0821242.
    LIGHT_SKIN_3 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5635,7 +5655,7 @@

    L

    LIGHT_SKIN_4 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 4" has RGBA8888 code D08A74FF, L 0.62352943, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.10391619, saturation 0.1947072, and chroma 0.0835974.
    +
    This color constant "Light Skin 4" has RGBA8888 code D08A74FF, L 0.627451, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.105220385, saturation 0.49572846, and chroma 0.0835974.
    LIGHT_SKIN_4 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5663,7 +5683,7 @@

    L

    LIGHT_SKIN_5 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 5" has RGBA8888 code E19B7DFF, L 0.6862745, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.2743484, and chroma 0.082864076.
    +
    This color constant "Light Skin 5" has RGBA8888 code E19B7DFF, L 0.6901961, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.5954583, and chroma 0.082864076.
    LIGHT_SKIN_5 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5691,7 +5711,7 @@

    L

    LIGHT_SKIN_6 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 6" has RGBA8888 code EBAA8CFF, L 0.73333335, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.30118066, and chroma 0.071815535.
    +
    This color constant "Light Skin 6" has RGBA8888 code EBAA8CFF, L 0.7372549, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.6386771, and chroma 0.071815535.
    LIGHT_SKIN_6 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5719,7 +5739,7 @@

    L

    LIGHT_SKIN_7 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 7" has RGBA8888 code F5B99BFF, L 0.78039217, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.138223, saturation 0.38347107, and chroma 0.06652104.
    +
    This color constant "Light Skin 7" has RGBA8888 code F5B99BFF, L 0.7882353, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.13720988, saturation 0.76829535, and chroma 0.06652104.
    LIGHT_SKIN_7 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5747,7 +5767,7 @@

    L

    LIGHT_SKIN_8 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 8" has RGBA8888 code F6C8AFFF, L 0.81960785, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.14085212, saturation 0.43699297, and chroma 0.055518243.
    +
    This color constant "Light Skin 8" has RGBA8888 code F6C8AFFF, L 0.827451, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.13941902, saturation 0.8221316, and chroma 0.055518243.
    LIGHT_SKIN_8 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5775,7 +5795,7 @@

    L

    LIGHT_SKIN_9 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Light Skin 9" has RGBA8888 code F5E1D2FF, L 0.8784314, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.16171224, and chroma 0.022777155.
    +
    This color constant "Light Skin 9" has RGBA8888 code F5E1D2FF, L 0.8901961, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.6555548, and chroma 0.022777155.
    LIGHT_SKIN_9 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5851,7 +5871,7 @@

    L

    LILAC - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Lilac" has RGBA8888 code D7A5FFFF, L 0.7411765, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.8534426, saturation 0.8283974, and chroma 0.12265874.
    +
    This color constant "Lilac" has RGBA8888 code D7A5FFFF, L 0.7490196, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.860581, saturation 0.9762812, and chroma 0.12265874.
    LILAC - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -5875,7 +5895,7 @@

    L

    LIME - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "lime" has RGBA8888 code 93D300FF, L 0.7294118, A 0.43529412, B 0.5803922, alpha 1.0, hue 0.3578718, saturation 0.78243065, and chroma 0.20558903.
    +
    This color constant "lime" has RGBA8888 code 93D300FF, L 0.7372549, A 0.43529412, B 0.5803922, alpha 1.0, hue 0.35363457, saturation 0.94288415, and chroma 0.20558903.
    LIME - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -5968,7 +5988,7 @@

    L

    Iteratively checks whether the given YCwCm color is in-gamut, and either brings the color closer to 50% gray if it isn't in-gamut, or returns it as soon as it is in-gamut.
    -
    linear - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    linear - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    LIST - Static variable in class com.github.tommyettinger.colorful.pure.cielab.Palette
     
    @@ -6022,7 +6042,7 @@

    L

    LIZARD_SCALES - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Lizard Scales" has RGBA8888 code 73733BFF, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.30616736, saturation 0.32533228, and chroma 0.079095535.
    +
    This color constant "Lizard Scales" has RGBA8888 code 73733BFF, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.29637668, saturation 0.63274586, and chroma 0.079095535.
    LIZARD_SCALES - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6048,6 +6068,18 @@

    L

    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    +
    lowerB(float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to decrease its blue channel by change.
    +
    +
    lowerG(float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to decrease its green channel by change.
    +
    +
    lowerR(float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to decrease its red channel by change.
    +
    luma(float) - Static method in class com.github.tommyettinger.colorful.pure.ycwcm.ColorTools
    The "luma" of the given packed float in YCwCm format, which is like its lightness; ranges from 0.0f to @@ -6071,7 +6103,7 @@

    L

    LURID_RED - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Lurid Red" has RGBA8888 code DA2010FF, L 0.4509804, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.08299518, saturation 0.7767863, and chroma 0.21173172.
    +
    This color constant "Lurid Red" has RGBA8888 code DA2010FF, L 0.44705883, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.084052734, saturation 0.89628667, and chroma 0.21173172.
    LURID_RED - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6114,11 +6146,11 @@

    M

    MAGENTA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9091779, saturation 0.9090322, and chroma 0.31098264.
    +
    This color constant "Magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9119308, saturation 0.96295136, and chroma 0.31098264.
    MAGENTA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9091779, saturation 0.9090322, and chroma 0.31098264.
    +
    This color constant "magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9119308, saturation 0.96295136, and chroma 0.31098264.
    MAGENTA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6150,7 +6182,7 @@

    M

    MAIDENHAIR_FERN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Maidenhair Fern" has RGBA8888 code 3B7349FF, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.42320445, saturation 0.3791533, and chroma 0.09260367.
    +
    This color constant "Maidenhair Fern" has RGBA8888 code 3B7349FF, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.41398114, saturation 0.5424141, and chroma 0.09260367.
    MAIDENHAIR_FERN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6195,37 +6227,37 @@

    M

    Creates a FloatList gradient from the packed float YCwCm color start to the packed float YCwCm color end, taking the specified number of steps and using linear interpolation.
    -
    makeGradient(float, float, int, Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.cielab.GradientTools
    +
    makeGradient(float, float, int, Interpolations.Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.cielab.GradientTools
    Creates a FloatList gradient from the packed float CIELAB color start to the packed float CIELAB color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -
    makeGradient(float, float, int, Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.hsluv.GradientTools
    +
    makeGradient(float, float, int, Interpolations.Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.hsluv.GradientTools
    Creates a FloatList gradient from the packed float HSLuv color start to the packed float HSLuv color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -
    makeGradient(float, float, int, Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.ipt_hq.GradientTools
    +
    makeGradient(float, float, int, Interpolations.Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.ipt_hq.GradientTools
    Creates a FloatList gradient from the packed float IPT_HQ color start to the packed float IPT_HQ color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -
    makeGradient(float, float, int, Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.ipt.GradientTools
    +
    makeGradient(float, float, int, Interpolations.Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.ipt.GradientTools
    Creates a FloatList gradient from the packed float IPT color start to the packed float IPT color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -
    makeGradient(float, float, int, Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.oklab.GradientTools
    +
    makeGradient(float, float, int, Interpolations.Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.oklab.GradientTools
    Creates a FloatList gradient from the packed float Oklab color start to the packed float Oklab color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -
    makeGradient(float, float, int, Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.rgb.GradientTools
    +
    makeGradient(float, float, int, Interpolations.Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.rgb.GradientTools
    Creates a FloatList gradient from the packed float RGB color start to the packed float RGB color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -
    makeGradient(float, float, int, Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.ycwcm.GradientTools
    +
    makeGradient(float, float, int, Interpolations.Interpolation) - Static method in class com.github.tommyettinger.colorful.pure.ycwcm.GradientTools
    Creates a FloatList gradient from the packed float YCwCm color start to the packed float YCwCm color end, taking the specified number of steps and using the specified Interpolation for how it transitions.
    @@ -6248,7 +6280,7 @@

    M

    MALACHITE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Malachite" has RGBA8888 code 0AD70AFF, L 0.6862745, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.40182015, saturation 0.99775034, and chroma 0.26337513.
    +
    This color constant "Malachite" has RGBA8888 code 0AD70AFF, L 0.6901961, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.39851815, saturation 0.98825276, and chroma 0.26337513.
    MALACHITE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6276,7 +6308,7 @@

    M

    MARSH - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Marsh" has RGBA8888 code 738F57FF, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.375, saturation 0.1515024, and chroma 0.082864076.
    +
    This color constant "Marsh" has RGBA8888 code 738F57FF, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.3644131, saturation 0.45234665, and chroma 0.082864076.
    MARSH - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6323,11 +6355,11 @@

    M

    MAUVE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.09785124, and chroma 0.1008085.
    +
    This color constant "Mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.3259601, and chroma 0.1008085.
    MAUVE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.09785124, and chroma 0.1008085.
    +
    This color constant "mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.3259601, and chroma 0.1008085.
    MAUVE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6389,7 +6421,7 @@

    M

    MEDIUM_PLUM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Medium Plum" has RGBA8888 code BD10C5FF, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9018202, saturation 0.86487514, and chroma 0.26337513.
    +
    This color constant "Medium Plum" has RGBA8888 code BD10C5FF, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9050996, saturation 0.9399402, and chroma 0.26337513.
    MEDIUM_PLUM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6417,7 +6449,7 @@

    M

    MEDIUM_TEAL - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Medium Teal" has RGBA8888 code 06C491FF, L 0.6509804, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.47172436, saturation 0.9115982, and chroma 0.15477823.
    +
    This color constant "Medium Teal" has RGBA8888 code 06C491FF, L 0.654902, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.46697098, saturation 0.94714576, and chroma 0.15477823.
    MEDIUM_TEAL - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6445,7 +6477,7 @@

    M

    MILD_VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Mild Violet" has RGBA8888 code AB8FC7FF, L 0.62352943, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.84141475, saturation 0.16076855, and chroma 0.079095535.
    +
    This color constant "Mild Violet" has RGBA8888 code AB8FC7FF, L 0.627451, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.8524291, saturation 0.4, and chroma 0.079095535.
    MILD_VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6469,7 +6501,7 @@

    M

    MINT - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "mint" has RGBA8888 code 7FFFD4FF, L 0.8666667, A 0.4392157, B 0.50980395, alpha 1.0, hue 0.47453672, saturation 0.8283974, and chroma 0.12265874.
    +
    This color constant "mint" has RGBA8888 code 7FFFD4FF, L 0.8784314, A 0.4392157, B 0.50980395, alpha 1.0, hue 0.46857655, saturation 1.0198039, and chroma 0.12265874.
    MINT - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -6493,7 +6525,7 @@

    M

    MINT_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Mint Green" has RGBA8888 code 4BF05AFF, L 0.7764706, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.40565702, saturation 0.682674, and chroma 0.23076649.
    +
    This color constant "Mint Green" has RGBA8888 code 4BF05AFF, L 0.78431374, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.4019004, saturation 0.7842902, and chroma 0.23076649.
    MINT_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6557,7 +6589,7 @@

    M

    MOSS - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "moss" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.38294512, saturation 0.6363817, and chroma 0.11062346.
    +
    This color constant "moss" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.94280905, and chroma 0.11062346.
    MOSS - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -6581,7 +6613,7 @@

    M

    MOSS_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Moss Green" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.38294512, saturation 0.6363817, and chroma 0.11062346.
    +
    This color constant "Moss Green" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.94280905, and chroma 0.11062346.
    MOSS_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6609,7 +6641,7 @@

    M

    MULBERRY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Mulberry" has RGBA8888 code 641464FF, L 0.23921569, A 0.5647059, B 0.45490196, alpha 1.0, hue 0.90311134, saturation 0.6878521, and chroma 0.15712644.
    +
    This color constant "Mulberry" has RGBA8888 code 641464FF, L 0.23529412, A 0.5647059, B 0.45490196, alpha 1.0, hue 0.90858525, saturation 0.86163646, and chroma 0.15712644.
    MULBERRY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6643,7 +6675,7 @@

    M

    MUMMY_BROWN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Mummy Brown" has RGBA8888 code 7F3F00FF, L 0.3254902, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15801254, saturation 0.7598891, and chroma 0.107261956.
    +
    This color constant "Mummy Brown" has RGBA8888 code 7F3F00FF, L 0.32156864, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15640444, saturation 0.93046486, and chroma 0.107261956.
    MUMMY_BROWN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6671,7 +6703,7 @@

    M

    MURK - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Murk" has RGBA8888 code 0F192DFF, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.71857655, saturation 0.28808865, and chroma 0.059754133.
    +
    This color constant "Murk" has RGBA8888 code 0F192DFF, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.72740346, saturation 0.48765984, and chroma 0.059754133.
    MURK - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6699,7 +6731,7 @@

    M

    MUSH - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.6666667, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.30842525, saturation 0.8074922, and chroma 0.1632233.
    +
    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.6745098, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.3035705, saturation 0.96316457, and chroma 0.1632233.
    MUSH - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6916,7 +6948,7 @@

    N

    NAVY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "navy" has RGBA8888 code 000080FF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.7282781, saturation 0.96145123, and chroma 0.20108652.
    +
    This color constant "navy" has RGBA8888 code 000080FF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.73098123, saturation 0.9874258, and chroma 0.20108652.
    NAVY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -6940,7 +6972,7 @@

    N

    NAVY_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Navy Blue" has RGBA8888 code 162C52FF, L 0.16862746, A 0.49019608, B 0.45882353, alpha 1.0, hue 0.7127991, saturation 0.3497842, and chroma 0.084324345.
    +
    This color constant "Navy Blue" has RGBA8888 code 162C52FF, L 0.16470589, A 0.49019608, B 0.45882353, alpha 1.0, hue 0.71857655, saturation 0.63737744, and chroma 0.084324345.
    NAVY_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6968,7 +7000,7 @@

    N

    NIGHTSHADE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Nightshade" has RGBA8888 code 321623FF, L 0.11764706, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.96857655, saturation 0.25154528, and chroma 0.059754133.
    +
    This color constant "Nightshade" has RGBA8888 code 321623FF, L 0.11372549, A 0.5254902, B 0.49411765, alpha 1.0, hue 0.97740346, saturation 0.5050763, and chroma 0.052115876.
    NIGHTSHADE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -6996,7 +7028,7 @@

    N

    NINJA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Ninja" has RGBA8888 code 1F1F3BFF, L 0.1254902, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.7778107, saturation 0.15748447, and chroma 0.06743233.
    +
    This color constant "Ninja" has RGBA8888 code 1F1F3BFF, L 0.12156863, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.78898686, saturation 0.4022542, and chroma 0.06743233.
    NINJA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7031,7 +7063,7 @@

    O

    OCEAN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Ocean Blue" has RGBA8888 code 00007FFF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.7282781, saturation 0.96145123, and chroma 0.20108652.
    +
    This color constant "Ocean Blue" has RGBA8888 code 00007FFF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.73098123, saturation 0.9874258, and chroma 0.20108652.
    OCEAN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7059,7 +7091,7 @@

    O

    OCHRE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Ochre" has RGBA8888 code 5F3214FF, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15858527, saturation 0.5838377, and chroma 0.079095535.
    +
    This color constant "Ochre" has RGBA8888 code 5F3214FF, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15640444, saturation 0.8320503, and chroma 0.079095535.
    OCHRE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7150,7 +7182,7 @@

    O

    OLD_ROSE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, L 0.7058824, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.954483, saturation 0.16594002, and chroma 0.069218926.
    +
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, L 0.70980394, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.96519506, saturation 0.46097723, and chroma 0.069218926.
    OLD_ROSE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7174,7 +7206,7 @@

    O

    OLIVE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "olive" has RGBA8888 code 818000FF, L 0.49019608, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.31318712, saturation 0.76235455, and chroma 0.13131043.
    +
    This color constant "olive" has RGBA8888 code 818000FF, L 0.49019608, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.30708748, saturation 0.9493337, and chroma 0.13131043.
    OLIVE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -7198,7 +7230,7 @@

    O

    OLIVE_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Olive Green" has RGBA8888 code 3B573BFF, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.42138404, saturation 0.19425261, and chroma 0.05767509.
    +
    This color constant "Olive Green" has RGBA8888 code 3B573BFF, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.40640444, saturation 0.3795317, and chroma 0.05767509.
    OLIVE_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7226,7 +7258,7 @@

    O

    OLIVE_OIL - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Olive Oil" has RGBA8888 code A2A255FF, L 0.62352943, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30935085, saturation 0.3080419, and chroma 0.096477255.
    +
    This color constant "Olive Oil" has RGBA8888 code A2A255FF, L 0.627451, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30119568, saturation 0.6023386, and chroma 0.096477255.
    OLIVE_OIL - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7266,11 +7298,11 @@

    O

    ORANGE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Orange" has RGBA8888 code FF7F00FF, L 0.6509804, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.15541562, saturation 0.8137945, and chroma 0.17443058.
    +
    This color constant "Orange" has RGBA8888 code FF7F00FF, L 0.654902, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.1544865, saturation 0.979648, and chroma 0.17443058.
    ORANGE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "orange" has RGBA8888 code FF7F00FF, L 0.6509804, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.15541562, saturation 0.8137945, and chroma 0.17443058.
    +
    This color constant "orange" has RGBA8888 code FF7F00FF, L 0.654902, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.1544865, saturation 0.979648, and chroma 0.17443058.
    ORANGE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7302,7 +7334,7 @@

    O

    ORCHID - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Orchid" has RGBA8888 code BD62FFFF, L 0.58431375, A 0.5686275, B 0.4117647, alpha 1.0, hue 0.8552204, saturation 0.9180143, and chroma 0.22269051.
    +
    This color constant "Orchid" has RGBA8888 code BD62FFFF, L 0.5882353, A 0.5686275, B 0.4117647, alpha 1.0, hue 0.8591479, saturation 0.9973804, and chroma 0.22269051.
    ORCHID - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7395,7 +7427,7 @@

    P

    PASTEL_SKY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pastel Sky" has RGBA8888 code ABE3E3FF, L 0.83137256, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.55842525, saturation 0.12433905, and chroma 0.054407768.
    +
    This color constant "Pastel Sky" has RGBA8888 code ABE3E3FF, L 0.8392157, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.3085149, and chroma 0.054407768.
    PASTEL_SKY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7423,7 +7455,7 @@

    P

    PATINA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Patina" has RGBA8888 code ABC7E3FF, L 0.7647059, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.68210673, saturation 0.22452903, and chroma 0.0471994.
    +
    This color constant "Patina" has RGBA8888 code ABC7E3FF, L 0.77254903, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.689452, saturation 0.4682752, and chroma 0.0471994.
    PATINA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7451,7 +7483,7 @@

    P

    PEA_SOUP - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pea Soup" has RGBA8888 code 8EBE55FF, L 0.6784314, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.36230367, saturation 0.3804915, and chroma 0.13854803.
    +
    This color constant "Pea Soup" has RGBA8888 code 8EBE55FF, L 0.68235296, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.35600415, saturation 0.6594257, and chroma 0.13854803.
    PEA_SOUP - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7491,11 +7523,11 @@

    P

    PEACH - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Peach" has RGBA8888 code FFBF81FF, L 0.79607844, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.19064914, saturation 0.6557377, and chroma 0.096477255.
    +
    This color constant "Peach" has RGBA8888 code FFBF81FF, L 0.8039216, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.1871773, saturation 0.962963, and chroma 0.096477255.
    PEACH - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "peach" has RGBA8888 code FFBF81FF, L 0.79607844, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.19064914, saturation 0.6557377, and chroma 0.096477255.
    +
    This color constant "peach" has RGBA8888 code FFBF81FF, L 0.8039216, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.1871773, saturation 0.962963, and chroma 0.096477255.
    PEACH - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7523,7 +7555,7 @@

    P

    PEAR - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "pear" has RGBA8888 code D3E330FF, L 0.8235294, A 0.45882353, B 0.58431375, alpha 1.0, hue 0.32230157, saturation 0.7434462, and chroma 0.18692946.
    +
    This color constant "pear" has RGBA8888 code D3E330FF, L 0.8352941, A 0.45882353, B 0.58431375, alpha 1.0, hue 0.31789324, saturation 0.911928, and chroma 0.18692946.
    PEAR - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -7547,7 +7579,7 @@

    P

    PEAT_BOG - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Peat Bog" has RGBA8888 code 465032FF, L 0.29803923, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.35914788, saturation 0.16971225, and chroma 0.055518243.
    +
    This color constant "Peat Bog" has RGBA8888 code 465032FF, L 0.29411766, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.34359556, saturation 0.4973174, and chroma 0.055518243.
    PEAT_BOG - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7575,7 +7607,7 @@

    P

    PENCIL_YELLOW - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pencil Yellow" has RGBA8888 code FFEA4AFF, L 0.88235295, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.29171178, saturation 0.62957466, and chroma 0.1658202.
    +
    This color constant "Pencil Yellow" has RGBA8888 code FFEA4AFF, L 0.89411765, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.28720093, saturation 0.9385666, and chroma 0.1658202.
    PENCIL_YELLOW - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7603,7 +7635,7 @@

    P

    PERIWINKLE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Periwinkle" has RGBA8888 code 8181FFFF, L 0.5803922, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.77569586, saturation 0.8777893, and chroma 0.17017984.
    +
    This color constant "Periwinkle" has RGBA8888 code 8181FFFF, L 0.58431375, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.779965, saturation 0.95011365, and chroma 0.17017984.
    PERIWINKLE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7631,7 +7663,7 @@

    P

    PINE_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pine Green" has RGBA8888 code 235037FF, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.44383267, saturation 0.5838377, and chroma 0.079095535.
    +
    This color constant "Pine Green" has RGBA8888 code 235037FF, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.43344522, saturation 0.6792316, and chroma 0.079095535.
    PINE_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7655,7 +7687,7 @@

    P

    PINK - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "pink" has RGBA8888 code FFA0E0FF, L 0.7607843, A 0.5568628, B 0.4745098, alpha 1.0, hue 0.9329364, saturation 0.68139654, and chroma 0.124142565.
    +
    This color constant "pink" has RGBA8888 code FFA0E0FF, L 0.76862746, A 0.5568628, B 0.4745098, alpha 1.0, hue 0.939452, saturation 0.9503232, and chroma 0.124142565.
    PINK - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -7679,7 +7711,7 @@

    P

    PINK_LEMONADE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pink Lemonade" has RGBA8888 code FF6AC5FF, L 0.654902, A 0.5921569, B 0.47058824, alpha 1.0, hue 0.95084393, saturation 0.7901956, and chroma 0.19271713.
    +
    This color constant "Pink Lemonade" has RGBA8888 code FF6AC5FF, L 0.65882355, A 0.5921569, B 0.47058824, alpha 1.0, hue 0.954842, saturation 0.9433962, and chroma 0.19271713.
    PINK_LEMONADE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7707,7 +7739,7 @@

    P

    PINK_SKIN_1 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pink Skin 1" has RGBA8888 code AB7373FF, L 0.5254902, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.05653231, and chroma 0.061763234.
    +
    This color constant "Pink Skin 1" has RGBA8888 code AB7373FF, L 0.5294118, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.2670001, and chroma 0.061763234.
    PINK_SKIN_1 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7735,7 +7767,7 @@

    P

    PINK_SKIN_2 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pink Skin 2" has RGBA8888 code C78F8FFF, L 0.6313726, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.1156203, and chroma 0.061763234.
    +
    This color constant "Pink Skin 2" has RGBA8888 code C78F8FFF, L 0.63529414, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.3883638, and chroma 0.061763234.
    PINK_SKIN_2 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7763,7 +7795,7 @@

    P

    PINK_SKIN_3 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pink Skin 3" has RGBA8888 code E3ABABFF, L 0.73333335, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.03609712, saturation 0.17939028, and chroma 0.052115876.
    +
    This color constant "Pink Skin 3" has RGBA8888 code E3ABABFF, L 0.7411765, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.044284336, saturation 0.52000785, and chroma 0.052115876.
    PINK_SKIN_3 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7791,7 +7823,7 @@

    P

    PINK_SKIN_4 - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pink Skin 4" has RGBA8888 code F8D2DAFF, L 0.85490197, A 0.5176471, B 0.49803922, alpha 1.0, hue 0.9823789, saturation 0.30119374, and chroma 0.0353726.
    +
    This color constant "Pink Skin 4" has RGBA8888 code F8D2DAFF, L 0.8627451, A 0.5176471, B 0.49803922, alpha 1.0, hue 1.2950972E-5, saturation 0.71428573, and chroma 0.0353726.
    PINK_SKIN_4 - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7819,7 +7851,7 @@

    P

    PINK_TUTU - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pink Tutu" has RGBA8888 code F8C6FCFF, L 0.8392157, A 0.5294118, B 0.4745098, alpha 1.0, hue 0.88634074, saturation 0.6563932, and chroma 0.07753685.
    +
    This color constant "Pink Tutu" has RGBA8888 code F8C6FCFF, L 0.8509804, A 0.5294118, B 0.4745098, alpha 1.0, hue 0.8975709, saturation 0.90909094, and chroma 0.07753685.
    PINK_TUTU - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7847,7 +7879,7 @@

    P

    PINK_VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pink Violet" has RGBA8888 code 8F578FFF, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.13027532, and chroma 0.1008085.
    +
    This color constant "Pink Violet" has RGBA8888 code 8F578FFF, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.37792477, and chroma 0.1008085.
    PINK_VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7875,7 +7907,7 @@

    P

    PISTACHIO - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pistachio" has RGBA8888 code A2D8A2FF, L 0.7764706, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.41646945, saturation 0.11585842, and chroma 0.08575976.
    +
    This color constant "Pistachio" has RGBA8888 code A2D8A2FF, L 0.78431374, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.40640444, saturation 0.30904725, and chroma 0.08575976.
    PISTACHIO - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7903,7 +7935,7 @@

    P

    PLATINUM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Platinum" has RGBA8888 code DBDBDBFF, L 0.84705883, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.005259698, and chroma 0.0055242716.
    +
    This color constant "Platinum" has RGBA8888 code DBDBDBFF, L 0.85490197, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    PLATINUM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7927,7 +7959,7 @@

    P

    PLUM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "plum" has RGBA8888 code BE0DC6FF, L 0.45490196, A 0.6117647, B 0.42352942, alpha 1.0, hue 0.90448654, saturation 0.9074911, and chroma 0.26978588.
    +
    This color constant "plum" has RGBA8888 code BE0DC6FF, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9050996, saturation 0.9399402, and chroma 0.26337513.
    PLUM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -7951,7 +7983,7 @@

    P

    PLUM_JUICE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Plum Juice" has RGBA8888 code A01982FF, L 0.36862746, A 0.59607846, B 0.45882353, alpha 1.0, hue 0.9355687, saturation 0.8027682, and chroma 0.2082438.
    +
    This color constant "Plum Juice" has RGBA8888 code A01982FF, L 0.3647059, A 0.5921569, B 0.45882353, alpha 1.0, hue 0.9371773, saturation 0.88135594, and chroma 0.20108652.
    PLUM_JUICE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -7979,7 +8011,7 @@

    P

    POLISHED_SAPPHIRE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Polished Sapphire" has RGBA8888 code 101CDAFF, L 0.2784314, A 0.4862745, B 0.3647059, alpha 1.0, hue 0.73390174, saturation 0.80083245, and chroma 0.2709147.
    +
    This color constant "Polished Sapphire" has RGBA8888 code 101CDAFF, L 0.27450982, A 0.4862745, B 0.3647059, alpha 1.0, hue 0.73599005, saturation 0.898213, and chroma 0.2709147.
    POLISHED_SAPPHIRE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8007,7 +8039,7 @@

    P

    PORK_CHOP - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Pork Chop" has RGBA8888 code FFC0CBFF, L 0.81960785, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.010589795, saturation 0.53777516, and chroma 0.058723815.
    +
    This color constant "Pork Chop" has RGBA8888 code FFC0CBFF, L 0.827451, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.019803474, saturation 0.89580643, and chroma 0.058723815.
    PORK_CHOP - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8017,43 +8049,43 @@

    P

    This color constant "Pork Chop" has RGBA8888 code FFC0CBFF, luma 0.85098046, warmth 0.6, mildness 0.4784314, alpha 1.0, hue 0.9726776, and saturation 0.96825445.
    -
    Pow(int) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolation.Pow
    +
    Pow(int) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations.Pow
     
    -
    pow2 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow2 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow2In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow2In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
    Slow, then fast.
    -
    pow2InInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow2InInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow2Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow2Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
    Fast, then slow.
    -
    pow2OutInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow2OutInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow3 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow3 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow3In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow3In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow3InInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow3InInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow3Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow3Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow3OutInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow3OutInverse - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow4 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow4 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow4In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow4In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow4Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow4Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow5 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow5 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow5In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow5In - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    pow5Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    pow5Out - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    POWDER_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.cielab.Palette
    @@ -8073,7 +8105,7 @@

    P

    POWDER_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Powder Blue" has RGBA8888 code 5AC5FFFF, L 0.72156864, A 0.4627451, B 0.4509804, alpha 1.0, hue 0.6465574, saturation 0.8283974, and chroma 0.12265874.
    +
    This color constant "Powder Blue" has RGBA8888 code 5AC5FFFF, L 0.7254902, A 0.4627451, B 0.4509804, alpha 1.0, hue 0.6475709, saturation 0.90909094, and chroma 0.12265874.
    POWDER_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8083,9 +8115,9 @@

    P

    This color constant "Powder Blue" has RGBA8888 code 5AC5FFFF, luma 0.6431373, warmth 0.1764706, mildness 0.38431376, alpha 1.0, hue 0.5585859, and saturation 1.0.
    -
    PowIn(int) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolation.PowIn
    +
    PowIn(int) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations.PowIn
     
    -
    PowOut(int) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolation.PowOut
    +
    PowOut(int) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations.PowOut
     
    PRASE - Static variable in class com.github.tommyettinger.colorful.pure.cielab.Palette
    @@ -8105,7 +8137,7 @@

    P

    PRASE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Prase" has RGBA8888 code 05B450FF, L 0.5882353, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4218265, saturation 0.9324576, and chroma 0.19048727.
    +
    This color constant "Prase" has RGBA8888 code 05B450FF, L 0.5921569, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4173693, saturation 0.9127084, and chroma 0.19048727.
    PRASE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8159,7 +8191,7 @@

    P

    PRUNE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Prune" has RGBA8888 code 463246FF, L 0.22352941, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.057617728, and chroma 0.044538103.
    +
    This color constant "Prune" has RGBA8888 code 463246FF, L 0.21960784, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.2591534, and chroma 0.044538103.
    PRUNE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8187,7 +8219,7 @@

    P

    PRUSSIAN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Prussian Blue" has RGBA8888 code 004A9CFF, L 0.3019608, A 0.47843137, B 0.42352942, alpha 1.0, hue 0.70625466, saturation 0.86775005, and chroma 0.1582875.
    +
    This color constant "Prussian Blue" has RGBA8888 code 004A9CFF, L 0.3019608, A 0.47843137, B 0.42352942, alpha 1.0, hue 0.7090507, saturation 0.98234415, and chroma 0.1582875.
    PRUSSIAN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8215,7 +8247,7 @@

    P

    PUCE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Puce" has RGBA8888 code BCAFC0FF, L 0.70980394, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.83601886, saturation 0.025520736, and chroma 0.022777155.
    +
    This color constant "Puce" has RGBA8888 code BCAFC0FF, L 0.7176471, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.875, saturation 0.13797206, and chroma 0.022777155.
    PUCE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8255,11 +8287,11 @@

    P

    PURPLE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Purple" has RGBA8888 code DA20E0FF, L 0.5294118, A 0.6156863, B 0.41960785, alpha 1.0, hue 0.90333164, saturation 0.81673986, and chroma 0.28065258.
    +
    This color constant "Purple" has RGBA8888 code DA20E0FF, L 0.5294118, A 0.6156863, B 0.41960785, alpha 1.0, hue 0.90640444, saturation 0.91279775, and chroma 0.28065258.
    PURPLE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "purple" has RGBA8888 code C000FFFF, L 0.49803922, A 0.60784316, B 0.3882353, alpha 1.0, hue 0.8721605, saturation 0.96817255, and chroma 0.30940855.
    +
    This color constant "purple" has RGBA8888 code C000FFFF, L 0.49803922, A 0.6039216, B 0.3882353, alpha 1.0, hue 0.8721089, saturation 0.9847418, and chroma 0.30403575.
    PURPLE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8291,7 +8323,7 @@

    P

    PURPLE_FREESIA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Purple Freesia" has RGBA8888 code 9C41FFFF, L 0.49411765, A 0.5686275, B 0.3882353, alpha 1.0, hue 0.83765215, saturation 0.9001559, and chroma 0.2612811.
    +
    This color constant "Purple Freesia" has RGBA8888 code 9C41FFFF, L 0.49411765, A 0.5647059, B 0.39215687, alpha 1.0, hue 0.83944297, saturation 0.95242125, and chroma 0.25054872.
    PURPLE_FREESIA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8319,7 +8351,7 @@

    P

    PUTTY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Putty" has RGBA8888 code BF3F3FFF, L 0.44313726, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.06128862, saturation 0.408064, and chroma 0.15595676.
    +
    This color constant "Putty" has RGBA8888 code BF3F3FFF, L 0.4392157, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.063416936, saturation 0.6871843, and chroma 0.15595676.
    PUTTY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8348,6 +8380,18 @@

    R

    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    +
    raiseB(float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to increase its blue channel by change.
    +
    +
    raiseG(float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to increase its green channel by change.
    +
    +
    raiseR(float, float) - Static method in class com.github.tommyettinger.colorful.pure.rgb.ColorTools
    +
    +
    Interpolates from the packed float color start to increase its red channel by change.
    +
    randomColor(Random) - Static method in class com.github.tommyettinger.colorful.pure.cielab.ColorTools
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    @@ -8469,11 +8513,11 @@

    R

    RASPBERRY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Raspberry" has RGBA8888 code 911437FF, L 0.3019608, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.02692472, saturation 0.73546606, and chroma 0.16247371.
    +
    This color constant "Raspberry" has RGBA8888 code 911437FF, L 0.29803923, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.029965011, saturation 0.9096833, and chroma 0.16247371.
    RASPBERRY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "raspberry" has RGBA8888 code 911437FF, L 0.3019608, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.02692472, saturation 0.73546606, and chroma 0.16247371.
    +
    This color constant "raspberry" has RGBA8888 code 911437FF, L 0.29803923, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.029965011, saturation 0.9096833, and chroma 0.16247371.
    RASPBERRY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8505,7 +8549,7 @@

    R

    RAW_MEAT - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Raw Meat" has RGBA8888 code FF8181FF, L 0.6745098, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.05119568, saturation 0.77551675, and chroma 0.13587911.
    +
    This color constant "Raw Meat" has RGBA8888 code FF8181FF, L 0.6784314, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.053987134, saturation 0.9744733, and chroma 0.13587911.
    RAW_MEAT - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8573,11 +8617,11 @@

    R

    RED - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.07928106, saturation 0.8972241, and chroma 0.25345513.
    +
    This color constant "Red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.08024464, saturation 0.98868626, and chroma 0.25345513.
    RED - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.07928106, saturation 0.8972241, and chroma 0.25345513.
    +
    This color constant "red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.08024464, saturation 0.98868626, and chroma 0.25345513.
    RED - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8637,7 +8681,7 @@

    R

    REDWOOD - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Redwood" has RGBA8888 code B45A00FF, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15767807, saturation 0.7703894, and chroma 0.13542919.
    +
    This color constant "Redwood" has RGBA8888 code B45A00FF, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15640444, saturation 0.9245003, and chroma 0.13542919.
    REDWOOD - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8665,7 +8709,7 @@

    R

    REFRESHING_MIST - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Refreshing Mist" has RGBA8888 code 91EBFFFF, L 0.84313726, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59551346, saturation 0.88296545, and chroma 0.08992863.
    +
    This color constant "Refreshing Mist" has RGBA8888 code 91EBFFFF, L 0.8509804, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59359556, saturation 0.94057864, and chroma 0.08992863.
    REFRESHING_MIST - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8717,7 +8761,7 @@

    R

    RIPE_PLUM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Ripe Plum" has RGBA8888 code AB57ABFF, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.9052252, saturation 0.23956598, and chroma 0.14626285.
    +
    This color constant "Ripe Plum" has RGBA8888 code AB57ABFF, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.911086, saturation 0.5099449, and chroma 0.14626285.
    RIPE_PLUM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8745,7 +8789,7 @@

    R

    RIPPED_DENIM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Ripped Denim" has RGBA8888 code 699DC3FF, L 0.59607846, A 0.47843137, B 0.46666667, alpha 1.0, hue 0.65858525, saturation 0.21667327, and chroma 0.079095535.
    +
    This color constant "Ripped Denim" has RGBA8888 code 699DC3FF, L 0.6, A 0.47843137, B 0.46666667, alpha 1.0, hue 0.6610861, saturation 0.4492372, and chroma 0.079095535.
    RIPPED_DENIM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8773,7 +8817,7 @@

    R

    ROBIN_EGG_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Robin Egg Blue" has RGBA8888 code 08DED5FF, L 0.7490196, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5297675, saturation 0.90882874, and chroma 0.14709508.
    +
    This color constant "Robin Egg Blue" has RGBA8888 code 08DED5FF, L 0.7529412, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5262961, saturation 0.96043617, and chroma 0.14709508.
    ROBIN_EGG_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8813,11 +8857,11 @@

    R

    ROSE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Rose" has RGBA8888 code E61E78FF, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.7659808, and chroma 0.23076649.
    +
    This color constant "Rose" has RGBA8888 code E61E78FF, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99470973, saturation 0.90959585, and chroma 0.23076649.
    ROSE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "rose" has RGBA8888 code E61E78FF, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.7659808, and chroma 0.23076649.
    +
    This color constant "rose" has RGBA8888 code E61E78FF, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99470973, saturation 0.90959585, and chroma 0.23076649.
    ROSE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8849,7 +8893,7 @@

    R

    ROSEATE_SPOONBILL - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Roseate Spoonbill" has RGBA8888 code C87DA0FF, L 0.6, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.96592754, saturation 0.13739227, and chroma 0.091942206.
    +
    This color constant "Roseate Spoonbill" has RGBA8888 code C87DA0FF, L 0.6039216, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.9737039, saturation 0.40551752, and chroma 0.091942206.
    ROSEATE_SPOONBILL - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8881,7 +8925,7 @@

    R

    ROUGH_SAPPHIRE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Rough Sapphire" has RGBA8888 code 4A5AFFFF, L 0.45490196, A 0.5019608, B 0.38431373, alpha 1.0, hue 0.75268954, saturation 0.891392, and chroma 0.23050185.
    +
    This color constant "Rough Sapphire" has RGBA8888 code 4A5AFFFF, L 0.45490196, A 0.5019608, B 0.38431373, alpha 1.0, hue 0.75547296, saturation 0.9672412, and chroma 0.23050185.
    ROUGH_SAPPHIRE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8909,7 +8953,7 @@

    R

    ROYAL_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Royal Blue" has RGBA8888 code 0010BDFF, L 0.22745098, A 0.4862745, B 0.37254903, alpha 1.0, hue 0.7329173, saturation 0.8848403, and chroma 0.25537437.
    +
    This color constant "Royal Blue" has RGBA8888 code 0010BDFF, L 0.22745098, A 0.4862745, B 0.37254903, alpha 1.0, hue 0.7351178, saturation 0.94530344, and chroma 0.25537437.
    ROYAL_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8937,7 +8981,7 @@

    R

    ROYAL_VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Royal Violet" has RGBA8888 code 573B73FF, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.84872866, saturation 0.18195479, and chroma 0.1008085.
    +
    This color constant "Royal Violet" has RGBA8888 code 573B73FF, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.8573997, saturation 0.43411013, and chroma 0.1008085.
    ROYAL_VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -8980,11 +9024,11 @@

    S

    SAFFRON - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Saffron" has RGBA8888 code FFD510FF, L 0.83137256, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27457327, saturation 0.8132536, and chroma 0.17789528.
    +
    This color constant "Saffron" has RGBA8888 code FFD510FF, L 0.84313726, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27065513, saturation 0.9467276, and chroma 0.17789528.
    SAFFRON - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "saffron" has RGBA8888 code FFD510FF, L 0.83137256, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27457327, saturation 0.8132536, and chroma 0.17789528.
    +
    This color constant "saffron" has RGBA8888 code FFD510FF, L 0.84313726, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27065513, saturation 0.9467276, and chroma 0.17789528.
    SAFFRON - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9012,7 +9056,7 @@

    S

    SAGE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "sage" has RGBA8888 code ABE3C5FF, L 0.81960785, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.118390046, and chroma 0.069218926.
    +
    This color constant "sage" has RGBA8888 code ABE3C5FF, L 0.83137256, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.34176013, and chroma 0.069218926.
    SAGE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -9036,7 +9080,7 @@

    S

    SAGE_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Sage Green" has RGBA8888 code B4EECAFF, L 0.85490197, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.19143423, and chroma 0.069218926.
    +
    This color constant "Sage Green" has RGBA8888 code B4EECAFF, L 0.8666667, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.47466686, and chroma 0.069218926.
    SAGE_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9076,11 +9120,11 @@

    S

    SALMON - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Salmon" has RGBA8888 code FF6262FF, L 0.6117647, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06254671, saturation 0.8039996, and chroma 0.17337766.
    +
    This color constant "Salmon" has RGBA8888 code FF6262FF, L 0.6156863, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06443131, saturation 0.9722263, and chroma 0.17337766.
    SALMON - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "salmon" has RGBA8888 code FF6262FF, L 0.6117647, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06254671, saturation 0.8039996, and chroma 0.17337766.
    +
    This color constant "salmon" has RGBA8888 code FF6262FF, L 0.6156863, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06443131, saturation 0.9722263, and chroma 0.17337766.
    SALMON - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9143,7 +9187,7 @@

    S

    SCRIBE_INK - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Scribe Ink" has RGBA8888 code 280A1EFF, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9378436, saturation 0.51980007, and chroma 0.071815535.
    +
    This color constant "Scribe Ink" has RGBA8888 code 280A1EFF, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9488043, saturation 0.79056937, and chroma 0.071815535.
    SCRIBE_INK - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9171,7 +9215,7 @@

    S

    SEAFOAM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Seafoam" has RGBA8888 code 3CFEA5FF, L 0.827451, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.44880432, saturation 0.81632656, and chroma 0.18528971.
    +
    This color constant "Seafoam" has RGBA8888 code 3CFEA5FF, L 0.8352941, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.4445043, saturation 0.9753916, and chroma 0.18528971.
    SEAFOAM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9199,7 +9243,7 @@

    S

    SEAL_BROWN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Seal Brown" has RGBA8888 code 551414FF, L 0.17254902, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.07099588, saturation 0.4878964, and chroma 0.09959023.
    +
    This color constant "Seal Brown" has RGBA8888 code 551414FF, L 0.16862746, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.073790275, saturation 0.7892004, and chroma 0.09959023.
    SEAL_BROWN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9227,7 +9271,7 @@

    S

    SEAWATER - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Seawater" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.543443, saturation 0.89123964, and chroma 0.10141215.
    +
    This color constant "Seawater" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.53898686, saturation 0.95148593, and chroma 0.10141215.
    SEAWATER - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9261,7 +9305,7 @@

    S

    SHADOW - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Shadow" has RGBA8888 code 252525FF, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.007346189, and chroma 0.0055242716.
    +
    This color constant "Shadow" has RGBA8888 code 252525FF, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    SHADOW - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9271,7 +9315,7 @@

    S

    This color constant "Shadow" has RGBA8888 code 252525FF, luma 0.14509805, warmth 0.49803925, mildness 0.49803925, alpha 1.0, hue 0.0, and saturation 0.0.
    -
    shape - Variable in class com.github.tommyettinger.colorful.pure.Interpolation.BiasGain
    +
    shape - Variable in class com.github.tommyettinger.colorful.pure.Interpolations.BiasGain
    The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the values ease into their starting and ending levels), or to be the inverse when less than 1 (where values @@ -9296,7 +9340,7 @@

    S

    SHARP_AZURE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Sharp Azure" has RGBA8888 code 007FFFFF, L 0.5137255, A 0.47058824, B 0.4, alpha 1.0, hue 0.704483, saturation 0.9514351, and chroma 0.20765679.
    +
    This color constant "Sharp Azure" has RGBA8888 code 007FFFFF, L 0.5176471, A 0.47058824, B 0.4, alpha 1.0, hue 0.706557, saturation 0.9796796, and chroma 0.20765679.
    SHARP_AZURE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9324,7 +9368,7 @@

    S

    SHINING_SKY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Shining Sky" has RGBA8888 code 55E6FFFF, L 0.8, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5843938, saturation 0.8966475, and chroma 0.13131043.
    +
    This color constant "Shining Sky" has RGBA8888 code 55E6FFFF, L 0.80784315, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5826307, saturation 0.97724336, and chroma 0.13131043.
    SHINING_SKY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9352,7 +9396,7 @@

    S

    SHRIMP - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Shrimp" has RGBA8888 code FAA0B9FF, L 0.7411765, A 0.54901963, B 0.49803922, alpha 1.0, hue 0.99364984, saturation 0.59266275, and chroma 0.09773435.
    +
    This color constant "Shrimp" has RGBA8888 code FAA0B9FF, L 0.7490196, A 0.54901963, B 0.49803922, alpha 1.0, hue 1.2950972E-5, saturation 0.8965517, and chroma 0.09773435.
    SHRIMP - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9380,7 +9424,7 @@

    S

    SIENNA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Sienna" has RGBA8888 code 7F0000FF, L 0.24705882, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.07915777, saturation 0.8381556, and chroma 0.1555649.
    +
    This color constant "Sienna" has RGBA8888 code 7F0000FF, L 0.24313726, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.080711745, saturation 0.9805362, and chroma 0.1555649.
    SIENNA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9420,11 +9464,11 @@

    S

    SILVER - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Silver" has RGBA8888 code B6B6B6FF, L 0.7176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0013493, and chroma 0.0055242716.
    +
    This color constant "Silver" has RGBA8888 code B6B6B6FF, L 0.72156864, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    SILVER - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "silver" has RGBA8888 code B6B6B6FF, L 0.7176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0013493, and chroma 0.0055242716.
    +
    This color constant "silver" has RGBA8888 code B6B6B6FF, L 0.72156864, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    SILVER - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9456,7 +9500,7 @@

    S

    SILVER_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Silver Green" has RGBA8888 code 8FC78FFF, L 0.7137255, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.41176948, saturation 0.15616, and chroma 0.096477255.
    +
    This color constant "Silver Green" has RGBA8888 code 8FC78FFF, L 0.72156864, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.40278715, saturation 0.3538132, and chroma 0.096477255.
    SILVER_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9484,7 +9528,7 @@

    S

    SILVER_PINK - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Silver Pink" has RGBA8888 code E3C7E3FF, L 0.8117647, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.12307692, and chroma 0.044538103.
    +
    This color constant "Silver Pink" has RGBA8888 code E3C7E3FF, L 0.8235294, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.4021346, and chroma 0.044538103.
    SILVER_PINK - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9556,11 +9600,11 @@

    S

    faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should consider its more-precise and sometimes-faster MathUtils.sinDeg() method.
  • -
    sine - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    sine - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    sineIn - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    sineIn - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    sineOut - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    sineOut - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    SKY - Static variable in class com.github.tommyettinger.colorful.pure.cielab.SimplePalette
    @@ -9576,7 +9620,7 @@

    S

    SKY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "sky" has RGBA8888 code 10C0E0FF, L 0.67058825, A 0.44313726, B 0.4627451, alpha 1.0, hue 0.59232193, saturation 0.8547556, and chroma 0.13542919.
    +
    This color constant "sky" has RGBA8888 code 10C0E0FF, L 0.6745098, A 0.44313726, B 0.4627451, alpha 1.0, hue 0.59094226, saturation 0.9246287, and chroma 0.13542919.
    SKY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -9600,7 +9644,7 @@

    S

    SLATE_GRAY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Slate Gray" has RGBA8888 code 6E8287FF, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59872866, saturation 0.07457798, and chroma 0.033602834.
    +
    This color constant "Slate Gray" has RGBA8888 code 6E8287FF, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59359556, saturation 0.24037008, and chroma 0.033602834.
    SLATE_GRAY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9628,7 +9672,7 @@

    S

    SLOW_CREEK - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Slow Creek" has RGBA8888 code 7E9494FF, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5644313, saturation 0.05491124, and chroma 0.029749114.
    +
    This color constant "Slow Creek" has RGBA8888 code 7E9494FF, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5511957, saturation 0.20401792, and chroma 0.029749114.
    SLOW_CREEK - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9638,7 +9682,7 @@

    S

    This color constant "Slow Creek" has RGBA8888 code 7E9494FF, luma 0.54509807, warmth 0.454902, mildness 0.49803925, alpha 1.0, hue 0.5, and saturation 0.09704647.
    -
    slowFast - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    slowFast - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    SMOG - Static variable in class com.github.tommyettinger.colorful.pure.cielab.Palette
    @@ -9658,7 +9702,7 @@

    S

    SMOG - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Smog" has RGBA8888 code ABABE3FF, L 0.69803923, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.35029587, and chroma 0.07513822.
    +
    This color constant "Smog" has RGBA8888 code ABABE3FF, L 0.7058824, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.6146363, and chroma 0.07513822.
    SMOG - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9668,13 +9712,13 @@

    S

    This color constant "Smog" has RGBA8888 code ABABE3FF, luma 0.69803923, warmth 0.38823533, mildness 0.38823533, alpha 1.0, hue 0.6666667, and saturation 0.5000003.
    -
    smooth - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    smooth - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
    Aka "smoothstep".
    -
    smooth2 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    smooth2 - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    smoother - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    smoother - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
    By Ken Perlin.
    @@ -9696,7 +9740,7 @@

    S

    SOAP - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Soap" has RGBA8888 code D7C3FAFF, L 0.8, A 0.5176471, B 0.46666667, alpha 1.0, hue 0.8274942, saturation 0.6699864, and chroma 0.07513822.
    +
    This color constant "Soap" has RGBA8888 code D7C3FAFF, L 0.8117647, A 0.5176471, B 0.46666667, alpha 1.0, hue 0.8389139, saturation 0.8984744, and chroma 0.07513822.
    SOAP - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9724,7 +9768,7 @@

    S

    SOFT_TEAL - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Soft Teal" has RGBA8888 code 129880FF, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.49488065, saturation 0.9107692, and chroma 0.12115674.
    +
    This color constant "Soft Teal" has RGBA8888 code 129880FF, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.4894102, saturation 0.93958104, and chroma 0.12115674.
    SOFT_TEAL - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9752,7 +9796,7 @@

    S

    SPACE_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Space Blue" has RGBA8888 code 0C2148FF, L 0.1254902, A 0.49019608, B 0.45490196, alpha 1.0, hue 0.7159276, saturation 0.49365115, and chroma 0.091942206.
    +
    This color constant "Space Blue" has RGBA8888 code 0C2148FF, L 0.1254902, A 0.49019608, B 0.45490196, alpha 1.0, hue 0.72136545, saturation 0.7710579, and chroma 0.091942206.
    SPACE_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9780,7 +9824,7 @@

    S

    SPEARMINT - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Spearmint" has RGBA8888 code 64ABABFF, L 0.61960787, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.5409493, saturation 0.32430163, and chroma 0.07674564.
    +
    This color constant "Spearmint" has RGBA8888 code 64ABABFF, L 0.62352943, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.53480494, saturation 0.5587603, and chroma 0.07674564.
    SPEARMINT - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9808,7 +9852,7 @@

    S

    SPRING_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Spring Green" has RGBA8888 code 00DE6AFF, L 0.7176471, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42491466, saturation 0.94792074, and chroma 0.21487926.
    +
    This color constant "Spring Green" has RGBA8888 code 00DE6AFF, L 0.72156864, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42098877, saturation 0.9252436, and chroma 0.21487926.
    SPRING_GREEN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9836,7 +9880,7 @@

    S

    STEAM - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Steam" has RGBA8888 code 7DD7F0FF, L 0.7764706, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6063733, saturation 0.5221653, and chroma 0.0945603.
    +
    This color constant "Steam" has RGBA8888 code 7DD7F0FF, L 0.78431374, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6052204, saturation 0.71260965, and chroma 0.0945603.
    STEAM - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9864,7 +9908,7 @@

    S

    STRAW - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Straw" has RGBA8888 code EDEDC7FF, L 0.8980392, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.33071172, saturation 0.029941387, and chroma 0.040217306.
    +
    This color constant "Straw" has RGBA8888 code EDEDC7FF, L 0.90588236, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.310548, saturation 0.1923273, and chroma 0.040217306.
    STRAW - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9896,7 +9940,7 @@

    S

    STRONG_CYAN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Strong Cyan" has RGBA8888 code 00BFFFFF, L 0.68235296, A 0.44705883, B 0.44313726, alpha 1.0, hue 0.63067734, saturation 0.9115982, and chroma 0.15477823.
    +
    This color constant "Strong Cyan" has RGBA8888 code 00BFFFFF, L 0.6862745, A 0.44705883, B 0.44313726, alpha 1.0, hue 0.6308874, saturation 0.95524865, and chroma 0.15477823.
    STRONG_CYAN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9924,7 +9968,7 @@

    S

    STYGIAN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Stygian Blue" has RGBA8888 code 0F0F50FF, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.7454664, saturation 0.71185946, and chroma 0.13677454.
    +
    This color constant "Stygian Blue" has RGBA8888 code 0F0F50FF, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.75, saturation 0.85, and chroma 0.13677454.
    STYGIAN_BLUE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9962,7 +10006,7 @@

    S

    SUBTLETY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Subtlety" has RGBA8888 code 786EF0FF, L 0.52156866, A 0.5176471, B 0.4117647, alpha 1.0, hue 0.78142345, saturation 0.68371075, and chroma 0.1792624.
    +
    This color constant "Subtlety" has RGBA8888 code 786EF0FF, L 0.52156866, A 0.5176471, B 0.4117647, alpha 1.0, hue 0.7855691, saturation 0.85135955, and chroma 0.1792624.
    SUBTLETY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -9990,7 +10034,7 @@

    S

    SUDS - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Suds" has RGBA8888 code BEB9FAFF, L 0.75686276, A 0.50980395, B 0.45882353, alpha 1.0, hue 0.7872009, saturation 0.71664745, and chroma 0.084324345.
    +
    This color constant "Suds" has RGBA8888 code BEB9FAFF, L 0.7647059, A 0.50980395, B 0.45882353, alpha 1.0, hue 0.7963767, saturation 0.8700256, and chroma 0.084324345.
    SUDS - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10000,17 +10044,17 @@

    S

    This color constant "Suds" has RGBA8888 code BEB9FAFF, luma 0.76470596, warmth 0.3803922, mildness 0.37254903, alpha 1.0, hue 0.6744792, and saturation 0.8648653.
    -
    swing - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    swing - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    Swing(float) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolation.Swing
    +
    Swing(float) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations.Swing
     
    -
    swingIn - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    swingIn - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    SwingIn(float) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolation.SwingIn
    +
    SwingIn(float) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations.SwingIn
     
    -
    swingOut - Static variable in class com.github.tommyettinger.colorful.pure.Interpolation
    +
    swingOut - Static variable in class com.github.tommyettinger.colorful.pure.Interpolations
     
    -
    SwingOut(float) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolation.SwingOut
    +
    SwingOut(float) - Constructor for class com.github.tommyettinger.colorful.pure.Interpolations.SwingOut
     
  • T

    @@ -10045,11 +10089,11 @@

    T

    TAN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Tan" has RGBA8888 code DADAABFF, L 0.83137256, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.30842525, saturation 0.06777885, and chroma 0.054407768.
    +
    This color constant "Tan" has RGBA8888 code DADAABFF, L 0.8392157, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.29428434, saturation 0.2854945, and chroma 0.054407768.
    TAN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "tan" has RGBA8888 code D2B48CFF, L 0.7294118, A 0.5058824, B 0.5254902, alpha 1.0, hue 0.21390288, saturation 0.08232166, and chroma 0.052115876.
    +
    This color constant "tan" has RGBA8888 code D2B48CFF, L 0.73333335, A 0.5058824, B 0.5254902, alpha 1.0, hue 0.20571564, saturation 0.33091408, and chroma 0.052115876.
    TAN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10081,7 +10125,7 @@

    T

    TARNISH - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Tarnish" has RGBA8888 code ABC78FFF, L 0.7372549, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3636593, saturation 0.100864, and chroma 0.07753685.
    +
    This color constant "Tarnish" has RGBA8888 code ABC78FFF, L 0.74509805, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3524291, saturation 0.35714287, and chroma 0.07753685.
    TARNISH - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10109,7 +10153,7 @@

    T

    TAUPE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Taupe" has RGBA8888 code 3B2D1FFF, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.18556869, saturation 0.12547323, and chroma 0.029749114.
    +
    This color constant "Taupe" has RGBA8888 code 3B2D1FFF, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.17620972, saturation 0.4259177, and chroma 0.029749114.
    TAUPE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10137,7 +10181,7 @@

    T

    TAXICAB_YELLOW - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Taxicab Yellow" has RGBA8888 code F6BD31FF, L 0.77254903, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24593177, saturation 0.6745706, and chroma 0.15239382.
    +
    This color constant "Taxicab Yellow" has RGBA8888 code F6BD31FF, L 0.78039217, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24205942, saturation 0.8706515, and chroma 0.15239382.
    TAXICAB_YELLOW - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10165,7 +10209,7 @@

    T

    TEA_ROSE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Tea Rose" has RGBA8888 code E1B9D2FF, L 0.7764706, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.93210673, saturation 0.11585003, and chroma 0.0471994.
    +
    This color constant "Tea Rose" has RGBA8888 code E1B9D2FF, L 0.78431374, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.9488043, saturation 0.42163703, and chroma 0.0471994.
    TEA_ROSE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10189,7 +10233,7 @@

    T

    TEAL - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "teal" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.543443, saturation 0.89123964, and chroma 0.10141215.
    +
    This color constant "teal" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.53898686, saturation 0.95148593, and chroma 0.10141215.
    TEAL - Static variable in class com.github.tommyettinger.colorful.pure.rgb.SimplePalette
    @@ -10213,7 +10257,7 @@

    T

    THICK_AMETHYST - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Thick Amethyst" has RGBA8888 code 5010B0FF, L 0.27058825, A 0.5411765, B 0.39215687, alpha 1.0, hue 0.8080369, saturation 0.887296, and chroma 0.22997166.
    +
    This color constant "Thick Amethyst" has RGBA8888 code 5010B0FF, L 0.26666668, A 0.5411765, B 0.39607844, alpha 1.0, hue 0.81369054, saturation 0.9256127, and chroma 0.22269051.
    THICK_AMETHYST - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10241,7 +10285,7 @@

    T

    THIN_AMETHYST - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Thin Amethyst" has RGBA8888 code 7F00FFFF, L 0.40784314, A 0.5647059, B 0.3647059, alpha 1.0, hue 0.8209959, saturation 0.97398543, and chroma 0.29877067.
    +
    This color constant "Thin Amethyst" has RGBA8888 code 7F00FFFF, L 0.40392157, A 0.5647059, B 0.36862746, alpha 1.0, hue 0.82570946, saturation 0.97687954, and chroma 0.29174224.
    THIN_AMETHYST - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10269,7 +10313,7 @@

    T

    THISTLE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Thistle" has RGBA8888 code E673FFFF, L 0.6666667, A 0.5803922, B 0.43137255, alpha 1.0, hue 0.8875299, saturation 0.8491489, and chroma 0.2105755.
    +
    This color constant "Thistle" has RGBA8888 code E673FFFF, L 0.67058825, A 0.5764706, B 0.43137255, alpha 1.0, hue 0.88786715, saturation 0.97217816, and chroma 0.20469645.
    THISTLE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10297,7 +10341,7 @@

    T

    THULIAN_PINK - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Thulian Pink" has RGBA8888 code C35A91FF, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.95994633, saturation 0.24846612, and chroma 0.1411665.
    +
    This color constant "Thulian Pink" has RGBA8888 code C35A91FF, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.96519506, saturation 0.51941097, and chroma 0.1411665.
    THULIAN_PINK - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10431,11 +10475,11 @@

    T

    TRANSPARENT - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +
    This color constant "Transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    TRANSPARENT - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +
    This color constant "transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    TRANSPARENT - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10493,7 +10537,7 @@

    T

    TROPIC_MIST - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Tropic Mist" has RGBA8888 code D0DAF8FF, L 0.84705883, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.735567, saturation 0.5078044, and chroma 0.04314594.
    +
    This color constant "Tropic Mist" has RGBA8888 code D0DAF8FF, L 0.85490197, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.75, saturation 0.7692308, and chroma 0.04314594.
    TROPIC_MIST - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10503,7 +10547,7 @@

    T

    This color constant "Tropic Mist" has RGBA8888 code D0DAF8FF, luma 0.854902, warmth 0.41960788, mildness 0.43921572, alpha 1.0, hue 0.625, and saturation 0.74074113.
    -
    turning - Variable in class com.github.tommyettinger.colorful.pure.Interpolation.BiasGain
    +
    turning - Variable in class com.github.tommyettinger.colorful.pure.Interpolations.BiasGain
    A value between 0.0 and 1.0, inclusive, where the shape changes.
    @@ -10537,11 +10581,11 @@

    T

    TURQUOISE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Turquoise" has RGBA8888 code 2DEBA8FF, L 0.77254903, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.46014452, saturation 0.83749604, and chroma 0.17337766.
    +
    This color constant "Turquoise" has RGBA8888 code 2DEBA8FF, L 0.78039217, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.45571566, saturation 0.89144206, and chroma 0.17337766.
    TURQUOISE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "turquoise" has RGBA8888 code 2ED6C9FF, L 0.7254902, A 0.43137255, B 0.49019608, alpha 1.0, hue 0.52259654, saturation 0.8433125, and chroma 0.1381068.
    +
    This color constant "turquoise" has RGBA8888 code 2ED6C9FF, L 0.73333335, A 0.43137255, B 0.49019608, alpha 1.0, hue 0.51864916, saturation 0.9009075, and chroma 0.1381068.
    TURQUOISE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10573,7 +10617,7 @@

    T

    TWILIGHT_CLOUD - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Twilight Cloud" has RGBA8888 code 8F8FC7FF, L 0.59607846, A 0.5058824, B 0.45882353, alpha 1.0, hue 0.77259654, saturation 0.22724403, and chroma 0.082864076.
    +
    This color constant "Twilight Cloud" has RGBA8888 code 8F8FC7FF, L 0.6, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.42881602, and chroma 0.07513822.
    TWILIGHT_CLOUD - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10601,7 +10645,7 @@

    T

    TYRIAN_PURPLE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Tyrian Purple" has RGBA8888 code BF3FBFFF, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9039804, saturation 0.51023114, and chroma 0.21345432.
    +
    This color constant "Tyrian Purple" has RGBA8888 code BF3FBFFF, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9080125, saturation 0.73224163, and chroma 0.21345432.
    TYRIAN_PURPLE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10632,7 +10676,7 @@

    U

    UMBER - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Umber" has RGBA8888 code 7F7F00FF, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.31318712, saturation 0.76235455, and chroma 0.13131043.
    +
    This color constant "Umber" has RGBA8888 code 7F7F00FF, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.30708748, saturation 0.9493337, and chroma 0.13131043.
    UMBER - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10663,7 +10707,7 @@

    V

    VAPOR - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Vapor" has RGBA8888 code 90B0FFFF, L 0.7019608, A 0.49411765, B 0.44313726, alpha 1.0, hue 0.7335864, saturation 0.9137329, and chroma 0.11388578.
    +
    This color constant "Vapor" has RGBA8888 code 90B0FFFF, L 0.7058824, A 0.49411765, B 0.44313726, alpha 1.0, hue 0.73865414, saturation 0.9679771, and chroma 0.11388578.
    VAPOR - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10691,7 +10735,7 @@

    V

    VARISCITE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Variscite" has RGBA8888 code 6AFFCDFF, L 0.85490197, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47740343, saturation 0.80115366, and chroma 0.1381068.
    +
    This color constant "Variscite" has RGBA8888 code 6AFFCDFF, L 0.8666667, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47218934, saturation 1.0154516, and chroma 0.1381068.
    VARISCITE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10719,7 +10763,7 @@

    V

    VARNISH - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Varnish" has RGBA8888 code 401811FF, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.3516231, and chroma 0.068331465.
    +
    This color constant "Varnish" has RGBA8888 code 401811FF, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.62893206, and chroma 0.068331465.
    VARNISH - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10759,11 +10803,11 @@

    V

    VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Violet" has RGBA8888 code 8C14BEFF, L 0.37254903, A 0.58431375, B 0.40784314, alpha 1.0, hue 0.8679365, saturation 0.8906447, and chroma 0.24883763.
    +
    This color constant "Violet" has RGBA8888 code 8C14BEFF, L 0.36862746, A 0.5803922, B 0.40784314, alpha 1.0, hue 0.86777616, saturation 0.9296962, and chroma 0.24363229.
    VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "violet" has RGBA8888 code 9040EFFF, L 0.4627451, A 0.56078434, B 0.39607844, alpha 1.0, hue 0.8342395, saturation 0.6792487, and chroma 0.23984502.
    +
    This color constant "violet" has RGBA8888 code 9040EFFF, L 0.4627451, A 0.56078434, B 0.39607844, alpha 1.0, hue 0.83780813, saturation 0.84801877, and chroma 0.23984502.
    VIOLET - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10795,7 +10839,7 @@

    V

    VIOLET_CUSHIONS - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Violet Cushions" has RGBA8888 code 8F57C7FF, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8425412, saturation 0.3077058, and chroma 0.16359681.
    +
    This color constant "Violet Cushions" has RGBA8888 code 8F57C7FF, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8478395, saturation 0.56239605, and chroma 0.16359681.
    VIOLET_CUSHIONS - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10823,7 +10867,7 @@

    V

    VIRIDIAN - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Viridian" has RGBA8888 code 507D5FFF, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.4378436, saturation 0.24035555, and chroma 0.071815535.
    +
    This color constant "Viridian" has RGBA8888 code 507D5FFF, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.42620972, saturation 0.4472136, and chroma 0.071815535.
    VIRIDIAN - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10858,7 +10902,7 @@

    W

    WATERCOLOR_BLACK - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Watercolor Black" has RGBA8888 code 3B3B57FF, L 0.24313726, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.7860971, saturation 0.047061935, and chroma 0.052115876.
    +
    This color constant "Watercolor Black" has RGBA8888 code 3B3B57FF, L 0.23921569, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.8011957, saturation 0.21808812, and chroma 0.052115876.
    WATERCOLOR_BLACK - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10886,7 +10930,7 @@

    W

    WATERCOLOR_GRAY - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Watercolor Gray" has RGBA8888 code 736EAAFF, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.7840724, saturation 0.14647366, and chroma 0.091942206.
    +
    This color constant "Watercolor Gray" has RGBA8888 code 736EAAFF, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.79236877, saturation 0.37382802, and chroma 0.091942206.
    WATERCOLOR_GRAY - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10918,7 +10962,7 @@

    W

    WET_STONE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Wet Stone" has RGBA8888 code A6A090FF, L 0.63529414, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.28142345, saturation 0.014394464, and chroma 0.019918045.
    +
    This color constant "Wet Stone" has RGBA8888 code A6A090FF, L 0.6392157, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.25, saturation 0.15, and chroma 0.019918045.
    WET_STONE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10958,11 +11002,11 @@

    W

    WHITE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "White" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +
    This color constant "White" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    WHITE - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "white" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +
    This color constant "white" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    WHITE - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -10994,7 +11038,7 @@

    W

    WISTERIA - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Wisteria" has RGBA8888 code BD29FFFF, L 0.5137255, A 0.59607846, B 0.39215687, alpha 1.0, hue 0.865835, saturation 0.9033923, and chroma 0.28773978.
    +
    This color constant "Wisteria" has RGBA8888 code BD29FFFF, L 0.5137255, A 0.59607846, B 0.39215687, alpha 1.0, hue 0.86888635, saturation 0.98124635, and chroma 0.28773978.
    WISTERIA - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -11022,7 +11066,7 @@

    W

    WOODLANDS - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Woodlands" has RGBA8888 code 3C6E14FF, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.375, saturation 0.63123345, and chroma 0.1381068.
    +
    This color constant "Woodlands" has RGBA8888 code 3C6E14FF, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.3686421, saturation 0.90727216, and chroma 0.1381068.
    WOODLANDS - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -11070,11 +11114,11 @@

    Y

    YELLOW - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Yellow" has RGBA8888 code FFFF00FF, L 0.92941177, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.30886024, saturation 0.92988807, and chroma 0.20529193.
    +
    This color constant "Yellow" has RGBA8888 code FFFF00FF, L 0.9411765, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.3049839, saturation 1.3285329, and chroma 0.20529193.
    YELLOW - Static variable in class com.github.tommyettinger.colorful.pure.oklab.SimplePalette
    -
    This color constant "yellow" has RGBA8888 code FFFF00FF, L 0.92941177, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.30886024, saturation 0.92988807, and chroma 0.20529193.
    +
    This color constant "yellow" has RGBA8888 code FFFF00FF, L 0.9411765, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.3049839, saturation 1.3285329, and chroma 0.20529193.
    YELLOW - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    @@ -11109,7 +11153,7 @@

    Z

    ZUCCHINI - Static variable in class com.github.tommyettinger.colorful.pure.oklab.Palette
    -
    This color constant "Zucchini" has RGBA8888 code 123832FF, L 0.18431373, A 0.47058824, B 0.49803922, alpha 1.0, hue 0.5105898, saturation 0.7379592, and chroma 0.058723815.
    +
    This color constant "Zucchini" has RGBA8888 code 123832FF, L 0.18039216, A 0.4745098, B 0.49803922, alpha 1.0, hue 0.49998704, saturation 0.7058824, and chroma 0.050931267.
    ZUCCHINI - Static variable in class com.github.tommyettinger.colorful.pure.rgb.Palette
    diff --git a/docs/colorful-pure/apidocs/index.html b/docs/colorful-pure/apidocs/index.html index 75e9e442..7bc0a711 100644 --- a/docs/colorful-pure/apidocs/index.html +++ b/docs/colorful-pure/apidocs/index.html @@ -2,7 +2,7 @@ -Overview (colorful-pure 0.8.2 API) +Overview (colorful-pure 0.8.3 API) @@ -48,7 +48,7 @@
    -

    colorful-pure 0.8.2 API

    +

    colorful-pure 0.8.3 API

    Packages
    diff --git a/docs/colorful-pure/apidocs/member-search-index.js b/docs/colorful-pure/apidocs/member-search-index.js index 60f8e239..a53e3657 100644 --- a/docs/colorful-pure/apidocs/member-search-index.js +++ b/docs/colorful-pure/apidocs/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BiasGain","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Bounce","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BounceIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BounceOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Elastic","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ElasticIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ElasticOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Exp","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ExpIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ExpOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Pow","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.PowIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.PowOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Swing","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.SwingIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.SwingOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"apply(float, float, float)","u":"apply(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(double, double)","u":"atan2_(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(float, float)","u":"atan2_(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(double, double)","u":"atan2(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(float, float)","u":"atan2(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(double, double)","u":"atan2Degrees(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(float, float)","u":"atan2Degrees(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(double, double)","u":"atan2Degrees360(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(float, float)","u":"atan2Degrees360(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"barronSpline(float, float, float)","u":"barronSpline(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BiasGain","l":"BiasGain(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"bounce"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Bounce","l":"Bounce(float[], float[])","u":"%3Cinit%3E(float[],float[])"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Bounce","l":"Bounce(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"bounceIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BounceIn","l":"BounceIn(float[], float[])","u":"%3Cinit%3E(float[],float[])"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BounceIn","l":"BounceIn(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"bounceOut"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BounceOut","l":"BounceOut(float[], float[])","u":"%3Cinit%3E(float[],float[])"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BounceOut","l":"BounceOut(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"channelH(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"channelS(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaMild(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaWarm(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielab(float, float, float, float)","u":"cielab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabByHCL(float, float, float, float)","u":"cielabByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabByHSL(float, float, float, float)","u":"cielabByHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabHue(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"circle"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"circleIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"circleOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"clamp(float, float, float, float)","u":"clamp(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"clamp(float, float, float, float)","u":"clamp(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"cool(float, float)","u":"cool(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cosDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"editCIELAB(float, float, float, float, float)","u":"editCIELAB(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"editCIELAB(float, float, float, float, float, float, float, float, float)","u":"editCIELAB(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"editHSLuv(float, float, float, float, float)","u":"editHSLuv(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"editHSLuv(float, float, float, float, float, float, float, float, float)","u":"editHSLuv(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float)","u":"editOklab(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float, float, float, float, float)","u":"editOklab(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float)","u":"editRGB(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float, float, float, float, float)","u":"editRGB(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"elastic"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Elastic","l":"Elastic(float, float, int, float)","u":"%3Cinit%3E(float,float,int,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"elasticIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ElasticIn","l":"ElasticIn(float, float, int, float)","u":"%3Cinit%3E(float,float,int,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"elasticOut"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ElasticOut","l":"ElasticOut(float, float, int, float)","u":"%3Cinit%3E(float,float,int,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Exp","l":"Exp(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"exp10"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"exp10In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"exp10Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"exp5"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"exp5In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"exp5Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ExpIn","l":"ExpIn(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.ExpOut","l":"ExpOut(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"fade"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"fastSlow"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"FloatColors()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"floor(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"forwardLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"forwardLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float, float, float, float)","u":"fromHSI(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"getRawGamutValue(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float, float, float, float)","u":"hsl2rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluv(float, float, float, float)","u":"hsluv(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvByHCL(float, float, float, float)","u":"hsluvByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvHue(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"Interpolation()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"lerp(float, float, float)","u":"lerp(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"linear"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"luma(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"makeGradient(float, float, int, Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"makeGradient(float, float, int, Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"makeGradient(float, float, int, Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"makeGradient(float, float, int, Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"makeGradient(float, float, int, Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"makeGradient(float, float, int, Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"makeGradient(float, float, int, Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"MathTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"multiplyAlpha(float, float)","u":"multiplyAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"norm(float, float, float)","u":"norm(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklab(float, float, float, float)","u":"oklab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabByHCL(float, float, float, float)","u":"oklabByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabByHSL(float, float, float, float)","u":"oklabByHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabHue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Pow","l":"Pow(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow2"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow2In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow2InInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow2Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow2OutInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow3"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow3In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow3InInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow3Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow3OutInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow4"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow4In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow4Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow5"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow5In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"pow5Out"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.PowIn","l":"PowIn(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.PowOut","l":"PowOut(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"reverseLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"reverseLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"rgb(float, float, float, float)","u":"rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float, float, float, float)","u":"rgb2hsl(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"rotateH(float, float)","u":"rotateH(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"setAlpha(float, float)","u":"setAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BiasGain","l":"shape"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sinDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"sine"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"sineIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"sineOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"slowFast"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"smooth"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"smooth2"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"smoother"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"strengthen(float, float)","u":"strengthen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"swing"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.Swing","l":"Swing(float)","u":"%3Cinit%3E(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"swingIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.SwingIn","l":"SwingIn(float)","u":"%3Cinit%3E(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation","l":"swingOut"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.SwingOut","l":"SwingOut(float)","u":"%3Cinit%3E(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolation.BiasGain","l":"turning"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"warm(float, float)","u":"warm(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"weaken(float, float)","u":"weaken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ycwcm(float, float, float, float)","u":"ycwcm(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ZUCCHINI"}];updateSearchResults(); \ No newline at end of file +memberSearchIndex = [{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ABSINTHE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"acos(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AIR_FORCE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ALIASES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alpha(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"alphaInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AMAZONITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ANGEL_WING"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradient(FloatList, float, float, int)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,float...)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, float...)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,float...)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendGradientChain(FloatList, int, Interpolations.Interpolation, FloatList)","u":"appendGradientChain(com.github.tommyettinger.ds.FloatList,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation,com.github.tommyettinger.ds.FloatList)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"appendPartialGradient(FloatList, float, float, int, Interpolations.Interpolation)","u":"appendPartialGradient(com.github.tommyettinger.ds.FloatList,float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APPLE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BiasGain","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Bounce","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BounceIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BounceOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Elastic","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ElasticIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ElasticOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Exp","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ExpIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ExpOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Interpolation","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Pow","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.PowIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.PowOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Swing","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.SwingIn","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.SwingOut","l":"apply(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Interpolation","l":"apply(float, float, float)","u":"apply(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"APRICOT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AQUAMARINE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARMY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ARTICHOKE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"asin(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ASPARAGUS"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(double, double)","u":"atan2_(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2_(float, float)","u":"atan2_(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(double, double)","u":"atan2(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2(float, float)","u":"atan2(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(double, double)","u":"atan2Degrees(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees(float, float)","u":"atan2Degrees(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(double, double)","u":"atan2Degrees360(double,double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atan2Degrees360(float, float)","u":"atan2Degrees360(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"atanDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"AVOCADO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BANANA_PUDDING"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"barronSpline(float, float, float)","u":"barronSpline(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BEIGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"bestMatch(float, int)","u":"bestMatch(float,int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BiasGain","l":"BiasGain(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLACKLIGHT_GLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blot(float, float)","u":"blot(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_EYE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_SMOKE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUE_STEEL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blue(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BLUEBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"blueInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOLOGNA"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"bounce"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Bounce","l":"Bounce(float[], float[])","u":"%3Cinit%3E(float[],float[])"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Bounce","l":"Bounce(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"bounceIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BounceIn","l":"BounceIn(float[], float[])","u":"%3Cinit%3E(float[],float[])"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BounceIn","l":"BounceIn(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"bounceOut"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BounceOut","l":"BounceOut(float[], float[])","u":"%3Cinit%3E(float[],float[])"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BounceOut","l":"BounceOut(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BOYSENBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRICK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRIGHT_RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BRONZE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BRONZE_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BROWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BROWN_VELVET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLE_GUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BUBBLEGUM_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"BURNT_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"BUTTER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CACTUS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CALM_SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CARMINE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CEDAR_WOOD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELADON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CELERY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelA(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelB(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"channelH(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"channelL(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"channelS(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHARTREUSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHERRY_SYRUP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHINCHILLA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CHIPPED_GRANITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CHOCOLATE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"chroma(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"chromaLimit(float, float)","u":"chromaLimit(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaMild(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"chromaWarm(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielab(float, float, float, float)","u":"cielab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabByHCL(float, float, float, float)","u":"cielabByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabByHSL(float, float, float, float)","u":"cielabByHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabHue(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"cielabSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CINNAMON"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"circle"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"circleIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"circleOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"clamp(float, float, float, float)","u":"clamp(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"clamp(float, float, float, float)","u":"clamp(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COAL_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COBALT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COLD_IRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"COLORS_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ColorTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"cool(float, float)","u":"cool(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORN_SILK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CORNFLOWER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cos(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"cosDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"COTTON_CANDY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CREAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CRICKET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"CYAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_PINE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DARK_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"darken(float, float)","u":"darken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_JUNGLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DEEP_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"DENIM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DENIM_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DESERT_RAIN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"differentiateLightness(float, float)","u":"differentiateLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"distance(float, float)","u":"distance(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"distanceSquared(float, float)","u":"distanceSquared(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRAB_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DREARY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIED_SAGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRIFTWOOD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_BRUSH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DRY_PEPPER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DULL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"dullen(float, float)","u":"dullen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUST_BUNNY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"DUSTY_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EARWAX"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"editCIELAB(float, float, float, float, float)","u":"editCIELAB(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"editCIELAB(float, float, float, float, float, float, float, float, float)","u":"editCIELAB(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"editHSLuv(float, float, float, float, float)","u":"editHSLuv(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"editHSLuv(float, float, float, float, float, float, float, float, float)","u":"editHSLuv(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float)","u":"editIPT(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"editIPT(float, float, float, float, float, float, float, float, float)","u":"editIPT(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float)","u":"editOklab(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"editOklab(float, float, float, float, float, float, float, float, float)","u":"editOklab(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float)","u":"editRGB(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"editRGB(float, float, float, float, float, float, float, float, float)","u":"editRGB(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"editYCwCm(float, float, float, float, float, float, float, float, float)","u":"editYCwCm(float,float,float,float,float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EGGPLANT"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"elastic"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Elastic","l":"Elastic(float, float, int, float)","u":"%3Cinit%3E(float,float,int,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"elasticIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ElasticIn","l":"ElasticIn(float, float, int, float)","u":"%3Cinit%3E(float,float,int,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"elasticOut"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ElasticOut","l":"ElasticOut(float, float, int, float)","u":"%3Cinit%3E(float,float,int,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ELECTRIC_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"EMBER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMBERS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMERALD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EMINENCE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"enrich(float, float)","u":"enrich(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"EUCALYPTUS"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Exp","l":"Exp(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"exp10"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"exp10In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"exp10Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"exp5"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"exp5In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"exp5Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ExpIn","l":"ExpIn(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.ExpOut","l":"ExpOut(float, float)","u":"%3Cinit%3E(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"fade"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fade(float, float)","u":"fade(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FADED_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"fastSlow"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FAWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FEATHER_DOWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"FERN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FERN_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLAMINGO"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"FloatColors()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"floatGetHSL(float, float, float, float)","u":"floatGetHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"floor(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FLORAL_FOAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FOREST_GLEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"forwardLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"forwardLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FROG_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromHSI(float, float, float, float)","u":"fromHSI(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA(float, float, float, float)","u":"fromRGBA(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"fromRGBA8888(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"FRUIT_PUNCH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GARTER_SNAKE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"getRawGamutValue(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_LOLLIPOP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPE_SODA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAPHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GRAY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"green(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"greenInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"GREYHOUND"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HELIOTROPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HIDDEN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HONEYDEW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOSPITAL_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HOT_SAUCE"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"hsl2rgb(float, float, float, float)","u":"hsl2rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluv(float, float, float, float)","u":"hsluv(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvByHCL(float, float, float, float)","u":"hsluvByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvHue(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hsluvSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"hue(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"HUNTER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INDIGO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"INFECTION"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inGamut(float, float, float)","u":"inGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"intensity(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Interpolation","l":"Interpolation()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"Interpolations()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"inverseLightness(float, float)","u":"inverseLightness(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IOLITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"ipt(float, float, float, float)","u":"ipt(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRIS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"IVY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"JUICY_GRAPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KELLY_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KOA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"KYANITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LAVENDER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LEAD"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"lerp(float, float, float)","u":"lerp(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lerpFloatColors(float, float, float)","u":"lerpFloatColors(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lerpFloatColorsBlended(float, float, float)","u":"lerpFloatColorsBlended(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lessenChange(float, float)","u":"lessenChange(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_5"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_6"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_7"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_8"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIGHT_SKIN_9"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lighten(float, float)","u":"lighten(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"lightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LILAC"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIME"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float)","u":"limitToGamut(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"limitToGamut(float, float, float, float)","u":"limitToGamut(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"linear"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LIZARD_SCALES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerA(float, float)","u":"lowerA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lowerB(float, float)","u":"lowerB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lowerG(float, float)","u":"lowerG(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"lowerR(float, float)","u":"lowerR(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"luma(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"LURID_RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAGENTA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAIDENHAIR_FERN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"makeGradient(float, float, int)","u":"makeGradient(float,float,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"GradientTools","l":"makeGradient(float, float, int, Interpolations.Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"GradientTools","l":"makeGradient(float, float, int, Interpolations.Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"GradientTools","l":"makeGradient(float, float, int, Interpolations.Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"GradientTools","l":"makeGradient(float, float, int, Interpolations.Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"GradientTools","l":"makeGradient(float, float, int, Interpolations.Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"GradientTools","l":"makeGradient(float, float, int, Interpolations.Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"GradientTools","l":"makeGradient(float, float, int, Interpolations.Interpolation)","u":"makeGradient(float,float,int,com.github.tommyettinger.colorful.pure.Interpolations.Interpolation)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MALACHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MARSH"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"MathTools()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MAUVE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"maximizeSaturation(float, float, float, float)","u":"maximizeSaturation(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MEDIUM_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MILD_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MINT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MINT_GREEN"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float, float)","u":"mix(float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float, float, float)","u":"mix(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float, float, float, float)","u":"mix(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float...)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"mix(float[], int, int)","u":"mix(float[],int,int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"MOSS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MOSS_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MULBERRY"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"multiplyAlpha(float, float)","u":"multiplyAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUMMY_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MURK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"MUSH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_HUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAMES_BY_LIGHTNESS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"NAVY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NAVY_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NIGHTSHADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"NINJA"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"norm(float, float, float)","u":"norm(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCEAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OCHRE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"offsetLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklab(float, float, float, float)","u":"oklab(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabByHCL(float, float, float, float)","u":"oklabByHCL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabByHSL(float, float, float, float)","u":"oklabByHSL(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabHue(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabLightness(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"oklabSaturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLD_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"OLIVE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"OLIVE_OIL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORANGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ORCHID"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"Palette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"parseDescription(String)","u":"parseDescription(java.lang.String)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PASTEL_SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PATINA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEA_SOUP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEACH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PEAR"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PEAT_BOG"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PENCIL_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PERIWINKLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_LEMONADE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_1"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_2"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_3"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_SKIN_4"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_TUTU"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PINK_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PISTACHIO"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLATINUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PLUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PLUM_JUICE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POLISHED_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PORK_CHOP"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Pow","l":"Pow(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow2"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow2In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow2InInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow2Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow2OutInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow3"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow3In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow3InInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow3Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow3OutInverse"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow4"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow4In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow4Out"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow5"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow5In"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"pow5Out"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"POWDER_BLUE"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.PowIn","l":"PowIn(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.PowOut","l":"PowOut(int)","u":"%3Cinit%3E(int)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRASE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanDown(float, float)","u":"protanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"protanUp(float, float)","u":"protanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUNE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PRUSSIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUCE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PURPLE_FREESIA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"PUTTY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseA(float, float)","u":"raiseA(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"raiseB(float, float)","u":"raiseB(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"raiseG(float, float)","u":"raiseG(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"raiseR(float, float)","u":"raiseR(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomColor(Random)","u":"randomColor(java.util.Random)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomEdit(float, long, float)","u":"randomEdit(float,long,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"randomizedColor(EnhancedRandom)","u":"randomizedColor(com.github.tommyettinger.random.EnhancedRandom)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RASPBERRY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RAW_MEAT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RED"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"red(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"redInt(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REDWOOD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"REFRESHING_MIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"reverseLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"reverseLight(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"rgb(float, float, float, float)","u":"rgb(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"rgb2hsl(float, float, float, float)","u":"rgb2hsl(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPE_PLUM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"RIPPED_DENIM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROBIN_EGG_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROSEATE_SPOONBILL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"rotateH(float, float)","u":"rotateH(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROUGH_SAPPHIRE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ROYAL_VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAFFRON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SAGE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SAGE_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SALMON"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"saturation(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SCRIBE_INK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAFOAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAL_BROWN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SEAWATER"},{"p":"com.github.tommyettinger.colorful.pure","c":"FloatColors","l":"setAlpha(float, float)","u":"setAlpha(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHADOW"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BiasGain","l":"shape"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHARP_AZURE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHINING_SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SHRIMP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SIENNA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SILVER_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SimplePalette()","u":"%3Cinit%3E()"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin_(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(double)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sin(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"MathTools","l":"sinDegrees(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"sine"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"sineIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"sineOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"SKY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLATE_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SLOW_CREEK"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"slowFast"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SMOG"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"smooth"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"smooth2"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"smoother"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOAP"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SOFT_TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPACE_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPEARMINT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SPRING_GREEN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STEAM"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRAW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"strengthen(float, float)","u":"strengthen(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STRONG_CYAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"STYGIAN_BLUE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"subrandomColor(float, float, float)","u":"subrandomColor(float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUBTLETY"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"SUDS"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"swing"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.Swing","l":"Swing(float)","u":"%3Cinit%3E(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"swingIn"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.SwingIn","l":"SwingIn(float)","u":"%3Cinit%3E(float)"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations","l":"swingOut"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.SwingOut","l":"SwingOut(float)","u":"%3Cinit%3E(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAN"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TARNISH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAUPE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TAXICAB_YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TEA_ROSE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TEAL"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THICK_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THIN_AMETHYST"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THISTLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"THULIAN_PINK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toEditedFloat(float, float, float, float, float)","u":"toEditedFloat(float,float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"toRGBA8888(float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TRANSPARENT"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritan(float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanDown(float, float)","u":"tritanDown(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"ColorTools","l":"tritanUp(float, float)","u":"tritanUp(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TROPIC_MIST"},{"p":"com.github.tommyettinger.colorful.pure","c":"Interpolations.BiasGain","l":"turning"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TURQUOISE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TWILIGHT_CLOUD"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"TYRIAN_PURPLE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"UMBER"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VAPOR"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARISCITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VARNISH"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIOLET_CUSHIONS"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"VIRIDIAN"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"warm(float, float)","u":"warm(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_BLACK"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WATERCOLOR_GRAY"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"weaken(float, float)","u":"weaken(float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WET_STONE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WHITE"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WISTERIA"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"WOODLANDS"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"ColorTools","l":"ycwcm(float, float, float, float)","u":"ycwcm(float,float,float,float)"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"SimplePalette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"YELLOW"},{"p":"com.github.tommyettinger.colorful.pure.cielab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ipt","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.oklab","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.rgb","c":"Palette","l":"ZUCCHINI"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","c":"Palette","l":"ZUCCHINI"}];updateSearchResults(); \ No newline at end of file diff --git a/docs/colorful-pure/apidocs/overview-summary.html b/docs/colorful-pure/apidocs/overview-summary.html index e7c16c6b..49801e42 100644 --- a/docs/colorful-pure/apidocs/overview-summary.html +++ b/docs/colorful-pure/apidocs/overview-summary.html @@ -2,7 +2,7 @@ -colorful-pure 0.8.2 API +colorful-pure 0.8.3 API diff --git a/docs/colorful-pure/apidocs/overview-tree.html b/docs/colorful-pure/apidocs/overview-tree.html index d303129b..709ce5df 100644 --- a/docs/colorful-pure/apidocs/overview-tree.html +++ b/docs/colorful-pure/apidocs/overview-tree.html @@ -2,7 +2,7 @@ -Class Hierarchy (colorful-pure 0.8.2 API) +Class Hierarchy (colorful-pure 0.8.3 API) @@ -81,36 +81,37 @@

    Class Hierarchy

  • com.github.tommyettinger.colorful.pure.oklab.GradientTools
  • com.github.tommyettinger.colorful.pure.rgb.GradientTools
  • com.github.tommyettinger.colorful.pure.ycwcm.GradientTools
  • -
  • com.github.tommyettinger.colorful.pure.Interpolation +
  • com.github.tommyettinger.colorful.pure.Interpolations
  • +
  • com.github.tommyettinger.colorful.pure.Interpolations.Interpolation
  • com.github.tommyettinger.colorful.pure.MathTools
  • diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html index fc6026ff..fa939cee 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/FloatColors.html @@ -15,7 +15,7 @@ 002 003import com.github.tommyettinger.colorful.pure.ycwcm.ColorTools; 004import com.github.tommyettinger.digital.BitConversion; -005 +005import com.github.tommyettinger.digital.MathTools; 006/** 007 * Various utility methods for working with colors encoded as packed floats in any of the formats this can use. 008 * <br> diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Exp.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Exp.html deleted file mode 100644 index ac6963ef..00000000 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Exp.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - -Source code - - - - - - -
    -
    -
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    -003 * 
    -004 * Licensed under the Apache License, Version 2.0 (the "License");
    -005 * you may not use this file except in compliance with the License.
    -006 * You may obtain a copy of the License at
    -007 * 
    -008 *   http://www.apache.org/licenses/LICENSE-2.0
    -009 * 
    -010 * Unless required by applicable law or agreed to in writing, software
    -011 * distributed under the License is distributed on an "AS IS" BASIS,
    -012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -013 * See the License for the specific language governing permissions and
    -014 * limitations under the License.
    -015 ******************************************************************************/
    -016
    -017package com.github.tommyettinger.colorful.pure;
    -018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    -020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    -037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    -043                }
    -044        };
    -045
    -046        //
    -047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    -063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    -068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    -114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    -140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    -173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    -177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    -302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    -401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    -429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    -442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpIn.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpIn.html deleted file mode 100644 index 5cda89bf..00000000 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpIn.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - -Source code - - - - - - -
    -
    -
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    -003 * 
    -004 * Licensed under the Apache License, Version 2.0 (the "License");
    -005 * you may not use this file except in compliance with the License.
    -006 * You may obtain a copy of the License at
    -007 * 
    -008 *   http://www.apache.org/licenses/LICENSE-2.0
    -009 * 
    -010 * Unless required by applicable law or agreed to in writing, software
    -011 * distributed under the License is distributed on an "AS IS" BASIS,
    -012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -013 * See the License for the specific language governing permissions and
    -014 * limitations under the License.
    -015 ******************************************************************************/
    -016
    -017package com.github.tommyettinger.colorful.pure;
    -018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    -020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    -037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    -043                }
    -044        };
    -045
    -046        //
    -047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    -063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    -068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    -114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    -140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    -173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    -177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    -302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    -401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    -429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    -442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpOut.html deleted file mode 100644 index 20bd4271..00000000 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ExpOut.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - -Source code - - - - - - -
    -
    -
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    -003 * 
    -004 * Licensed under the Apache License, Version 2.0 (the "License");
    -005 * you may not use this file except in compliance with the License.
    -006 * You may obtain a copy of the License at
    -007 * 
    -008 *   http://www.apache.org/licenses/LICENSE-2.0
    -009 * 
    -010 * Unless required by applicable law or agreed to in writing, software
    -011 * distributed under the License is distributed on an "AS IS" BASIS,
    -012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -013 * See the License for the specific language governing permissions and
    -014 * limitations under the License.
    -015 ******************************************************************************/
    -016
    -017package com.github.tommyettinger.colorful.pure;
    -018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    -020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    -037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    -043                }
    -044        };
    -045
    -046        //
    -047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    -063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    -068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    -114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    -140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    -173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    -177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    -302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    -401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    -429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    -442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Pow.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Pow.html deleted file mode 100644 index 4e197573..00000000 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Pow.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - -Source code - - - - - - -
    -
    -
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    -003 * 
    -004 * Licensed under the Apache License, Version 2.0 (the "License");
    -005 * you may not use this file except in compliance with the License.
    -006 * You may obtain a copy of the License at
    -007 * 
    -008 *   http://www.apache.org/licenses/LICENSE-2.0
    -009 * 
    -010 * Unless required by applicable law or agreed to in writing, software
    -011 * distributed under the License is distributed on an "AS IS" BASIS,
    -012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -013 * See the License for the specific language governing permissions and
    -014 * limitations under the License.
    -015 ******************************************************************************/
    -016
    -017package com.github.tommyettinger.colorful.pure;
    -018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    -020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    -037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    -043                }
    -044        };
    -045
    -046        //
    -047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    -063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    -068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    -114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    -140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    -173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    -177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    -302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    -401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    -429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    -442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.PowIn.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.PowIn.html deleted file mode 100644 index fbdb0853..00000000 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.PowIn.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - -Source code - - - - - - -
    -
    -
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    -003 * 
    -004 * Licensed under the Apache License, Version 2.0 (the "License");
    -005 * you may not use this file except in compliance with the License.
    -006 * You may obtain a copy of the License at
    -007 * 
    -008 *   http://www.apache.org/licenses/LICENSE-2.0
    -009 * 
    -010 * Unless required by applicable law or agreed to in writing, software
    -011 * distributed under the License is distributed on an "AS IS" BASIS,
    -012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -013 * See the License for the specific language governing permissions and
    -014 * limitations under the License.
    -015 ******************************************************************************/
    -016
    -017package com.github.tommyettinger.colorful.pure;
    -018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    -020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    -037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    -043                }
    -044        };
    -045
    -046        //
    -047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    -063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    -068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    -114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    -140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    -173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    -177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    -302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    -401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    -429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    -442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Swing.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Swing.html deleted file mode 100644 index ab20b024..00000000 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Swing.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - -Source code - - - - - - -
    -
    -
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    -003 * 
    -004 * Licensed under the Apache License, Version 2.0 (the "License");
    -005 * you may not use this file except in compliance with the License.
    -006 * You may obtain a copy of the License at
    -007 * 
    -008 *   http://www.apache.org/licenses/LICENSE-2.0
    -009 * 
    -010 * Unless required by applicable law or agreed to in writing, software
    -011 * distributed under the License is distributed on an "AS IS" BASIS,
    -012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -013 * See the License for the specific language governing permissions and
    -014 * limitations under the License.
    -015 ******************************************************************************/
    -016
    -017package com.github.tommyettinger.colorful.pure;
    -018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    -020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    -037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    -043                }
    -044        };
    -045
    -046        //
    -047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    -063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    -068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    -114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    -140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    -173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    -177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    -302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    -401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    -429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    -442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.html deleted file mode 100644 index 4e99271c..00000000 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.html +++ /dev/null @@ -1,557 +0,0 @@ - - - - -Source code - - - - - - -
    -
    -
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    -003 * 
    -004 * Licensed under the Apache License, Version 2.0 (the "License");
    -005 * you may not use this file except in compliance with the License.
    -006 * You may obtain a copy of the License at
    -007 * 
    -008 *   http://www.apache.org/licenses/LICENSE-2.0
    -009 * 
    -010 * Unless required by applicable law or agreed to in writing, software
    -011 * distributed under the License is distributed on an "AS IS" BASIS,
    -012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -013 * See the License for the specific language governing permissions and
    -014 * limitations under the License.
    -015 ******************************************************************************/
    -016
    -017package com.github.tommyettinger.colorful.pure;
    -018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    -020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    -037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    -043                }
    -044        };
    -045
    -046        //
    -047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    -063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    -068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    -114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    -140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    -173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    -177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    -302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    -401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    -429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    -442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ElasticIn.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BiasGain.html similarity index 79% rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ElasticIn.html rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BiasGain.html index c0d71b1a..039f1ad9 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ElasticIn.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BiasGain.html @@ -4,7 +4,7 @@ Source code - + @@ -12,7 +12,7 @@
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Bounce.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Bounce.html
    new file mode 100644
    index 00000000..898245b5
    --- /dev/null
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Bounce.html
    @@ -0,0 +1,565 @@
    +
    +
    +
    +
    +Source code
    +
    +
    +
    +
    +
    +
    +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BounceIn.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BounceIn.html new file mode 100644 index 00000000..ee1c9c0e --- /dev/null +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BounceIn.html @@ -0,0 +1,565 @@ + + + + +Source code + + + + + + +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ElasticOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BounceOut.html similarity index 79% rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ElasticOut.html rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BounceOut.html index 773fefe6..67f39176 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.ElasticOut.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.BounceOut.html @@ -4,7 +4,7 @@ Source code - + @@ -12,7 +12,7 @@
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.SwingOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Elastic.html
    similarity index 79%
    rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.SwingOut.html
    rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Elastic.html
    index c28b7c04..b5be7704 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.SwingOut.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Elastic.html
    @@ -4,7 +4,7 @@
     
     Source code
     
    -
    +
     
     
     
    @@ -12,7 +12,7 @@
     
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticIn.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticIn.html
    new file mode 100644
    index 00000000..c7e25694
    --- /dev/null
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticIn.html
    @@ -0,0 +1,565 @@
    +
    +
    +
    +
    +Source code
    +
    +
    +
    +
    +
    +
    +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticOut.html new file mode 100644 index 00000000..fbfe2024 --- /dev/null +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ElasticOut.html @@ -0,0 +1,565 @@ + + + + +Source code + + + + + + +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.SwingIn.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Exp.html similarity index 79% rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.SwingIn.html rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Exp.html index 3c4ec5d9..a2210c0c 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.SwingIn.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Exp.html @@ -4,7 +4,7 @@ Source code - + @@ -12,7 +12,7 @@
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.PowOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ExpIn.html
    similarity index 79%
    rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.PowOut.html
    rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ExpIn.html
    index 4cf8a25c..c6a0a439 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.PowOut.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ExpIn.html
    @@ -4,7 +4,7 @@
     
     Source code
     
    -
    +
     
     
     
    @@ -12,7 +12,7 @@
     
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ExpOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ExpOut.html
    new file mode 100644
    index 00000000..d055abc9
    --- /dev/null
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.ExpOut.html
    @@ -0,0 +1,565 @@
    +
    +
    +
    +
    +Source code
    +
    +
    +
    +
    +
    +
    +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Interpolation.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Interpolation.html new file mode 100644 index 00000000..d902505a --- /dev/null +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Interpolation.html @@ -0,0 +1,565 @@ + + + + +Source code + + + + + + +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BiasGain.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Pow.html similarity index 79% rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BiasGain.html rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Pow.html index f2df423c..f1b46c93 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BiasGain.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Pow.html @@ -4,7 +4,7 @@ Source code - + @@ -12,7 +12,7 @@
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Bounce.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.PowIn.html
    similarity index 79%
    rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Bounce.html
    rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.PowIn.html
    index dbf1dd73..72310ae8 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Bounce.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.PowIn.html
    @@ -4,7 +4,7 @@
     
     Source code
     
    -
    +
     
     
     
    @@ -12,7 +12,7 @@
     
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.PowOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.PowOut.html
    new file mode 100644
    index 00000000..ddda561c
    --- /dev/null
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.PowOut.html
    @@ -0,0 +1,565 @@
    +
    +
    +
    +
    +Source code
    +
    +
    +
    +
    +
    +
    +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Swing.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Swing.html new file mode 100644 index 00000000..f5ed1754 --- /dev/null +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.Swing.html @@ -0,0 +1,565 @@ + + + + +Source code + + + + + + +
    +
    +
    001/*******************************************************************************
    +002 * Copyright 2022 See AUTHORS file.
    +003 * 
    +004 * Licensed under the Apache License, Version 2.0 (the "License");
    +005 * you may not use this file except in compliance with the License.
    +006 * You may obtain a copy of the License at
    +007 * 
    +008 *   http://www.apache.org/licenses/LICENSE-2.0
    +009 * 
    +010 * Unless required by applicable law or agreed to in writing, software
    +011 * distributed under the License is distributed on an "AS IS" BASIS,
    +012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +013 * See the License for the specific language governing permissions and
    +014 * limitations under the License.
    +015 ******************************************************************************/
    +016
    +017package com.github.tommyettinger.colorful.pure;
    +018
    +019import com.github.tommyettinger.digital.TrigTools;
    +020
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
    +037
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
    +043                }
    +044        }
    +045
    +046        //
    +047
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
    +063                public float apply (float a) {
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
    +068
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
    +114
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
    +140
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
    +173
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    +177
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    +302                }
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
    +401                }
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    +429                }
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
    +442                }
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BounceIn.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.SwingIn.html similarity index 79% rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BounceIn.html rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.SwingIn.html index 6a58cb62..e889847b 100644 --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BounceIn.html +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.SwingIn.html @@ -4,7 +4,7 @@ Source code - + @@ -12,7 +12,7 @@
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BounceOut.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.SwingOut.html
    similarity index 79%
    rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BounceOut.html
    rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.SwingOut.html
    index 82327075..f1065e0f 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.BounceOut.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.SwingOut.html
    @@ -4,7 +4,7 @@
     
     Source code
     
    -
    +
     
     
     
    @@ -12,7 +12,7 @@
     
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Elastic.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.html
    similarity index 79%
    rename from docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Elastic.html
    rename to docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.html
    index 06b1e7df..b4b23f23 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolation.Elastic.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/Interpolations.html
    @@ -4,7 +4,7 @@
     
     Source code
     
    -
    +
     
     
     
    @@ -12,7 +12,7 @@
     
    001/*******************************************************************************
    -002 * Copyright 2011 See AUTHORS file.
    +002 * Copyright 2022 See AUTHORS file.
     003 * 
     004 * Licensed under the Apache License, Version 2.0 (the "License");
     005 * you may not use this file except in compliance with the License.
    @@ -29,467 +29,475 @@
     016
     017package com.github.tommyettinger.colorful.pure;
     018
    -019import static com.github.tommyettinger.colorful.pure.MathTools.barronSpline;
    +019import com.github.tommyettinger.digital.TrigTools;
     020
    -021/**
    -022 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    -023 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    -024 * for understanding how the different implementations here behave.
    -025 * <br>
    -026 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    -027 * @author Nathan Sweet
    -028 */
    -029public abstract class Interpolation {
    -030        /** @param a Alpha value between 0 and 1. */
    -031        abstract public float apply (float a);
    -032
    -033        /** @param a Alpha value between 0 and 1. */
    -034        public float apply (float start, float end, float a) {
    -035                return start + (end - start) * apply(a);
    -036        }
    +021import static com.github.tommyettinger.digital.MathTools.barronSpline;
    +022
    +023/**
    +024 * Takes a linear value in the range of 0-1 and outputs a (usually) non-linear, interpolated value.
    +025 * The <a href="https://github.com/libgdx/libgdx/wiki/Interpolation">wiki docs on Interpolation</a> are extremely useful
    +026 * for understanding how the different implementations here behave.
    +027 * <br>
    +028 * This class is mostly copied directly from libGDX. Changes have been made to avoid copying even more over.
    +029 * @author Nathan Sweet
    +030 */
    +031public final class Interpolations {
    +032        public static abstract class Interpolation {
    +033                /**
    +034                 * @param a Alpha value between 0 and 1.
    +035                 */
    +036                abstract public float apply(float a);
     037
    -038        //
    -039
    -040        static public final Interpolation linear = new Interpolation() {
    -041                public float apply (float a) {
    -042                        return a;
    +038                /**
    +039                 * @param a Alpha value between 0 and 1.
    +040                 */
    +041                public float apply(float start, float end, float a) {
    +042                        return start + (end - start) * apply(a);
     043                }
    -044        };
    +044        }
     045
     046        //
     047
    -048        /** Aka "smoothstep". */
    -049        static public final Interpolation smooth = new Interpolation() {
    -050                public float apply (float a) {
    -051                        return a * a * (3 - 2 * a);
    -052                }
    -053        };
    -054        static public final Interpolation smooth2 = new Interpolation() {
    -055                public float apply (float a) {
    -056                        a = a * a * (3 - 2 * a);
    -057                        return a * a * (3 - 2 * a);
    -058                }
    -059        };
    -060
    -061        /** By Ken Perlin. */
    -062        static public final Interpolation smoother = new Interpolation() {
    +048        static public final Interpolation linear = new Interpolation() {
    +049                public float apply (float a) {
    +050                        return a;
    +051                }
    +052        };
    +053
    +054        //
    +055
    +056        /** Aka "smoothstep". */
    +057        static public final Interpolation smooth = new Interpolation() {
    +058                public float apply (float a) {
    +059                        return a * a * (3 - 2 * a);
    +060                }
    +061        };
    +062        static public final Interpolation smooth2 = new Interpolation() {
     063                public float apply (float a) {
    -064                        return a * a * a * (a * (a * 6 - 15) + 10);
    -065                }
    -066        };
    -067        static public final Interpolation fade = smoother;
    +064                        a = a * a * (3 - 2 * a);
    +065                        return a * a * (3 - 2 * a);
    +066                }
    +067        };
     068
    -069        //
    -070
    -071        static public final Pow pow2 = new Pow(2);
    -072        /** Slow, then fast. */
    -073        static public final PowIn pow2In = new PowIn(2);
    -074        static public final PowIn slowFast = pow2In;
    -075        /** Fast, then slow. */
    -076        static public final PowOut pow2Out = new PowOut(2);
    -077        static public final PowOut fastSlow = pow2Out;
    -078        static public final Interpolation pow2InInverse = new Interpolation() {
    -079                public float apply (float a) {
    -080                        if (a < 0.000001f) return 0;
    -081                        if (a >= 1f) return 1;
    -082                        return (float)Math.sqrt(a);
    -083                }
    -084        };
    -085        static public final Interpolation pow2OutInverse = new Interpolation() {
    -086                public float apply (float a) {
    -087                        if (a < 0.000001f) return 0;
    -088                        if (a >= 1f) return 1;
    -089                        return 1 - (float)Math.sqrt(-(a - 1));
    -090                }
    -091        };
    -092
    -093        static public final Pow pow3 = new Pow(3);
    -094        static public final PowIn pow3In = new PowIn(3);
    -095        static public final PowOut pow3Out = new PowOut(3);
    -096        static public final Interpolation pow3InInverse = new Interpolation() {
    -097                public float apply (float a) {
    -098                        return (float)Math.cbrt(a);
    -099                }
    -100        };
    -101        static public final Interpolation pow3OutInverse = new Interpolation() {
    -102                public float apply (float a) {
    -103                        return 1 - (float)Math.cbrt(-(a - 1));
    -104                }
    -105        };
    -106
    -107        static public final Pow pow4 = new Pow(4);
    -108        static public final PowIn pow4In = new PowIn(4);
    -109        static public final PowOut pow4Out = new PowOut(4);
    -110
    -111        static public final Pow pow5 = new Pow(5);
    -112        static public final PowIn pow5In = new PowIn(5);
    -113        static public final PowOut pow5Out = new PowOut(5);
    +069        /** By Ken Perlin. */
    +070        static public final Interpolation smoother = new Interpolation() {
    +071                public float apply (float a) {
    +072                        return a * a * a * (a * (a * 6 - 15) + 10);
    +073                }
    +074        };
    +075        static public final Interpolation fade = smoother;
    +076
    +077        //
    +078
    +079        static public final Pow pow2 = new Pow(2);
    +080        /** Slow, then fast. */
    +081        static public final PowIn pow2In = new PowIn(2);
    +082        static public final PowIn slowFast = pow2In;
    +083        /** Fast, then slow. */
    +084        static public final PowOut pow2Out = new PowOut(2);
    +085        static public final PowOut fastSlow = pow2Out;
    +086        static public final Interpolation pow2InInverse = new Interpolation() {
    +087                public float apply (float a) {
    +088                        if (a < 0.000001f) return 0;
    +089                        if (a >= 1f) return 1;
    +090                        return (float)Math.sqrt(a);
    +091                }
    +092        };
    +093        static public final Interpolation pow2OutInverse = new Interpolation() {
    +094                public float apply (float a) {
    +095                        if (a < 0.000001f) return 0;
    +096                        if (a >= 1f) return 1;
    +097                        return 1 - (float)Math.sqrt(-(a - 1));
    +098                }
    +099        };
    +100
    +101        static public final Pow pow3 = new Pow(3);
    +102        static public final PowIn pow3In = new PowIn(3);
    +103        static public final PowOut pow3Out = new PowOut(3);
    +104        static public final Interpolation pow3InInverse = new Interpolation() {
    +105                public float apply (float a) {
    +106                        return (float)Math.cbrt(a);
    +107                }
    +108        };
    +109        static public final Interpolation pow3OutInverse = new Interpolation() {
    +110                public float apply (float a) {
    +111                        return 1 - (float)Math.cbrt(-(a - 1));
    +112                }
    +113        };
     114
    -115        static public final Interpolation sine = new Interpolation() {
    -116                public float apply (float a) {
    -117                        return (1 - MathTools.cos_(a * 0.5f)) * 0.5f;
    -118                }
    -119        };
    -120
    -121        static public final Interpolation sineIn = new Interpolation() {
    -122                public float apply (float a) {
    -123                        return 1 - MathTools.cos_(a * 0.25f);
    -124                }
    -125        };
    -126
    -127        static public final Interpolation sineOut = new Interpolation() {
    -128                public float apply (float a) {
    -129                        return MathTools.sin_(a * 0.25f);
    -130                }
    -131        };
    -132
    -133        static public final Exp exp10 = new Exp(2, 10);
    -134        static public final ExpIn exp10In = new ExpIn(2, 10);
    -135        static public final ExpOut exp10Out = new ExpOut(2, 10);
    -136
    -137        static public final Exp exp5 = new Exp(2, 5);
    -138        static public final ExpIn exp5In = new ExpIn(2, 5);
    -139        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +115        static public final Pow pow4 = new Pow(4);
    +116        static public final PowIn pow4In = new PowIn(4);
    +117        static public final PowOut pow4Out = new PowOut(4);
    +118
    +119        static public final Pow pow5 = new Pow(5);
    +120        static public final PowIn pow5In = new PowIn(5);
    +121        static public final PowOut pow5Out = new PowOut(5);
    +122
    +123        static public final Interpolation sine = new Interpolation() {
    +124                public float apply (float a) {
    +125                        return (1 - TrigTools.cosTurns(a * 0.5f)) * 0.5f;
    +126                }
    +127        };
    +128
    +129        static public final Interpolation sineIn = new Interpolation() {
    +130                public float apply (float a) {
    +131                        return 1 - TrigTools.cosTurns(a * 0.25f);
    +132                }
    +133        };
    +134
    +135        static public final Interpolation sineOut = new Interpolation() {
    +136                public float apply (float a) {
    +137                        return MathTools.sin_(a * 0.25f);
    +138                }
    +139        };
     140
    -141        static public final Interpolation circle = new Interpolation() {
    -142                public float apply (float a) {
    -143                        if (a <= 0.5f) {
    -144                                a *= 2;
    -145                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    -146                        }
    -147                        a--;
    -148                        a *= 2;
    -149                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    -150                }
    -151        };
    -152
    -153        static public final Interpolation circleIn = new Interpolation() {
    -154                public float apply (float a) {
    -155                        return 1 - (float)Math.sqrt(1 - a * a);
    -156                }
    -157        };
    -158
    -159        static public final Interpolation circleOut = new Interpolation() {
    -160                public float apply (float a) {
    -161                        a--;
    -162                        return (float)Math.sqrt(1 - a * a);
    -163                }
    -164        };
    -165
    -166        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    -167        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    -168        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
    -169
    -170        static public final Swing swing = new Swing(1.5f);
    -171        static public final SwingIn swingIn = new SwingIn(2f);
    -172        static public final SwingOut swingOut = new SwingOut(2f);
    +141        static public final Exp exp10 = new Exp(2, 10);
    +142        static public final ExpIn exp10In = new ExpIn(2, 10);
    +143        static public final ExpOut exp10Out = new ExpOut(2, 10);
    +144
    +145        static public final Exp exp5 = new Exp(2, 5);
    +146        static public final ExpIn exp5In = new ExpIn(2, 5);
    +147        static public final ExpOut exp5Out = new ExpOut(2, 5);
    +148
    +149        static public final Interpolation circle = new Interpolation() {
    +150                public float apply (float a) {
    +151                        if (a <= 0.5f) {
    +152                                a *= 2;
    +153                                return (1 - (float)Math.sqrt(1 - a * a)) / 2;
    +154                        }
    +155                        a--;
    +156                        a *= 2;
    +157                        return ((float)Math.sqrt(1 - a * a) + 1) / 2;
    +158                }
    +159        };
    +160
    +161        static public final Interpolation circleIn = new Interpolation() {
    +162                public float apply (float a) {
    +163                        return 1 - (float)Math.sqrt(1 - a * a);
    +164                }
    +165        };
    +166
    +167        static public final Interpolation circleOut = new Interpolation() {
    +168                public float apply (float a) {
    +169                        a--;
    +170                        return (float)Math.sqrt(1 - a * a);
    +171                }
    +172        };
     173
    -174        static public final Bounce bounce = new Bounce(4);
    -175        static public final BounceIn bounceIn = new BounceIn(4);
    -176        static public final BounceOut bounceOut = new BounceOut(4);
    +174        static public final Elastic elastic = new Elastic(2, 10, 7, 1);
    +175        static public final ElasticIn elasticIn = new ElasticIn(2, 10, 6, 1);
    +176        static public final ElasticOut elasticOut = new ElasticOut(2, 10, 7, 1);
     177
    -178        //
    -179
    -180        static public class Pow extends Interpolation {
    -181                final int power;
    -182
    -183                public Pow (int power) {
    -184                        this.power = power;
    -185                }
    -186
    -187                public float apply (float a) {
    -188                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    -189                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    -190                }
    -191        }
    -192
    -193        static public class PowIn extends Pow {
    -194                public PowIn (int power) {
    -195                        super(power);
    -196                }
    -197
    -198                public float apply (float a) {
    -199                        return (float)Math.pow(a, power);
    -200                }
    -201        }
    -202
    -203        static public class PowOut extends Pow {
    -204                public PowOut (int power) {
    -205                        super(power);
    -206                }
    -207
    -208                public float apply (float a) {
    -209                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    -210                }
    -211        }
    -212
    -213        //
    -214
    -215        static public class Exp extends Interpolation {
    -216                final float value, power, min, scale;
    -217
    -218                public Exp (float value, float power) {
    -219                        this.value = value;
    -220                        this.power = power;
    -221                        min = (float)Math.pow(value, -power);
    -222                        scale = 1 / (1 - min);
    -223                }
    -224
    -225                public float apply (float a) {
    -226                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    -227                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    -228                }
    -229        };
    -230
    -231        static public class ExpIn extends Exp {
    -232                public ExpIn (float value, float power) {
    -233                        super(value, power);
    -234                }
    -235
    -236                public float apply (float a) {
    -237                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    -238                }
    -239        }
    -240
    -241        static public class ExpOut extends Exp {
    -242                public ExpOut (float value, float power) {
    -243                        super(value, power);
    -244                }
    -245
    -246                public float apply (float a) {
    -247                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    -248                }
    -249        }
    -250
    -251        //
    -252
    -253        static public class Elastic extends Interpolation {
    -254                final float value, power, scale, bounces;
    -255
    -256                public Elastic (float value, float power, int bounces, float scale) {
    -257                        this.value = value;
    -258                        this.power = power;
    -259                        this.scale = scale;
    -260                        this.bounces = bounces * (0.5f - (bounces & 1));
    -261                }
    -262
    -263                public float apply (float a) {
    -264                        if (a <= 0.5f) {
    -265                                a *= 2;
    -266                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    -267                        }
    -268                        a = 1 - a;
    -269                        a *= 2;
    -270                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    -271                }
    -272        }
    -273
    -274        static public class ElasticIn extends Elastic {
    -275                public ElasticIn (float value, float power, int bounces, float scale) {
    -276                        super(value, power, bounces, scale);
    -277                }
    -278
    -279                public float apply (float a) {
    -280                        if (a >= 0.99) return 1;
    -281                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    -282                }
    -283        }
    -284
    -285        static public class ElasticOut extends Elastic {
    -286                public ElasticOut (float value, float power, int bounces, float scale) {
    -287                        super(value, power, bounces, scale);
    -288                }
    -289
    -290                public float apply (float a) {
    -291                        if (a == 0) return 0;
    -292                        a = 1 - a;
    -293                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
    -294                }
    -295        }
    -296
    -297        //
    -298
    -299        static public class Bounce extends BounceOut {
    -300                public Bounce (float[] widths, float[] heights) {
    -301                        super(widths, heights);
    +178        static public final Swing swing = new Swing(1.5f);
    +179        static public final SwingIn swingIn = new SwingIn(2f);
    +180        static public final SwingOut swingOut = new SwingOut(2f);
    +181
    +182        static public final Bounce bounce = new Bounce(4);
    +183        static public final BounceIn bounceIn = new BounceIn(4);
    +184        static public final BounceOut bounceOut = new BounceOut(4);
    +185
    +186        //
    +187
    +188        static public class Pow extends Interpolation {
    +189                final int power;
    +190
    +191                public Pow (int power) {
    +192                        this.power = power;
    +193                }
    +194
    +195                public float apply (float a) {
    +196                        if (a <= 0.5f) return (float)Math.pow(a * 2, power) / 2;
    +197                        return (float)Math.pow((a - 1) * 2, power) / (power % 2 == 0 ? -2 : 2) + 1;
    +198                }
    +199        }
    +200
    +201        static public class PowIn extends Pow {
    +202                public PowIn (int power) {
    +203                        super(power);
    +204                }
    +205
    +206                public float apply (float a) {
    +207                        return (float)Math.pow(a, power);
    +208                }
    +209        }
    +210
    +211        static public class PowOut extends Pow {
    +212                public PowOut (int power) {
    +213                        super(power);
    +214                }
    +215
    +216                public float apply (float a) {
    +217                        return (float)Math.pow(a - 1, power) * (power % 2 == 0 ? -1 : 1) + 1;
    +218                }
    +219        }
    +220
    +221        //
    +222
    +223        static public class Exp extends Interpolation {
    +224                final float value, power, min, scale;
    +225
    +226                public Exp (float value, float power) {
    +227                        this.value = value;
    +228                        this.power = power;
    +229                        min = (float)Math.pow(value, -power);
    +230                        scale = 1 / (1 - min);
    +231                }
    +232
    +233                public float apply (float a) {
    +234                        if (a <= 0.5f) return ((float)Math.pow(value, power * (a * 2 - 1)) - min) * scale / 2;
    +235                        return (2 - ((float)Math.pow(value, -power * (a * 2 - 1)) - min) * scale) / 2;
    +236                }
    +237        }
    +238
    +239        static public class ExpIn extends Exp {
    +240                public ExpIn (float value, float power) {
    +241                        super(value, power);
    +242                }
    +243
    +244                public float apply (float a) {
    +245                        return ((float)Math.pow(value, power * (a - 1)) - min) * scale;
    +246                }
    +247        }
    +248
    +249        static public class ExpOut extends Exp {
    +250                public ExpOut (float value, float power) {
    +251                        super(value, power);
    +252                }
    +253
    +254                public float apply (float a) {
    +255                        return 1 - ((float)Math.pow(value, -power * a) - min) * scale;
    +256                }
    +257        }
    +258
    +259        //
    +260
    +261        static public class Elastic extends Interpolation {
    +262                final float value, power, scale, bounces;
    +263
    +264                public Elastic (float value, float power, int bounces, float scale) {
    +265                        this.value = value;
    +266                        this.power = power;
    +267                        this.scale = scale;
    +268                        this.bounces = bounces * (0.5f - (bounces & 1));
    +269                }
    +270
    +271                public float apply (float a) {
    +272                        if (a <= 0.5f) {
    +273                                a *= 2;
    +274                                return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale / 2;
    +275                        }
    +276                        a = 1 - a;
    +277                        a *= 2;
    +278                        return 1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_((a) * bounces) * scale / 2;
    +279                }
    +280        }
    +281
    +282        static public class ElasticIn extends Elastic {
    +283                public ElasticIn (float value, float power, int bounces, float scale) {
    +284                        super(value, power, bounces, scale);
    +285                }
    +286
    +287                public float apply (float a) {
    +288                        if (a >= 0.99) return 1;
    +289                        return (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale;
    +290                }
    +291        }
    +292
    +293        static public class ElasticOut extends Elastic {
    +294                public ElasticOut (float value, float power, int bounces, float scale) {
    +295                        super(value, power, bounces, scale);
    +296                }
    +297
    +298                public float apply (float a) {
    +299                        if (a == 0) return 0;
    +300                        a = 1 - a;
    +301                        return (1 - (float)Math.pow(value, power * (a - 1)) * MathTools.sin_(a * bounces) * scale);
     302                }
    -303
    -304                public Bounce (int bounces) {
    -305                        super(bounces);
    -306                }
    -307
    -308                private float out (float a) {
    -309                        float test = a + widths[0] / 2;
    -310                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    -311                        return super.apply(a);
    -312                }
    -313
    -314                public float apply (float a) {
    -315                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    -316                        return out(a * 2 - 1) / 2 + 0.5f;
    -317                }
    -318        }
    -319
    -320        static public class BounceOut extends Interpolation {
    -321                final float[] widths, heights;
    -322
    -323                public BounceOut (float[] widths, float[] heights) {
    -324                        if (widths.length != heights.length)
    -325                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    -326                        this.widths = widths;
    -327                        this.heights = heights;
    -328                }
    -329
    -330                public BounceOut (int bounces) {
    -331                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    -332                        widths = new float[bounces];
    -333                        heights = new float[bounces];
    -334                        heights[0] = 1;
    -335                        switch (bounces) {
    -336                        case 2:
    -337                                widths[0] = 0.6f;
    -338                                widths[1] = 0.4f;
    -339                                heights[1] = 0.33f;
    -340                                break;
    -341                        case 3:
    -342                                widths[0] = 0.4f;
    -343                                widths[1] = 0.4f;
    -344                                widths[2] = 0.2f;
    -345                                heights[1] = 0.33f;
    -346                                heights[2] = 0.1f;
    -347                                break;
    -348                        case 4:
    -349                                widths[0] = 0.34f;
    -350                                widths[1] = 0.34f;
    -351                                widths[2] = 0.2f;
    -352                                widths[3] = 0.15f;
    -353                                heights[1] = 0.26f;
    -354                                heights[2] = 0.11f;
    -355                                heights[3] = 0.03f;
    -356                                break;
    -357                        case 5:
    -358                                widths[0] = 0.3f;
    -359                                widths[1] = 0.3f;
    -360                                widths[2] = 0.2f;
    -361                                widths[3] = 0.1f;
    -362                                widths[4] = 0.1f;
    -363                                heights[1] = 0.45f;
    -364                                heights[2] = 0.3f;
    -365                                heights[3] = 0.15f;
    -366                                heights[4] = 0.06f;
    -367                                break;
    -368                        }
    -369                        widths[0] *= 2;
    -370                }
    -371
    -372                public float apply (float a) {
    -373                        if (a == 1) return 1;
    -374                        a += widths[0] / 2;
    -375                        float width = 0, height = 0;
    -376                        for (int i = 0, n = widths.length; i < n; i++) {
    -377                                width = widths[i];
    -378                                if (a <= width) {
    -379                                        height = heights[i];
    -380                                        break;
    -381                                }
    -382                                a -= width;
    -383                        }
    -384                        a /= width;
    -385                        float z = 4 / width * height * a;
    -386                        return 1 - (z - z * a) * width;
    -387                }
    -388        }
    -389
    -390        static public class BounceIn extends BounceOut {
    -391                public BounceIn (float[] widths, float[] heights) {
    -392                        super(widths, heights);
    -393                }
    -394
    -395                public BounceIn (int bounces) {
    -396                        super(bounces);
    -397                }
    -398
    -399                public float apply (float a) {
    -400                        return 1 - super.apply(1 - a);
    +303        }
    +304
    +305        //
    +306
    +307        static public class Bounce extends BounceOut {
    +308                public Bounce (float[] widths, float[] heights) {
    +309                        super(widths, heights);
    +310                }
    +311
    +312                public Bounce (int bounces) {
    +313                        super(bounces);
    +314                }
    +315
    +316                private float out (float a) {
    +317                        float test = a + widths[0] / 2;
    +318                        if (test < widths[0]) return test / (widths[0] / 2) - 1;
    +319                        return super.apply(a);
    +320                }
    +321
    +322                public float apply (float a) {
    +323                        if (a <= 0.5f) return (1 - out(1 - a * 2)) / 2;
    +324                        return out(a * 2 - 1) / 2 + 0.5f;
    +325                }
    +326        }
    +327
    +328        static public class BounceOut extends Interpolation {
    +329                final float[] widths, heights;
    +330
    +331                public BounceOut (float[] widths, float[] heights) {
    +332                        if (widths.length != heights.length)
    +333                                throw new IllegalArgumentException("Must be the same number of widths and heights.");
    +334                        this.widths = widths;
    +335                        this.heights = heights;
    +336                }
    +337
    +338                public BounceOut (int bounces) {
    +339                        if (bounces < 2 || bounces > 5) throw new IllegalArgumentException("bounces cannot be < 2 or > 5: " + bounces);
    +340                        widths = new float[bounces];
    +341                        heights = new float[bounces];
    +342                        heights[0] = 1;
    +343                        switch (bounces) {
    +344                        case 2:
    +345                                widths[0] = 0.6f;
    +346                                widths[1] = 0.4f;
    +347                                heights[1] = 0.33f;
    +348                                break;
    +349                        case 3:
    +350                                widths[0] = 0.4f;
    +351                                widths[1] = 0.4f;
    +352                                widths[2] = 0.2f;
    +353                                heights[1] = 0.33f;
    +354                                heights[2] = 0.1f;
    +355                                break;
    +356                        case 4:
    +357                                widths[0] = 0.34f;
    +358                                widths[1] = 0.34f;
    +359                                widths[2] = 0.2f;
    +360                                widths[3] = 0.15f;
    +361                                heights[1] = 0.26f;
    +362                                heights[2] = 0.11f;
    +363                                heights[3] = 0.03f;
    +364                                break;
    +365                        case 5:
    +366                                widths[0] = 0.3f;
    +367                                widths[1] = 0.3f;
    +368                                widths[2] = 0.2f;
    +369                                widths[3] = 0.1f;
    +370                                widths[4] = 0.1f;
    +371                                heights[1] = 0.45f;
    +372                                heights[2] = 0.3f;
    +373                                heights[3] = 0.15f;
    +374                                heights[4] = 0.06f;
    +375                                break;
    +376                        }
    +377                        widths[0] *= 2;
    +378                }
    +379
    +380                public float apply (float a) {
    +381                        if (a == 1) return 1;
    +382                        a += widths[0] / 2;
    +383                        float width = 0, height = 0;
    +384                        for (int i = 0, n = widths.length; i < n; i++) {
    +385                                width = widths[i];
    +386                                if (a <= width) {
    +387                                        height = heights[i];
    +388                                        break;
    +389                                }
    +390                                a -= width;
    +391                        }
    +392                        a /= width;
    +393                        float z = 4 / width * height * a;
    +394                        return 1 - (z - z * a) * width;
    +395                }
    +396        }
    +397
    +398        static public class BounceIn extends BounceOut {
    +399                public BounceIn (float[] widths, float[] heights) {
    +400                        super(widths, heights);
     401                }
    -402        }
    -403
    -404        //
    -405
    -406        static public class Swing extends Interpolation {
    -407                private final float scale;
    -408
    -409                public Swing (float scale) {
    -410                        this.scale = scale * 2;
    -411                }
    -412
    -413                public float apply (float a) {
    -414                        if (a <= 0.5f) {
    -415                                a *= 2;
    -416                                return a * a * ((scale + 1) * a - scale) / 2;
    -417                        }
    -418                        a--;
    -419                        a *= 2;
    -420                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
    -421                }
    -422        }
    -423
    -424        static public class SwingOut extends Interpolation {
    -425                private final float scale;
    -426
    -427                public SwingOut (float scale) {
    -428                        this.scale = scale;
    +402
    +403                public BounceIn (int bounces) {
    +404                        super(bounces);
    +405                }
    +406
    +407                public float apply (float a) {
    +408                        return 1 - super.apply(1 - a);
    +409                }
    +410        }
    +411
    +412        //
    +413
    +414        static public class Swing extends Interpolation {
    +415                private final float scale;
    +416
    +417                public Swing (float scale) {
    +418                        this.scale = scale * 2;
    +419                }
    +420
    +421                public float apply (float a) {
    +422                        if (a <= 0.5f) {
    +423                                a *= 2;
    +424                                return a * a * ((scale + 1) * a - scale) / 2;
    +425                        }
    +426                        a--;
    +427                        a *= 2;
    +428                        return a * a * ((scale + 1) * a + scale) / 2 + 1;
     429                }
    -430
    -431                public float apply (float a) {
    -432                        a--;
    -433                        return a * a * ((scale + 1) * a + scale) + 1;
    -434                }
    -435        }
    -436
    -437        static public class SwingIn extends Interpolation {
    -438                private final float scale;
    -439
    -440                public SwingIn (float scale) {
    -441                        this.scale = scale;
    +430        }
    +431
    +432        static public class SwingOut extends Interpolation {
    +433                private final float scale;
    +434
    +435                public SwingOut (float scale) {
    +436                        this.scale = scale;
    +437                }
    +438
    +439                public float apply (float a) {
    +440                        a--;
    +441                        return a * a * ((scale + 1) * a + scale) + 1;
     442                }
    -443
    -444                public float apply (float a) {
    -445                        return a * a * ((scale + 1) * a - scale);
    -446                }
    -447        }
    -448
    -449
    -450        /**
    -451         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    -452         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    -453         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    -454         * shape to some value between 0 and 1.
    -455         */
    -456        public static class BiasGain extends Interpolation {
    -457                /**
    -458                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    -459                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    -460                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    -461                 * the ending level).
    -462                 */
    -463                public final float shape;
    -464                /**
    -465                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    -466                 */
    -467                public final float turning;
    -468
    -469                public BiasGain (float shape, float turning) {
    -470                        this.shape = shape;
    -471                        this.turning = turning;
    -472                }
    -473
    -474                public float apply (float a) {
    -475                        return barronSpline(a, shape, turning);
    -476                }
    -477        }
    -478
    -479}
    +443        }
    +444
    +445        static public class SwingIn extends Interpolation {
    +446                private final float scale;
    +447
    +448                public SwingIn (float scale) {
    +449                        this.scale = scale;
    +450                }
    +451
    +452                public float apply (float a) {
    +453                        return a * a * ((scale + 1) * a - scale);
    +454                }
    +455        }
    +456
    +457
    +458        /**
    +459         * A wrapper around {@link MathTools#barronSpline(float, float, float)} to use it as an Interpolation.
    +460         * Useful because it can imitate the wide variety of symmetrical Interpolations by setting turning to 0.5 and shape
    +461         * to some value greater than 1, while also being able to produce the inverse of those interpolations by setting
    +462         * shape to some value between 0 and 1.
    +463         */
    +464        public static class BiasGain extends Interpolation {
    +465                /**
    +466                 * The shape parameter will cause this to imitate "smoothstep-like" splines when greater than 1 (where the
    +467                 * values ease into their starting and ending levels), or to be the inverse when less than 1 (where values
    +468                 * start like square root does, taking off very quickly, but also end like square does, landing abruptly at
    +469                 * the ending level).
    +470                 */
    +471                public final float shape;
    +472                /**
    +473                 * A value between 0.0 and 1.0, inclusive, where the shape changes.
    +474                 */
    +475                public final float turning;
    +476
    +477                public BiasGain (float shape, float turning) {
    +478                        this.shape = shape;
    +479                        this.turning = turning;
    +480                }
    +481
    +482                public float apply (float a) {
    +483                        return barronSpline(a, shape, turning);
    +484                }
    +485        }
    +486
    +487}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/MathTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/MathTools.html
    index affa204c..c2ef0fd0 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/MathTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/MathTools.html
    @@ -24,1067 +24,1070 @@
     011 * measure turns in degrees, either from -180 to 180 for {@link #atan2Degrees(float, float)} or from 0 to 360 for
     012 * {@link #atan2Degrees360(float, float)}. Also has {@link #lerp(float, float, float)}, why not.
     013 * <br>
    -014 * Created by Tommy Ettinger on 8/6/2019.
    -015 */
    -016public class MathTools {
    -017
    -018    /**
    -019     * A fairly-close approximation of {@link Math#sin(double)} that can be significantly faster (between 8x and 80x
    -020     * faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise
    -021     * and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a
    -022     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    -023     * with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians,
    -024     * which may technically be any double (but this will lose precision on fairly large doubles, such as those that are
    -025     * larger than {@link Long#MAX_VALUE}, because those doubles themselves will lose precision at that scale). This
    -026     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    -027     * sin(). The difference between the result of this method and {@link Math#sin(double)} should be under 0.0011 at
    -028     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    -029     * potentially higher errors, though.
    -030     * <br>
    -031     * The error for this double version is extremely close to the float version, {@link #sin(float)}, so you should
    -032     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -033     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -034     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -035     * and likewise for doubles.
    -036     * <br>
    -037     * The technique for sine approximation is mostly from
    -038     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -039     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    -040     * @param radians an angle in radians as a double, often from 0 to pi * 2, though not required to be.
    -041     * @return the sine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    -042     */
    -043
    -044    public static double sin(double radians)
    -045    {
    -046        radians *= 0.6366197723675814;
    -047        final long floor = (radians >= 0.0 ? (long) radians : (long) radians - 1L) & -2L;
    -048        radians -= floor;
    -049        radians *= 2.0 - radians;
    -050        return radians * (-0.775 - 0.225 * radians) * ((floor & 2L) - 1L);
    -051    }
    -052
    -053    /**
    -054     * A fairly-close approximation of {@link Math#cos(double)} that can be significantly faster (between 8x and 80x
    -055     * faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise
    -056     * and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a
    -057     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    -058     * with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians,
    -059     * which may technically be any double (but this will lose precision on fairly large doubles, such as those that are
    -060     * larger than {@link Long#MAX_VALUE}, because those doubles themselves will lose precision at that scale). This
    -061     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    -062     * cos(). The difference between the result of this method and {@link Math#cos(double)} should be under 0.0011 at
    -063     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    -064     * potentially higher errors, though.
    -065     * <br>
    -066     * The error for this double version is extremely close to the float version, {@link #cos(float)}, so you should
    -067     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -068     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -069     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -070     * and likewise for doubles.
    -071     * <br>
    -072     * The technique for cosine approximation is mostly from
    -073     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -074     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    -075     * @param radians an angle in radians as a double, often from 0 to pi * 2, though not required to be.
    -076     * @return the cosine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    -077     */
    -078    public static double cos(double radians)
    -079    {
    -080        radians = radians * 0.6366197723675814 + 1.0;
    -081        final long floor = (radians >= 0.0 ? (long) radians : (long) radians - 1L) & -2L;
    -082        radians -= floor;
    -083        radians *= 2.0 - radians;
    -084        return radians * (-0.775 - 0.225 * radians) * ((floor & 2L) - 1L);
    -085    }
    -086
    -087    /**
    -088     * A fairly-close approximation of {@link Math#sin(double)} that can be significantly faster (between 8x and 80x
    -089     * faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should
    -090     * consider its more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a
    -091     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    -092     * with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians,
    -093     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    -094     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). This
    -095     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    -096     * sin(). The difference between the result of this method and {@link Math#sin(double)} should be under 0.0011 at
    -097     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    -098     * potentially higher errors, though.
    -099     * <br>
    -100     * The error for this float version is extremely close to the double version, {@link #sin(double)}, so you should
    -101     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -102     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -103     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -104     * and likewise for doubles.
    -105     * <br>
    -106     * The technique for sine approximation is mostly from
    -107     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -108     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    -109     * @param radians an angle in radians as a float, often from 0 to pi * 2, though not required to be.
    -110     * @return the sine of the given angle, as a float between -1f and 1f (both inclusive)
    -111     */
    -112    public static float sin(float radians)
    -113    {
    -114        radians *= 0.6366197723675814f;
    -115        final int floor = (radians >= 0.0 ? (int) radians : (int) radians - 1) & -2;
    -116        radians -= floor;
    -117        radians *= 2f - radians;
    -118        return radians * (-0.775f - 0.225f * radians) * ((floor & 2) - 1);
    -119    }
    -120
    -121    /**
    -122     * A fairly-close approximation of {@link Math#cos(double)} that can be significantly faster (between 8x and 80x
    -123     * faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should
    -124     * consider its more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a
    -125     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    -126     * with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians,
    -127     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    -128     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). This
    -129     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    -130     * cos(). The difference between the result of this method and {@link Math#cos(double)} should be under 0.0011 at
    -131     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    -132     * potentially higher errors, though.
    -133     * <br>
    -134     * The error for this float version is extremely close to the double version, {@link #cos(double)}, so you should
    -135     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -136     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -137     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -138     * and likewise for doubles.
    -139     * <br>
    -140     * The technique for cosine approximation is mostly from
    -141     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -142     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    -143     * @param radians an angle in radians as a float, often from 0 to pi * 2, though not required to be.
    -144     * @return the cosine of the given angle, as a float between -1f and 1f (both inclusive)
    -145     */
    -146    public static float cos(float radians)
    -147    {
    -148        radians = radians * 0.6366197723675814f + 1f;
    -149        final int floor = (radians >= 0.0 ? (int) radians : (int) radians - 1) & -2;
    -150        radians -= floor;
    -151        radians *= 2f - radians;
    -152        return radians * (-0.775f - 0.225f * radians) * ((floor & 2) - 1);
    -153    }
    -154
    -155    /**
    -156     * A fairly-close approximation of {@link Math#sin(double)} that can be significantly faster (between 8x and 80x
    -157     * faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should
    -158     * consider its more-precise and sometimes-faster MathUtils.sinDeg() method. Because this method doesn't rely on a
    -159     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    -160     * with this method than with MathUtils. Takes one angle in degrees,
    -161     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    -162     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). The
    -163     * difference between the result of this method and {@link Math#sin(double)} should be under 0.0011 at
    -164     * all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for
    -165     * potentially higher errors, though.
    -166     * <br>
    -167     * The error for this float version is extremely close to the double version, {@link #sin(double)}, so you should
    -168     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -169     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -170     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -171     * and likewise for doubles.
    -172     * <br>
    -173     * Unlike in previous versions of this method, the sign of the input doesn't affect performance here, at least not
    -174     * by a measurable amount.
    +014 * New code should use {@link com.github.tommyettinger.digital.TrigTools} for trigonometric methods instead; it has
    +015 * sinTurns() instead of sin_(), and other naming has similar changes, but should be faster and more precise. The other
    +016 * methods have parallels in {@link com.github.tommyettinger.digital.MathTools}.
    +017 * <br>
    +018 * Created by Tommy Ettinger on 8/6/2019.
    +019 */
    +020public class MathTools {
    +021
    +022    /**
    +023     * A fairly-close approximation of {@link Math#sin(double)} that can be significantly faster (between 8x and 80x
    +024     * faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise
    +025     * and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a
    +026     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    +027     * with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians,
    +028     * which may technically be any double (but this will lose precision on fairly large doubles, such as those that are
    +029     * larger than {@link Long#MAX_VALUE}, because those doubles themselves will lose precision at that scale). This
    +030     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    +031     * sin(). The difference between the result of this method and {@link Math#sin(double)} should be under 0.0011 at
    +032     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    +033     * potentially higher errors, though.
    +034     * <br>
    +035     * The error for this double version is extremely close to the float version, {@link #sin(float)}, so you should
    +036     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +037     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +038     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +039     * and likewise for doubles.
    +040     * <br>
    +041     * The technique for sine approximation is mostly from
    +042     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +043     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    +044     * @param radians an angle in radians as a double, often from 0 to pi * 2, though not required to be.
    +045     * @return the sine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    +046     */
    +047    public static double sin(double radians)
    +048    {
    +049        radians *= 0.6366197723675814;
    +050        final long floor = (radians >= 0.0 ? (long) radians : (long) radians - 1L) & -2L;
    +051        radians -= floor;
    +052        radians *= 2.0 - radians;
    +053        return radians * (-0.775 - 0.225 * radians) * ((floor & 2L) - 1L);
    +054    }
    +055
    +056    /**
    +057     * A fairly-close approximation of {@link Math#cos(double)} that can be significantly faster (between 8x and 80x
    +058     * faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise
    +059     * and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a
    +060     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    +061     * with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians,
    +062     * which may technically be any double (but this will lose precision on fairly large doubles, such as those that are
    +063     * larger than {@link Long#MAX_VALUE}, because those doubles themselves will lose precision at that scale). This
    +064     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    +065     * cos(). The difference between the result of this method and {@link Math#cos(double)} should be under 0.0011 at
    +066     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    +067     * potentially higher errors, though.
    +068     * <br>
    +069     * The error for this double version is extremely close to the float version, {@link #cos(float)}, so you should
    +070     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +071     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +072     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +073     * and likewise for doubles.
    +074     * <br>
    +075     * The technique for cosine approximation is mostly from
    +076     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +077     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    +078     * @param radians an angle in radians as a double, often from 0 to pi * 2, though not required to be.
    +079     * @return the cosine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    +080     */
    +081    public static double cos(double radians)
    +082    {
    +083        radians = radians * 0.6366197723675814 + 1.0;
    +084        final long floor = (radians >= 0.0 ? (long) radians : (long) radians - 1L) & -2L;
    +085        radians -= floor;
    +086        radians *= 2.0 - radians;
    +087        return radians * (-0.775 - 0.225 * radians) * ((floor & 2L) - 1L);
    +088    }
    +089
    +090    /**
    +091     * A fairly-close approximation of {@link Math#sin(double)} that can be significantly faster (between 8x and 80x
    +092     * faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should
    +093     * consider its more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a
    +094     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    +095     * with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians,
    +096     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    +097     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). This
    +098     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    +099     * sin(). The difference between the result of this method and {@link Math#sin(double)} should be under 0.0011 at
    +100     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    +101     * potentially higher errors, though.
    +102     * <br>
    +103     * The error for this float version is extremely close to the double version, {@link #sin(double)}, so you should
    +104     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +105     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +106     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +107     * and likewise for doubles.
    +108     * <br>
    +109     * The technique for sine approximation is mostly from
    +110     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +111     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    +112     * @param radians an angle in radians as a float, often from 0 to pi * 2, though not required to be.
    +113     * @return the sine of the given angle, as a float between -1f and 1f (both inclusive)
    +114     */
    +115    public static float sin(float radians)
    +116    {
    +117        radians *= 0.6366197723675814f;
    +118        final int floor = (radians >= 0.0 ? (int) radians : (int) radians - 1) & -2;
    +119        radians -= floor;
    +120        radians *= 2f - radians;
    +121        return radians * (-0.775f - 0.225f * radians) * ((floor & 2) - 1);
    +122    }
    +123
    +124    /**
    +125     * A fairly-close approximation of {@link Math#cos(double)} that can be significantly faster (between 8x and 80x
    +126     * faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should
    +127     * consider its more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a
    +128     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    +129     * with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians,
    +130     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    +131     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). This
    +132     * is closely related to a cubic sway, but the shape of the output when graphed is almost identical to
    +133     * cos(). The difference between the result of this method and {@link Math#cos(double)} should be under 0.0011 at
    +134     * all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for
    +135     * potentially higher errors, though.
    +136     * <br>
    +137     * The error for this float version is extremely close to the double version, {@link #cos(double)}, so you should
    +138     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +139     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +140     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +141     * and likewise for doubles.
    +142     * <br>
    +143     * The technique for cosine approximation is mostly from
    +144     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +145     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    +146     * @param radians an angle in radians as a float, often from 0 to pi * 2, though not required to be.
    +147     * @return the cosine of the given angle, as a float between -1f and 1f (both inclusive)
    +148     */
    +149    public static float cos(float radians)
    +150    {
    +151        radians = radians * 0.6366197723675814f + 1f;
    +152        final int floor = (radians >= 0.0 ? (int) radians : (int) radians - 1) & -2;
    +153        radians -= floor;
    +154        radians *= 2f - radians;
    +155        return radians * (-0.775f - 0.225f * radians) * ((floor & 2) - 1);
    +156    }
    +157
    +158    /**
    +159     * A fairly-close approximation of {@link Math#sin(double)} that can be significantly faster (between 8x and 80x
    +160     * faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should
    +161     * consider its more-precise and sometimes-faster MathUtils.sinDeg() method. Because this method doesn't rely on a
    +162     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    +163     * with this method than with MathUtils. Takes one angle in degrees,
    +164     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    +165     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). The
    +166     * difference between the result of this method and {@link Math#sin(double)} should be under 0.0011 at
    +167     * all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for
    +168     * potentially higher errors, though.
    +169     * <br>
    +170     * The error for this float version is extremely close to the double version, {@link #sin(double)}, so you should
    +171     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +172     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +173     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +174     * and likewise for doubles.
     175     * <br>
    -176     * The technique for sine approximation is mostly from
    -177     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -178     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    -179     * @param degrees an angle in degrees as a float, often from 0 to 360, though not required to be.
    -180     * @return the sine of the given angle, as a float between -1f and 1f (both inclusive)
    -181     */
    -182    public static float sinDegrees(float degrees)
    -183    {
    -184        degrees = degrees * 0.011111111111111112f;
    -185        final int floor = (degrees >= 0.0 ? (int) degrees : (int) degrees - 1) & -2;
    -186        degrees -= floor;
    -187        degrees *= 2f - degrees;
    -188        return degrees * (-0.775f - 0.225f * degrees) * ((floor & 2) - 1);
    -189    }
    -190
    -191    /**
    -192     * A fairly-close approximation of {@link Math#cos(double)} that can be significantly faster (between 8x and 80x
    -193     * faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should
    -194     * consider its more-precise and sometimes-faster MathUtils.cosDeg() method. Because this method doesn't rely on a
    -195     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    -196     * with this method than with MathUtils. Takes one angle in degrees,
    -197     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    -198     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). The
    -199     * difference between the result of this method and {@link Math#cos(double)} should be under 0.0011 at
    -200     * all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for
    -201     * potentially higher errors, though.
    -202     * <br>
    -203     * The error for this float version is extremely close to the double version, {@link #cos(double)}, so you should
    -204     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -205     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -206     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -207     * and likewise for doubles.
    -208     * <br>
    -209     * Unlike in previous versions of this method, the sign of the input doesn't affect performance here, at least not
    -210     * by a measurable amount.
    +176     * Unlike in previous versions of this method, the sign of the input doesn't affect performance here, at least not
    +177     * by a measurable amount.
    +178     * <br>
    +179     * The technique for sine approximation is mostly from
    +180     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +181     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    +182     * @param degrees an angle in degrees as a float, often from 0 to 360, though not required to be.
    +183     * @return the sine of the given angle, as a float between -1f and 1f (both inclusive)
    +184     */
    +185    public static float sinDegrees(float degrees)
    +186    {
    +187        degrees = degrees * 0.011111111111111112f;
    +188        final int floor = (degrees >= 0.0 ? (int) degrees : (int) degrees - 1) & -2;
    +189        degrees -= floor;
    +190        degrees *= 2f - degrees;
    +191        return degrees * (-0.775f - 0.225f * degrees) * ((floor & 2) - 1);
    +192    }
    +193
    +194    /**
    +195     * A fairly-close approximation of {@link Math#cos(double)} that can be significantly faster (between 8x and 80x
    +196     * faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should
    +197     * consider its more-precise and sometimes-faster MathUtils.cosDeg() method. Because this method doesn't rely on a
    +198     * lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better
    +199     * with this method than with MathUtils. Takes one angle in degrees,
    +200     * which may technically be any float (but this will lose precision on fairly large floats, such as those that are
    +201     * larger than {@link Integer#MAX_VALUE}, because those floats themselves will lose precision at that scale). The
    +202     * difference between the result of this method and {@link Math#cos(double)} should be under 0.0011 at
    +203     * all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for
    +204     * potentially higher errors, though.
    +205     * <br>
    +206     * The error for this float version is extremely close to the double version, {@link #cos(double)}, so you should
    +207     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +208     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +209     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +210     * and likewise for doubles.
     211     * <br>
    -212     * The technique for cosine approximation is mostly from
    -213     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -214     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    -215     * @param degrees an angle in degrees as a float, often from 0 to pi * 2, though not required to be.
    -216     * @return the cosine of the given angle, as a float between -1f and 1f (both inclusive)
    -217     */
    -218    public static float cosDegrees(float degrees)
    -219    {
    -220        degrees = degrees * 0.011111111111111112f + 1f;
    -221        final int floor = (degrees >= 0.0 ? (int) degrees : (int) degrees - 1) & -2;
    -222        degrees -= floor;
    -223        degrees *= 2f - degrees;
    -224        return degrees * (-0.775f - 0.225f * degrees) * ((floor & 2) - 1);
    -225    }
    -226
    -227    /**
    -228     * A variation on {@link Math#sin(double)} that takes its input as a fraction of a turn instead of in radians; one
    -229     * turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements;
    -230     * to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide
    -231     * the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also
    -232     * called brad (with 256 brad equal to 360 degrees), you would divide by 256.0 or multiply by 0.00390625 before
    -233     * passing that value here. The brad case is especially useful because you can use a byte for any brad values, and
    -234     * adding up those brad values will wrap correctly (256 brad goes back to 0) while keeping perfect precision for the
    -235     * results (you still divide by 256.0 when you pass the brad value to this method).
    -236     * <br>
    -237     * The error for this double version is extremely close to the float version, {@link #sin_(float)}, so you should
    -238     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -239     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -240     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -241     * and likewise for doubles.
    -242     * <br>
    -243     * The technique for sine approximation is mostly from
    -244     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -245     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    -246     * @param turns an angle as a fraction of a turn as a double, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    -247     * @return the sine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    -248     */
    -249    public static double sin_(double turns)
    -250    {
    -251        turns *= 4.0;
    -252        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    -253        turns -= floor;
    -254        turns *= 2.0 - turns;
    -255        return turns * (-0.775 - 0.225 * turns) * ((floor & 2L) - 1L);
    -256    }
    -257
    -258    /**
    -259     * A variation on {@link Math#cos(double)} that takes its input as a fraction of a turn instead of in radians; one
    -260     * turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements;
    -261     * to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide
    -262     * the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also
    -263     * called brad (with 256 brad equal to 360 degrees), you would divide by 256.0 or multiply by 0.00390625 before
    -264     * passing that value here. The brad case is especially useful because you can use a byte for any brad values, and
    -265     * adding up those brad values will wrap correctly (256 brad goes back to 0) while keeping perfect precision for the
    -266     * results (you still divide by 256.0 when you pass the brad value to this method).
    -267     * <br>
    -268     * The error for this double version is extremely close to the float version, {@link #cos_(float)}, so you should
    -269     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -270     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -271     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -272     * and likewise for doubles.
    -273     * <br>
    -274     * The technique for cosine approximation is mostly from
    -275     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -276     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    -277     * @param turns an angle as a fraction of a turn as a double, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    -278     * @return the cosine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    -279     */
    -280    public static double cos_(double turns)
    -281    {
    -282        turns = turns * 4.0 + 1.0;
    -283        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    -284        turns -= floor;
    -285        turns *= 2.0 - turns;
    -286        return turns * (-0.775 - 0.225 * turns) * ((floor & 2L) - 1L);
    -287    }
    -288
    -289    /**
    -290     * A variation on {@link Math#sin(double)} that takes its input as a fraction of a turn instead of in radians (it
    -291     * also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a
    -292     * building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to
    -293     * 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this
    -294     * method. Similarly for binary degrees, also called brad (with 256 brad equal to 360 degrees), you would divide by
    -295     * 256.0 or multiply by 0.00390625 before passing that value here. The brad case is especially useful because you
    -296     * can use a byte for any brad values, and adding up those brad values will wrap correctly (256 brad goes back to 0)
    -297     * while keeping perfect precision for the results (you still divide by 256.0 when you pass the brad value to this
    -298     * method).
    -299     * <br>
    -300     * The error for this float version is extremely close to the double version, {@link #sin_(double)}, so you should
    -301     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -302     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -303     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -304     * and likewise for doubles.
    -305     * <br>
    -306     * The technique for sine approximation is mostly from
    -307     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -308     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    -309     * @param turns an angle as a fraction of a turn as a float, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    -310     * @return the sine of the given angle, as a float between -1.0 and 1.0 (both inclusive)
    -311     */
    -312    public static float sin_(float turns)
    -313    {
    -314        turns *= 4f;
    -315        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    -316        turns -= floor;
    -317        turns *= 2f - turns;
    -318        return turns * (-0.775f - 0.225f * turns) * ((floor & 2L) - 1L);
    -319    }
    -320
    -321    /**
    -322     * A variation on {@link Math#cos(double)} that takes its input as a fraction of a turn instead of in radians (it
    -323     * also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a
    -324     * building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal
    -325     * to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this
    -326     * method. Similarly for binary degrees, also called brad (with 256 brad equal to 360 degrees), you would divide by
    -327     * 256.0 or multiply by 0.00390625 before passing that value here. The brad case is especially useful because you
    -328     * can use a byte for any brad values, and adding up those brad values will wrap correctly (256 brad goes back to 0)
    -329     * while keeping perfect precision for the results (you still divide by 256.0 when you pass the brad value to this
    -330     * method).
    -331     * <br>
    -332     * The error for this float version is extremely close to the float version, {@link #cos_(double)}, so you should
    -333     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    -334     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    -335     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    -336     * and likewise for doubles.
    -337     * <br>
    -338     * The technique for cosine approximation is mostly from
    -339     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    -340     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    -341     * @param turns an angle as a fraction of a turn as a float, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    -342     * @return the cosine of the given angle, as a float between -1.0 and 1.0 (both inclusive)
    -343     */
    -344    public static float cos_(float turns)
    -345    {
    -346        turns = turns * 4f + 1f;
    -347        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    -348        turns -= floor;
    -349        turns *= 2f - turns;
    -350        return turns * (-0.775f - 0.225f * turns) * ((floor & 2L) - 1L);
    -351    }
    -352
    -353    /**
    -354     * Arc tangent approximation with very low error, using an algorithm from the 1955 research study
    -355     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    -356     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    -357     * but is somewhat less precise than Math's implementation.
    -358     * @param i an input to the inverse tangent function; any double is accepted
    -359     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    -360     */
    -361    public static double atan(final double i) {
    -362        final double n = Math.min(Math.abs(i), Double.MAX_VALUE);
    -363        final double c = (n - 1.0) / (n + 1.0);
    -364        final double c2 = c * c;
    -365        final double c3 = c * c2;
    -366        final double c5 = c3 * c2;
    -367        final double c7 = c5 * c2;
    -368        return Math.copySign(0.7853981633974483 +
    -369                (0.999215 * c - 0.3211819 * c3 + 0.1462766 * c5 - 0.0389929 * c7), i);
    -370    }
    -371
    -372    /**
    -373     * Arc tangent approximation with very low error, using an algorithm from the 1955 research study
    -374     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    -375     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    -376     * but is somewhat less precise than Math's implementation.
    -377     * @param i an input to the inverse tangent function; any float is accepted
    -378     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    -379     */
    -380    public static float atan(final float i) {
    -381        final float n = Math.min(Math.abs(i), Float.MAX_VALUE);
    -382        final float c = (n - 1f) / (n + 1f);
    -383        final float c2 = c * c;
    -384        final float c3 = c * c2;
    -385        final float c5 = c3 * c2;
    -386        final float c7 = c5 * c2;
    -387        return Math.copySign(0.7853981633974483f +
    -388                (0.999215f * c - 0.3211819f * c3 + 0.1462766f * c5 - 0.0389929f * c7), i);
    -389    }
    -390
    -391    /**
    -392     * A variant on {@link #atan(double)} that does not tolerate infinite inputs, and is slightly faster.
    -393     * @param i any finite double
    -394     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    -395     */
    -396    private static double atn(final double i) {
    -397        final double n = Math.abs(i);
    -398        final double c = (n - 1.0) / (n + 1.0);
    -399        final double c2 = c * c;
    -400        final double c3 = c * c2;
    -401        final double c5 = c3 * c2;
    -402        final double c7 = c5 * c2;
    -403        return Math.copySign(0.7853981633974483 +
    -404                (0.999215 * c - 0.3211819 * c3 + 0.1462766 * c5 - 0.0389929 * c7), i);
    -405    }
    -406    /**
    -407     * A variant on {@link #atan(float)} that does not tolerate infinite inputs, and is slightly faster.
    -408     * @param i any finite float
    -409     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    -410     */
    -411    private static float atn(final float i) {
    -412        final float n = Math.abs(i);
    -413        final float c = (n - 1f) / (n + 1f);
    -414        final float c2 = c * c;
    -415        final float c3 = c * c2;
    -416        final float c5 = c3 * c2;
    -417        final float c7 = c5 * c2;
    -418        return Math.copySign(0.7853981633974483f +
    -419                (0.999215f * c - 0.3211819f * c3 + 0.1462766f * c5 - 0.0389929f * c7), i);
    -420    }
    -421
    -422    /**
    -423     * Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2
    -424     * approximation. Maximum error is below 0.00009 radians.
    -425     * Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in radians.
    -426     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    -427     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    -428     * MathUtils seems to have worse average error, though.
    -429     * <br>
    -430     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -431     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -432     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(double)}
    -433     * method, and the small code to make that work as atan2() was worked out from Wikipedia.
    -434     * <br>
    -435     * See also {@link #atan2_(double, double)} if you don't want a mess converting to degrees or some other
    -436     * measurement, since that method returns an angle from 0f (equal to 0 degrees) to 1f (equal to 360 degrees). You
    -437     * can also use {@link #atan2Degrees(double, double)} or {@link #atan2Degrees360(double, double)} to produce a
    -438     * result in degrees, either from -180 to 180 or 0 to 360.
    -439     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -440     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -441     * @return the angle to the given point, in radians as a double; ranges from -PI to PI
    -442     */
    -443    public static double atan2(final double y, double x) {
    -444        double n = y / x;
    -445        if(n != n) n = (y == x ? 1.0 : -1.0); // if both y and x are infinite, n would be NaN
    -446        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    -447        if(x > 0)
    -448            return atn(n);
    -449        else if(x < 0) {
    -450            if(y >= 0)
    -451                return atn(n) + 3.14159265358979323846;
    -452            else
    -453                return atn(n) - 3.14159265358979323846;
    -454        }
    -455        else if(y > 0) return x + 1.5707963267948966;
    -456        else if(y < 0) return x - 1.5707963267948966;
    -457        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -458    }
    -459
    -460    /**
    -461     * Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2
    -462     * approximation. Maximum error is below 0.00009 radians.
    -463     * Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in radians.
    -464     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    -465     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    -466     * MathUtils seems to have worse average error, though.
    -467     * <br>
    -468     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -469     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -470     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    -471     * method, and the small code to make that work as atan2() was worked out from Wikipedia.
    -472     * <br>
    -473     * See also {@link #atan2_(float, float)} if you don't want a mess converting to degrees or some other measurement,
    -474     * since that method returns an angle from 0f (equal to 0 degrees) to 1f (equal to 360 degrees). You can also use
    -475     * {@link #atan2Degrees(float, float)} or {@link #atan2Degrees360(float, float)} to produce a result in degrees,
    -476     * either from -180 to 180 or 0 to 360.
    -477     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -478     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -479     * @return the angle to the given point, in radians as a float; ranges from -PI to PI
    -480     */
    -481    public static float atan2(final float y, float x) {
    -482        float n = y / x;
    -483        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    -484        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    -485        if(x > 0)
    -486            return atn(n);
    -487        else if(x < 0) {
    -488            if(y >= 0)
    -489                return atn(n) + 3.14159265358979323846f;
    -490            else
    -491                return atn(n) - 3.14159265358979323846f;
    -492        }
    -493        else if(y > 0) return x + 1.5707963267948966f;
    -494        else if(y < 0) return x - 1.5707963267948966f;
    -495        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -496    }
    -497
    -498    /**
    -499     * This one's weird; unlike {@link #atan2_(double, double)}, it can return negative results.
    -500     * @param v any finite double
    -501     * @return between -0.25 and 0.25
    -502     */
    -503    private static double atn_(final double v) {
    -504        final double n = Math.abs(v);
    -505        final double c = (n - 1.0) / (n + 1.0);
    -506        final double c2 = c * c;
    -507        final double c3 = c * c2;
    -508        final double c5 = c3 * c2;
    -509        final double c7 = c5 * c2;
    -510        return Math.copySign(0.125 + 0.1590300064615682 * c - 0.051117687016646825 * c3 + 0.02328064394867594 * c5
    -511                - 0.006205912780487965 * c7, v);
    -512    }
    -513
    -514    /**
    -515     * This one's weird; unlike {@link #atan2_(float, float)}, it can return negative results.
    -516     * @param v any finite float
    -517     * @return between -0.25 and 0.25
    -518     */
    -519    private static float atn_(final float v) {
    -520        final float n = Math.abs(v);
    -521        final float c = (n - 1f) / (n + 1f);
    -522        final float c2 = c * c;
    -523        final float c3 = c * c2;
    -524        final float c5 = c3 * c2;
    -525        final float c7 = c5 * c2;
    -526        return Math.copySign(0.125f + 0.1590300064615682f * c - 0.051117687016646825f * c3 + 0.02328064394867594f * c5
    -527                - 0.006205912780487965f * c7, v);
    -528    }
    -529    /**
    -530     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as
    -531     * doubles and returning an angle measured in turns from 0.0 to 1.0 (inclusive), with one cycle over the range
    -532     * equivalent to 360 degrees or 2PI radians. You can multiply the angle by {@code 6.2831855f} to change to radians,
    -533     * or by {@code 360f} to change to degrees. Takes y and x (in that unusual order) as doubles. Will never return a
    -534     * negative number, which may help avoid costly floating-point modulus when you actually want a positive number.
    -535     * <br>
    -536     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -537     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -538     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    -539     * method, and the small code to make that work as atan2_() was worked out from Wikipedia.
    -540     * <br>
    -541     * Note that {@link #atan2(double, double)} returns an angle in radians and can return negative results, which may
    -542     * be fine for many tasks; these two methods are extremely close in implementation and speed. There are also
    -543     * {@link #atan2Degrees(double, double)} and {@link #atan2Degrees360(double, double)}, which provide an angle in
    -544     * degrees, either from -180 to 180 or 0 to 360.
    -545     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -546     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -547     * @return the angle to the given point, as a double from 0.0 to 1.0, inclusive
    -548     */
    -549    public static double atan2_(final double y, double x) {
    -550        double n = y / x;
    -551        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    -552        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    -553        if(x > 0) {
    -554            if(y >= 0)
    -555                return atn_(n);
    -556            else
    -557                return atn_(n) + 1.0;
    -558        }
    -559        else if(x < 0) {
    -560            return atn_(n) + 0.5;
    +212     * Unlike in previous versions of this method, the sign of the input doesn't affect performance here, at least not
    +213     * by a measurable amount.
    +214     * <br>
    +215     * The technique for cosine approximation is mostly from
    +216     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +217     * with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
    +218     * @param degrees an angle in degrees as a float, often from 0 to pi * 2, though not required to be.
    +219     * @return the cosine of the given angle, as a float between -1f and 1f (both inclusive)
    +220     */
    +221    public static float cosDegrees(float degrees)
    +222    {
    +223        degrees = degrees * 0.011111111111111112f + 1f;
    +224        final int floor = (degrees >= 0.0 ? (int) degrees : (int) degrees - 1) & -2;
    +225        degrees -= floor;
    +226        degrees *= 2f - degrees;
    +227        return degrees * (-0.775f - 0.225f * degrees) * ((floor & 2) - 1);
    +228    }
    +229
    +230    /**
    +231     * A variation on {@link Math#sin(double)} that takes its input as a fraction of a turn instead of in radians; one
    +232     * turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements;
    +233     * to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide
    +234     * the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also
    +235     * called brad (with 256 brad equal to 360 degrees), you would divide by 256.0 or multiply by 0.00390625 before
    +236     * passing that value here. The brad case is especially useful because you can use a byte for any brad values, and
    +237     * adding up those brad values will wrap correctly (256 brad goes back to 0) while keeping perfect precision for the
    +238     * results (you still divide by 256.0 when you pass the brad value to this method).
    +239     * <br>
    +240     * The error for this double version is extremely close to the float version, {@link #sin_(float)}, so you should
    +241     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +242     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +243     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +244     * and likewise for doubles.
    +245     * <br>
    +246     * The technique for sine approximation is mostly from
    +247     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +248     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    +249     * @param turns an angle as a fraction of a turn as a double, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    +250     * @return the sine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    +251     */
    +252    public static double sin_(double turns)
    +253    {
    +254        turns *= 4.0;
    +255        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    +256        turns -= floor;
    +257        turns *= 2.0 - turns;
    +258        return turns * (-0.775 - 0.225 * turns) * ((floor & 2L) - 1L);
    +259    }
    +260
    +261    /**
    +262     * A variation on {@link Math#cos(double)} that takes its input as a fraction of a turn instead of in radians; one
    +263     * turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements;
    +264     * to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide
    +265     * the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also
    +266     * called brad (with 256 brad equal to 360 degrees), you would divide by 256.0 or multiply by 0.00390625 before
    +267     * passing that value here. The brad case is especially useful because you can use a byte for any brad values, and
    +268     * adding up those brad values will wrap correctly (256 brad goes back to 0) while keeping perfect precision for the
    +269     * results (you still divide by 256.0 when you pass the brad value to this method).
    +270     * <br>
    +271     * The error for this double version is extremely close to the float version, {@link #cos_(float)}, so you should
    +272     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +273     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +274     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +275     * and likewise for doubles.
    +276     * <br>
    +277     * The technique for cosine approximation is mostly from
    +278     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +279     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    +280     * @param turns an angle as a fraction of a turn as a double, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    +281     * @return the cosine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    +282     */
    +283    public static double cos_(double turns)
    +284    {
    +285        turns = turns * 4.0 + 1.0;
    +286        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    +287        turns -= floor;
    +288        turns *= 2.0 - turns;
    +289        return turns * (-0.775 - 0.225 * turns) * ((floor & 2L) - 1L);
    +290    }
    +291
    +292    /**
    +293     * A variation on {@link Math#sin(double)} that takes its input as a fraction of a turn instead of in radians (it
    +294     * also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a
    +295     * building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to
    +296     * 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this
    +297     * method. Similarly for binary degrees, also called brad (with 256 brad equal to 360 degrees), you would divide by
    +298     * 256.0 or multiply by 0.00390625 before passing that value here. The brad case is especially useful because you
    +299     * can use a byte for any brad values, and adding up those brad values will wrap correctly (256 brad goes back to 0)
    +300     * while keeping perfect precision for the results (you still divide by 256.0 when you pass the brad value to this
    +301     * method).
    +302     * <br>
    +303     * The error for this float version is extremely close to the double version, {@link #sin_(double)}, so you should
    +304     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +305     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +306     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +307     * and likewise for doubles.
    +308     * <br>
    +309     * The technique for sine approximation is mostly from
    +310     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +311     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    +312     * @param turns an angle as a fraction of a turn as a float, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    +313     * @return the sine of the given angle, as a float between -1.0 and 1.0 (both inclusive)
    +314     */
    +315    public static float sin_(float turns)
    +316    {
    +317        turns *= 4f;
    +318        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    +319        turns -= floor;
    +320        turns *= 2f - turns;
    +321        return turns * (-0.775f - 0.225f * turns) * ((floor & 2L) - 1L);
    +322    }
    +323
    +324    /**
    +325     * A variation on {@link Math#cos(double)} that takes its input as a fraction of a turn instead of in radians (it
    +326     * also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a
    +327     * building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal
    +328     * to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this
    +329     * method. Similarly for binary degrees, also called brad (with 256 brad equal to 360 degrees), you would divide by
    +330     * 256.0 or multiply by 0.00390625 before passing that value here. The brad case is especially useful because you
    +331     * can use a byte for any brad values, and adding up those brad values will wrap correctly (256 brad goes back to 0)
    +332     * while keeping perfect precision for the results (you still divide by 256.0 when you pass the brad value to this
    +333     * method).
    +334     * <br>
    +335     * The error for this float version is extremely close to the float version, {@link #cos_(double)}, so you should
    +336     * choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion
    +337     * between float and double takes about as long as this method normally takes to run (or longer), so if you have
    +338     * floats you should usually use methods that take floats (or return floats, if assigning the result to a float),
    +339     * and likewise for doubles.
    +340     * <br>
    +341     * The technique for cosine approximation is mostly from
    +342     * <a href="https://web.archive.org/web/20080228213915/http://devmaster.net/forums/showthread.php?t=5784">this archived DevMaster thread</a>,
    +343     * with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    +344     * @param turns an angle as a fraction of a turn as a float, with 0.5 here equivalent to PI radians in {@link #cos(double)}
    +345     * @return the cosine of the given angle, as a float between -1.0 and 1.0 (both inclusive)
    +346     */
    +347    public static float cos_(float turns)
    +348    {
    +349        turns = turns * 4f + 1f;
    +350        final long floor = (turns >= 0.0 ? (long) turns : (long) turns - 1L) & -2L;
    +351        turns -= floor;
    +352        turns *= 2f - turns;
    +353        return turns * (-0.775f - 0.225f * turns) * ((floor & 2L) - 1L);
    +354    }
    +355
    +356    /**
    +357     * Arc tangent approximation with very low error, using an algorithm from the 1955 research study
    +358     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    +359     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    +360     * but is somewhat less precise than Math's implementation.
    +361     * @param i an input to the inverse tangent function; any double is accepted
    +362     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +363     */
    +364    public static double atan(final double i) {
    +365        final double n = Math.min(Math.abs(i), Double.MAX_VALUE);
    +366        final double c = (n - 1.0) / (n + 1.0);
    +367        final double c2 = c * c;
    +368        final double c3 = c * c2;
    +369        final double c5 = c3 * c2;
    +370        final double c7 = c5 * c2;
    +371        return Math.copySign(0.7853981633974483 +
    +372                (0.999215 * c - 0.3211819 * c3 + 0.1462766 * c5 - 0.0389929 * c7), i);
    +373    }
    +374
    +375    /**
    +376     * Arc tangent approximation with very low error, using an algorithm from the 1955 research study
    +377     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    +378     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    +379     * but is somewhat less precise than Math's implementation.
    +380     * @param i an input to the inverse tangent function; any float is accepted
    +381     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +382     */
    +383    public static float atan(final float i) {
    +384        final float n = Math.min(Math.abs(i), Float.MAX_VALUE);
    +385        final float c = (n - 1f) / (n + 1f);
    +386        final float c2 = c * c;
    +387        final float c3 = c * c2;
    +388        final float c5 = c3 * c2;
    +389        final float c7 = c5 * c2;
    +390        return Math.copySign(0.7853981633974483f +
    +391                (0.999215f * c - 0.3211819f * c3 + 0.1462766f * c5 - 0.0389929f * c7), i);
    +392    }
    +393
    +394    /**
    +395     * A variant on {@link #atan(double)} that does not tolerate infinite inputs, and is slightly faster.
    +396     * @param i any finite double
    +397     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +398     */
    +399    private static double atn(final double i) {
    +400        final double n = Math.abs(i);
    +401        final double c = (n - 1.0) / (n + 1.0);
    +402        final double c2 = c * c;
    +403        final double c3 = c * c2;
    +404        final double c5 = c3 * c2;
    +405        final double c7 = c5 * c2;
    +406        return Math.copySign(0.7853981633974483 +
    +407                (0.999215 * c - 0.3211819 * c3 + 0.1462766 * c5 - 0.0389929 * c7), i);
    +408    }
    +409    /**
    +410     * A variant on {@link #atan(float)} that does not tolerate infinite inputs, and is slightly faster.
    +411     * @param i any finite float
    +412     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +413     */
    +414    private static float atn(final float i) {
    +415        final float n = Math.abs(i);
    +416        final float c = (n - 1f) / (n + 1f);
    +417        final float c2 = c * c;
    +418        final float c3 = c * c2;
    +419        final float c5 = c3 * c2;
    +420        final float c7 = c5 * c2;
    +421        return Math.copySign(0.7853981633974483f +
    +422                (0.999215f * c - 0.3211819f * c3 + 0.1462766f * c5 - 0.0389929f * c7), i);
    +423    }
    +424
    +425    /**
    +426     * Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2
    +427     * approximation. Maximum error is below 0.00009 radians.
    +428     * Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in radians.
    +429     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    +430     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    +431     * MathUtils seems to have worse average error, though.
    +432     * <br>
    +433     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +434     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +435     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(double)}
    +436     * method, and the small code to make that work as atan2() was worked out from Wikipedia.
    +437     * <br>
    +438     * See also {@link #atan2_(double, double)} if you don't want a mess converting to degrees or some other
    +439     * measurement, since that method returns an angle from 0f (equal to 0 degrees) to 1f (equal to 360 degrees). You
    +440     * can also use {@link #atan2Degrees(double, double)} or {@link #atan2Degrees360(double, double)} to produce a
    +441     * result in degrees, either from -180 to 180 or 0 to 360.
    +442     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +443     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +444     * @return the angle to the given point, in radians as a double; ranges from -PI to PI
    +445     */
    +446    public static double atan2(final double y, double x) {
    +447        double n = y / x;
    +448        if(n != n) n = (y == x ? 1.0 : -1.0); // if both y and x are infinite, n would be NaN
    +449        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    +450        if(x > 0)
    +451            return atn(n);
    +452        else if(x < 0) {
    +453            if(y >= 0)
    +454                return atn(n) + 3.14159265358979323846;
    +455            else
    +456                return atn(n) - 3.14159265358979323846;
    +457        }
    +458        else if(y > 0) return x + 1.5707963267948966;
    +459        else if(y < 0) return x - 1.5707963267948966;
    +460        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +461    }
    +462
    +463    /**
    +464     * Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2
    +465     * approximation. Maximum error is below 0.00009 radians.
    +466     * Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in radians.
    +467     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    +468     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    +469     * MathUtils seems to have worse average error, though.
    +470     * <br>
    +471     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +472     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +473     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    +474     * method, and the small code to make that work as atan2() was worked out from Wikipedia.
    +475     * <br>
    +476     * See also {@link #atan2_(float, float)} if you don't want a mess converting to degrees or some other measurement,
    +477     * since that method returns an angle from 0f (equal to 0 degrees) to 1f (equal to 360 degrees). You can also use
    +478     * {@link #atan2Degrees(float, float)} or {@link #atan2Degrees360(float, float)} to produce a result in degrees,
    +479     * either from -180 to 180 or 0 to 360.
    +480     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +481     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +482     * @return the angle to the given point, in radians as a float; ranges from -PI to PI
    +483     */
    +484    public static float atan2(final float y, float x) {
    +485        float n = y / x;
    +486        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    +487        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    +488        if(x > 0)
    +489            return atn(n);
    +490        else if(x < 0) {
    +491            if(y >= 0)
    +492                return atn(n) + 3.14159265358979323846f;
    +493            else
    +494                return atn(n) - 3.14159265358979323846f;
    +495        }
    +496        else if(y > 0) return x + 1.5707963267948966f;
    +497        else if(y < 0) return x - 1.5707963267948966f;
    +498        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +499    }
    +500
    +501    /**
    +502     * This one's weird; unlike {@link #atan2_(double, double)}, it can return negative results.
    +503     * @param v any finite double
    +504     * @return between -0.25 and 0.25
    +505     */
    +506    private static double atn_(final double v) {
    +507        final double n = Math.abs(v);
    +508        final double c = (n - 1.0) / (n + 1.0);
    +509        final double c2 = c * c;
    +510        final double c3 = c * c2;
    +511        final double c5 = c3 * c2;
    +512        final double c7 = c5 * c2;
    +513        return Math.copySign(0.125 + 0.1590300064615682 * c - 0.051117687016646825 * c3 + 0.02328064394867594 * c5
    +514                - 0.006205912780487965 * c7, v);
    +515    }
    +516
    +517    /**
    +518     * This one's weird; unlike {@link #atan2_(float, float)}, it can return negative results.
    +519     * @param v any finite float
    +520     * @return between -0.25 and 0.25
    +521     */
    +522    private static float atn_(final float v) {
    +523        final float n = Math.abs(v);
    +524        final float c = (n - 1f) / (n + 1f);
    +525        final float c2 = c * c;
    +526        final float c3 = c * c2;
    +527        final float c5 = c3 * c2;
    +528        final float c7 = c5 * c2;
    +529        return Math.copySign(0.125f + 0.1590300064615682f * c - 0.051117687016646825f * c3 + 0.02328064394867594f * c5
    +530                - 0.006205912780487965f * c7, v);
    +531    }
    +532    /**
    +533     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as
    +534     * doubles and returning an angle measured in turns from 0.0 to 1.0 (inclusive), with one cycle over the range
    +535     * equivalent to 360 degrees or 2PI radians. You can multiply the angle by {@code 6.2831855f} to change to radians,
    +536     * or by {@code 360f} to change to degrees. Takes y and x (in that unusual order) as doubles. Will never return a
    +537     * negative number, which may help avoid costly floating-point modulus when you actually want a positive number.
    +538     * <br>
    +539     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +540     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +541     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    +542     * method, and the small code to make that work as atan2_() was worked out from Wikipedia.
    +543     * <br>
    +544     * Note that {@link #atan2(double, double)} returns an angle in radians and can return negative results, which may
    +545     * be fine for many tasks; these two methods are extremely close in implementation and speed. There are also
    +546     * {@link #atan2Degrees(double, double)} and {@link #atan2Degrees360(double, double)}, which provide an angle in
    +547     * degrees, either from -180 to 180 or 0 to 360.
    +548     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +549     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +550     * @return the angle to the given point, as a double from 0.0 to 1.0, inclusive
    +551     */
    +552    public static double atan2_(final double y, double x) {
    +553        double n = y / x;
    +554        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    +555        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    +556        if(x > 0) {
    +557            if(y >= 0)
    +558                return atn_(n);
    +559            else
    +560                return atn_(n) + 1.0;
     561        }
    -562        else if(y > 0) return x + 0.25;
    -563        else if(y < 0) return x + 0.75;
    -564        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -565    }
    -566
    -567    /**
    -568     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as floats
    -569     * and returning an angle measured in turns from 0.0f to 1.0f, with one cycle over the range equivalent to 360
    -570     * degrees or 2PI radians. You can multiply the angle by {@code 6.2831855f} to change to radians, or by {@code 360f}
    -571     * to change to degrees. Takes y and x (in that unusual order) as floats. Will never return a negative number, which
    -572     * may help avoid costly floating-point modulus when you actually want a positive number.
    -573     * <br>
    -574     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -575     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -576     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    -577     * method, and the small code to make that work as atan2_() was worked out from Wikipedia.
    -578     * <br>
    -579     * Note that {@link #atan2(float, float)} returns an angle in radians and can return negative results, which may
    -580     * be fine for many tasks; these two methods are extremely close in implementation and speed. There are also
    -581     * {@link #atan2Degrees(float, float)} and {@link #atan2Degrees360(float, float)}, which provide an angle in
    -582     * degrees, either from -180 to 180 or 0 to 360.
    -583     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -584     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -585     * @return the angle to the given point, as a float from 0.0f to 1.0f, inclusive
    -586     */
    -587    public static float atan2_(final float y, float x) {
    -588        float n = y / x;
    -589        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    -590        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    -591        if(x > 0) {
    -592            if(y >= 0)
    -593                return atn_(n);
    -594            else
    -595                return atn_(n) + 1f;
    -596        }
    -597        else if(x < 0) {
    -598            return atn_(n) + 0.5f;
    +562        else if(x < 0) {
    +563            return atn_(n) + 0.5;
    +564        }
    +565        else if(y > 0) return x + 0.25;
    +566        else if(y < 0) return x + 0.75;
    +567        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +568    }
    +569
    +570    /**
    +571     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as floats
    +572     * and returning an angle measured in turns from 0.0f to 1.0f, with one cycle over the range equivalent to 360
    +573     * degrees or 2PI radians. You can multiply the angle by {@code 6.2831855f} to change to radians, or by {@code 360f}
    +574     * to change to degrees. Takes y and x (in that unusual order) as floats. Will never return a negative number, which
    +575     * may help avoid costly floating-point modulus when you actually want a positive number.
    +576     * <br>
    +577     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +578     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +579     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    +580     * method, and the small code to make that work as atan2_() was worked out from Wikipedia.
    +581     * <br>
    +582     * Note that {@link #atan2(float, float)} returns an angle in radians and can return negative results, which may
    +583     * be fine for many tasks; these two methods are extremely close in implementation and speed. There are also
    +584     * {@link #atan2Degrees(float, float)} and {@link #atan2Degrees360(float, float)}, which provide an angle in
    +585     * degrees, either from -180 to 180 or 0 to 360.
    +586     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +587     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +588     * @return the angle to the given point, as a float from 0.0f to 1.0f, inclusive
    +589     */
    +590    public static float atan2_(final float y, float x) {
    +591        float n = y / x;
    +592        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    +593        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    +594        if(x > 0) {
    +595            if(y >= 0)
    +596                return atn_(n);
    +597            else
    +598                return atn_(n) + 1f;
     599        }
    -600        else if(y > 0) return x + 0.25f;
    -601        else if(y < 0) return x + 0.75f;
    -602        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -603    }
    -604
    -605    /**
    -606     * Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study
    -607     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    -608     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    -609     * but is somewhat less precise than Math's implementation. This implementation can return negative or positive
    -610     * results in degrees.
    -611     * @param i an input to the inverse tangent function; any double is accepted
    -612     * @return an output from the inverse tangent function in degrees, from -90 to 90 inclusive
    -613     */
    -614    public static double atanDegrees(final double i) {
    -615        final double n = Math.min(Math.abs(i), Double.MAX_VALUE);
    -616        final double c = (n - 1.0) / (n + 1.0);
    -617        final double c2 = c * c;
    -618        final double c3 = c * c2;
    -619        final double c5 = c3 * c2;
    -620        final double c7 = c5 * c2;
    -621        return Math.copySign(45.0 +
    -622                (57.25080271739779 * c - 18.402366944901082 * c3 + 8.381031432388337 * c5 - 2.2341286239715488 * c7), i);
    -623    }
    -624
    -625    /**
    -626     * Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study
    -627     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    -628     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    -629     * but is somewhat less precise than Math's implementation. This implementation can return negative or positive
    -630     * results in degrees.
    -631     * @param i an input to the inverse tangent function; any float is accepted
    -632     * @return an output from the inverse tangent function, from -90 to 90 inclusive
    -633     */
    -634    public static float atanDegrees(final float i) {
    -635        final float n = Math.min(Math.abs(i), Float.MAX_VALUE);
    -636        final float c = (n - 1f) / (n + 1f);
    -637        final float c2 = c * c;
    -638        final float c3 = c * c2;
    -639        final float c5 = c3 * c2;
    -640        final float c7 = c5 * c2;
    -641        return Math.copySign(45f +
    -642                (57.25080271739779f * c - 18.402366944901082f * c3 + 8.381031432388337f * c5 - 2.2341286239715488f * c7), i);
    -643    }
    -644    /**
    -645     * A variant on {@link #atanDegrees(double)} that does not tolerate infinite inputs, and is slightly faster.
    -646     * @param i any finite double
    -647     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    -648     */
    -649    private static double atnDegrees(final double i) {
    -650        final double n = Math.abs(i);
    -651        final double c = (n - 1.0) / (n + 1.0);
    -652        final double c2 = c * c;
    -653        final double c3 = c * c2;
    -654        final double c5 = c3 * c2;
    -655        final double c7 = c5 * c2;
    -656        return Math.copySign(45.0 +
    -657                (57.25080271739779 * c - 18.402366944901082 * c3 + 8.381031432388337 * c5 - 2.2341286239715488 * c7), i);
    -658    }
    -659    /**
    -660     * A variant on {@link #atan(float)} that does not tolerate infinite inputs, and is slightly faster.
    -661     * @param i any finite float
    -662     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    -663     */
    -664    private static float atnDegrees(final float i) {
    -665        final float n = Math.abs(i);
    -666        final float c = (n - 1f) / (n + 1f);
    -667        final float c2 = c * c;
    -668        final float c3 = c * c2;
    -669        final float c5 = c3 * c2;
    -670        final float c7 = c5 * c2;
    -671        return Math.copySign(45f +
    -672                (57.25080271739779f * c - 18.402366944901082f * c3 + 8.381031432388337f * c5 - 2.2341286239715488f * c7), i);
    -673    }
    -674
    -675    /**
    -676     * Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision
    -677     * than libGDX's atan2 approximation. The range for this is -180 to 180.
    -678     * Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in degrees.
    -679     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    -680     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    -681     * MathUtils seems to have worse average error, as well.
    -682     * <br>
    -683     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -684     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -685     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(double)}
    -686     * method, and the small code to make that work as atan2Degrees() was worked out from Wikipedia.
    -687     * <br>
    -688     * See also {@link #atan2_(double, double)} for a version that returns a measurement as a fraction of a turn, or
    -689     * {@link #atan2(double, double)} for the typical radians. You
    -690     * can also use {@link #atan2Degrees360(double, double)} to produce a result in degrees from 0 to 360.
    -691     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -692     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -693     * @return the angle to the given point, in radians as a double; ranges from -180 to 180
    -694     */
    -695    public static double atan2Degrees(final double y, double x) {
    -696        double n = y / x;
    -697        if(n != n) n = (y == x ? 1.0 : -1.0); // if both y and x are infinite, n would be NaN
    -698        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    -699        if(x > 0)
    -700            return atnDegrees(n);
    -701        else if(x < 0) {
    -702            if(y >= 0)
    -703                return atnDegrees(n) + 180.0;
    -704            else
    -705                return atnDegrees(n) - 180.0;
    -706        }
    -707        else if(y > 0) return x + 90.0;
    -708        else if(y < 0) return x - 90.0;
    -709        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -710    }
    -711
    -712    /**
    -713     * Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision
    -714     * than libGDX's atan2 approximation. The range for this is -180 to 180.
    -715     * Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in degrees.
    -716     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    -717     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    -718     * MathUtils seems to have worse average error, as well.
    -719     * <br>
    -720     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -721     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -722     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    -723     * method, and the small code to make that work as atan2Degrees() was worked out from Wikipedia.
    -724     * <br>
    -725     * See also {@link #atan2_(float, float)} for a version that returns a measurement as a fraction of a turn, or
    -726     * {@link #atan2(float, float)} for the typical radians. You
    -727     * can also use {@link #atan2Degrees360(float, float)} to produce a result in degrees from 0 to 360.
    -728     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -729     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -730     * @return the angle to the given point, in radians as a float; ranges from -180 to 180
    -731     */
    -732    public static float atan2Degrees(final float y, float x) {
    -733        float n = y / x;
    -734        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    -735        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    -736        if(x > 0)
    -737            return atnDegrees(n);
    -738        else if(x < 0) {
    -739            if(y >= 0)
    -740                return atnDegrees(n) + 180f;
    -741            else
    -742                return atnDegrees(n) - 180f;
    -743        }
    -744        else if(y > 0) return x + 90f;
    -745        else if(y < 0) return x - 90f;
    -746        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -747    }
    -748
    -749    /**
    -750     * This one's weird; unlike {@link #atan2Degrees360(double, double)}, it can return negative results.
    -751     * @param v any finite double
    -752     * @return between -90 and 90
    -753     */
    -754    private static double atnDegrees360(final double v) {
    -755        final double n = Math.abs(v);
    -756        final double c = (n - 1.0) / (n + 1.0);
    -757        final double c2 = c * c;
    -758        final double c3 = c * c2;
    -759        final double c5 = c3 * c2;
    -760        final double c7 = c5 * c2;
    -761        return Math.copySign(45.0 + 57.25080232616455 * c - 18.402367325992856 * c3
    -762                + 8.381031821523338 * c5 - 2.2341286009756676 * c7, v);
    -763    }
    -764
    -765    /**
    -766     * This one's weird; unlike {@link #atan2Degrees360(float, float)}, it can return negative results.
    -767     * @param v any finite float
    -768     * @return between -90 and 90
    -769     */
    -770    private static float atnDegrees360(final float v) {
    -771        final float n = Math.abs(v);
    -772        final float c = (n - 1f) / (n + 1f);
    -773        final float c2 = c * c;
    -774        final float c3 = c * c2;
    -775        final float c5 = c3 * c2;
    -776        final float c7 = c5 * c2;
    -777        return Math.copySign(45f + 57.25080232616455f * c - 18.402367325992856f * c3
    -778                + 8.381031821523338f * c5 - 2.2341286009756676f * c7, v);
    -779    }
    -780    /**
    -781     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as
    -782     * doubles and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range
    -783     * equivalent to 2PI radians or 1 turn. Takes y and x (in that unusual order) as doubles. Will never return a
    -784     * negative number, which may help avoid costly floating-point modulus when you actually want a positive number.
    -785     * <br>
    -786     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -787     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -788     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(double)}
    -789     * method, and the small code to make that work as atan2Degrees360() was worked out from Wikipedia.
    -790     * <br>
    -791     * See also {@link #atan2_(double, double)} for a version that returns a measurement as a fraction of a turn, or
    -792     * {@link #atan2(double, double)} for the typical radians. You
    -793     * can also use {@link #atan2Degrees(double, double)} to produce a result in degrees from -180 to 180.
    -794     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -795     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -796     * @return the angle to the given point, as a double from 0.0 to 360.0, inclusive
    -797     */
    -798    public static double atan2Degrees360(final double y, double x) {
    -799        double n = y / x;
    -800        if(n != n) n = (y == x ? 1.0 : -1.0); // if both y and x are infinite, n would be NaN
    -801        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    -802        if(x > 0) {
    -803            if(y >= 0)
    -804                return atnDegrees360(n);
    -805            else
    -806                return atnDegrees360(n) + 360.0;
    -807        }
    -808        else if(x < 0) {
    -809            return atnDegrees360(n) + 180.0;
    +600        else if(x < 0) {
    +601            return atn_(n) + 0.5f;
    +602        }
    +603        else if(y > 0) return x + 0.25f;
    +604        else if(y < 0) return x + 0.75f;
    +605        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +606    }
    +607
    +608    /**
    +609     * Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study
    +610     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    +611     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    +612     * but is somewhat less precise than Math's implementation. This implementation can return negative or positive
    +613     * results in degrees.
    +614     * @param i an input to the inverse tangent function; any double is accepted
    +615     * @return an output from the inverse tangent function in degrees, from -90 to 90 inclusive
    +616     */
    +617    public static double atanDegrees(final double i) {
    +618        final double n = Math.min(Math.abs(i), Double.MAX_VALUE);
    +619        final double c = (n - 1.0) / (n + 1.0);
    +620        final double c2 = c * c;
    +621        final double c3 = c * c2;
    +622        final double c5 = c3 * c2;
    +623        final double c7 = c5 * c2;
    +624        return Math.copySign(45.0 +
    +625                (57.25080271739779 * c - 18.402366944901082 * c3 + 8.381031432388337 * c5 - 2.2341286239715488 * c7), i);
    +626    }
    +627
    +628    /**
    +629     * Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study
    +630     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the
    +631     * second-fastest and second-least precise). This method is usually much faster than {@link Math#atan(double)},
    +632     * but is somewhat less precise than Math's implementation. This implementation can return negative or positive
    +633     * results in degrees.
    +634     * @param i an input to the inverse tangent function; any float is accepted
    +635     * @return an output from the inverse tangent function, from -90 to 90 inclusive
    +636     */
    +637    public static float atanDegrees(final float i) {
    +638        final float n = Math.min(Math.abs(i), Float.MAX_VALUE);
    +639        final float c = (n - 1f) / (n + 1f);
    +640        final float c2 = c * c;
    +641        final float c3 = c * c2;
    +642        final float c5 = c3 * c2;
    +643        final float c7 = c5 * c2;
    +644        return Math.copySign(45f +
    +645                (57.25080271739779f * c - 18.402366944901082f * c3 + 8.381031432388337f * c5 - 2.2341286239715488f * c7), i);
    +646    }
    +647    /**
    +648     * A variant on {@link #atanDegrees(double)} that does not tolerate infinite inputs, and is slightly faster.
    +649     * @param i any finite double
    +650     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +651     */
    +652    private static double atnDegrees(final double i) {
    +653        final double n = Math.abs(i);
    +654        final double c = (n - 1.0) / (n + 1.0);
    +655        final double c2 = c * c;
    +656        final double c3 = c * c2;
    +657        final double c5 = c3 * c2;
    +658        final double c7 = c5 * c2;
    +659        return Math.copySign(45.0 +
    +660                (57.25080271739779 * c - 18.402366944901082 * c3 + 8.381031432388337 * c5 - 2.2341286239715488 * c7), i);
    +661    }
    +662    /**
    +663     * A variant on {@link #atan(float)} that does not tolerate infinite inputs, and is slightly faster.
    +664     * @param i any finite float
    +665     * @return an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +666     */
    +667    private static float atnDegrees(final float i) {
    +668        final float n = Math.abs(i);
    +669        final float c = (n - 1f) / (n + 1f);
    +670        final float c2 = c * c;
    +671        final float c3 = c * c2;
    +672        final float c5 = c3 * c2;
    +673        final float c7 = c5 * c2;
    +674        return Math.copySign(45f +
    +675                (57.25080271739779f * c - 18.402366944901082f * c3 + 8.381031432388337f * c5 - 2.2341286239715488f * c7), i);
    +676    }
    +677
    +678    /**
    +679     * Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision
    +680     * than libGDX's atan2 approximation. The range for this is -180 to 180.
    +681     * Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in degrees.
    +682     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    +683     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    +684     * MathUtils seems to have worse average error, as well.
    +685     * <br>
    +686     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +687     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +688     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(double)}
    +689     * method, and the small code to make that work as atan2Degrees() was worked out from Wikipedia.
    +690     * <br>
    +691     * See also {@link #atan2_(double, double)} for a version that returns a measurement as a fraction of a turn, or
    +692     * {@link #atan2(double, double)} for the typical radians. You
    +693     * can also use {@link #atan2Degrees360(double, double)} to produce a result in degrees from 0 to 360.
    +694     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +695     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +696     * @return the angle to the given point, in radians as a double; ranges from -180 to 180
    +697     */
    +698    public static double atan2Degrees(final double y, double x) {
    +699        double n = y / x;
    +700        if(n != n) n = (y == x ? 1.0 : -1.0); // if both y and x are infinite, n would be NaN
    +701        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    +702        if(x > 0)
    +703            return atnDegrees(n);
    +704        else if(x < 0) {
    +705            if(y >= 0)
    +706                return atnDegrees(n) + 180.0;
    +707            else
    +708                return atnDegrees(n) - 180.0;
    +709        }
    +710        else if(y > 0) return x + 90.0;
    +711        else if(y < 0) return x - 90.0;
    +712        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +713    }
    +714
    +715    /**
    +716     * Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision
    +717     * than libGDX's atan2 approximation. The range for this is -180 to 180.
    +718     * Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in degrees.
    +719     * It is about 5 times faster than {@link Math#atan2(double, double)} (roughly 12 ns instead of roughly 62 ns for
    +720     * Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method;
    +721     * MathUtils seems to have worse average error, as well.
    +722     * <br>
    +723     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +724     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +725     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    +726     * method, and the small code to make that work as atan2Degrees() was worked out from Wikipedia.
    +727     * <br>
    +728     * See also {@link #atan2_(float, float)} for a version that returns a measurement as a fraction of a turn, or
    +729     * {@link #atan2(float, float)} for the typical radians. You
    +730     * can also use {@link #atan2Degrees360(float, float)} to produce a result in degrees from 0 to 360.
    +731     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +732     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +733     * @return the angle to the given point, in radians as a float; ranges from -180 to 180
    +734     */
    +735    public static float atan2Degrees(final float y, float x) {
    +736        float n = y / x;
    +737        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    +738        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    +739        if(x > 0)
    +740            return atnDegrees(n);
    +741        else if(x < 0) {
    +742            if(y >= 0)
    +743                return atnDegrees(n) + 180f;
    +744            else
    +745                return atnDegrees(n) - 180f;
    +746        }
    +747        else if(y > 0) return x + 90f;
    +748        else if(y < 0) return x - 90f;
    +749        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +750    }
    +751
    +752    /**
    +753     * This one's weird; unlike {@link #atan2Degrees360(double, double)}, it can return negative results.
    +754     * @param v any finite double
    +755     * @return between -90 and 90
    +756     */
    +757    private static double atnDegrees360(final double v) {
    +758        final double n = Math.abs(v);
    +759        final double c = (n - 1.0) / (n + 1.0);
    +760        final double c2 = c * c;
    +761        final double c3 = c * c2;
    +762        final double c5 = c3 * c2;
    +763        final double c7 = c5 * c2;
    +764        return Math.copySign(45.0 + 57.25080232616455 * c - 18.402367325992856 * c3
    +765                + 8.381031821523338 * c5 - 2.2341286009756676 * c7, v);
    +766    }
    +767
    +768    /**
    +769     * This one's weird; unlike {@link #atan2Degrees360(float, float)}, it can return negative results.
    +770     * @param v any finite float
    +771     * @return between -90 and 90
    +772     */
    +773    private static float atnDegrees360(final float v) {
    +774        final float n = Math.abs(v);
    +775        final float c = (n - 1f) / (n + 1f);
    +776        final float c2 = c * c;
    +777        final float c3 = c * c2;
    +778        final float c5 = c3 * c2;
    +779        final float c7 = c5 * c2;
    +780        return Math.copySign(45f + 57.25080232616455f * c - 18.402367325992856f * c3
    +781                + 8.381031821523338f * c5 - 2.2341286009756676f * c7, v);
    +782    }
    +783    /**
    +784     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as
    +785     * doubles and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range
    +786     * equivalent to 2PI radians or 1 turn. Takes y and x (in that unusual order) as doubles. Will never return a
    +787     * negative number, which may help avoid costly floating-point modulus when you actually want a positive number.
    +788     * <br>
    +789     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +790     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +791     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(double)}
    +792     * method, and the small code to make that work as atan2Degrees360() was worked out from Wikipedia.
    +793     * <br>
    +794     * See also {@link #atan2_(double, double)} for a version that returns a measurement as a fraction of a turn, or
    +795     * {@link #atan2(double, double)} for the typical radians. You
    +796     * can also use {@link #atan2Degrees(double, double)} to produce a result in degrees from -180 to 180.
    +797     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +798     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +799     * @return the angle to the given point, as a double from 0.0 to 360.0, inclusive
    +800     */
    +801    public static double atan2Degrees360(final double y, double x) {
    +802        double n = y / x;
    +803        if(n != n) n = (y == x ? 1.0 : -1.0); // if both y and x are infinite, n would be NaN
    +804        else if(n - n != n - n) x = 0.0; // if n is infinite, y is infinitely larger than x.
    +805        if(x > 0) {
    +806            if(y >= 0)
    +807                return atnDegrees360(n);
    +808            else
    +809                return atnDegrees360(n) + 360.0;
     810        }
    -811        else if(y > 0) return x + 90.0;
    -812        else if(y < 0) return x + 270.0;
    -813        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -814    }
    -815
    -816    /**
    -817     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as
    -818     * floats and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range
    -819     * equivalent to 2PI radians or 1 turn. Takes y and x (in that unusual order) as floats. Will never return a
    -820     * negative number, which may help avoid costly floating-point modulus when you actually want a positive number.
    -821     * <br>
    -822     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    -823     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    -824     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    -825     * method, and the small code to make that work as atan2Degrees360() was worked out from Wikipedia.
    -826     * <br>
    -827     * See also {@link #atan2_(float, float)} for a version that returns a measurement as a fraction of a turn, or
    -828     * {@link #atan2(float, float)} for the typical radians. You
    -829     * can also use {@link #atan2Degrees(float, float)} to produce a result in degrees from -180 to 180.
    -830     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -831     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    -832     * @return the angle to the given point, as a float from 0.0 to 360.0, inclusive
    -833     */
    -834    public static float atan2Degrees360(final float y, float x) {
    -835        float n = y / x;
    -836        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    -837        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    -838        if(x > 0) {
    -839            if(y >= 0)
    -840                return atnDegrees360(n);
    -841            else
    -842                return atnDegrees360(n) + 360f;
    -843        }
    -844        else if(x < 0) {
    -845            return atnDegrees360(n) + 180f;
    +811        else if(x < 0) {
    +812            return atnDegrees360(n) + 180.0;
    +813        }
    +814        else if(y > 0) return x + 90.0;
    +815        else if(y < 0) return x + 270.0;
    +816        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +817    }
    +818
    +819    /**
    +820     * Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as
    +821     * floats and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range
    +822     * equivalent to 2PI radians or 1 turn. Takes y and x (in that unusual order) as floats. Will never return a
    +823     * negative number, which may help avoid costly floating-point modulus when you actually want a positive number.
    +824     * <br>
    +825     * Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This
    +826     * is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster,
    +827     * but only by a very small degree, and is considerably less precise. That study provides an {@link #atan(float)}
    +828     * method, and the small code to make that work as atan2Degrees360() was worked out from Wikipedia.
    +829     * <br>
    +830     * See also {@link #atan2_(float, float)} for a version that returns a measurement as a fraction of a turn, or
    +831     * {@link #atan2(float, float)} for the typical radians. You
    +832     * can also use {@link #atan2Degrees(float, float)} to produce a result in degrees from -180 to 180.
    +833     * @param y y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +834     * @param x x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +835     * @return the angle to the given point, as a float from 0.0 to 360.0, inclusive
    +836     */
    +837    public static float atan2Degrees360(final float y, float x) {
    +838        float n = y / x;
    +839        if(n != n) n = (y == x ? 1f : -1f); // if both y and x are infinite, n would be NaN
    +840        else if(n - n != n - n) x = 0f; // if n is infinite, y is infinitely larger than x.
    +841        if(x > 0) {
    +842            if(y >= 0)
    +843                return atnDegrees360(n);
    +844            else
    +845                return atnDegrees360(n) + 360f;
     846        }
    -847        else if(y > 0) return x + 90f;
    -848        else if(y < 0) return x + 270f;
    -849        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    -850    }
    -851
    -852
    -853    /**
    -854     * Arc sine approximation with very low error, using an algorithm from the 1955 research study
    -855     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    -856     * and least precise). This method is usually much faster than {@link Math#asin(double)}, but is somewhat less
    -857     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    -858     * @param x an input to the inverse sine function, from -1 to 1 inclusive
    -859     * @return an output from the inverse sine function, from PI/-2.0 to PI/2.0 inclusive.
    -860     */
    -861    public static float asin(final float x) {
    -862        final float x2 = x * x;
    -863        final float x3 = x * x2;
    -864        if (x >= 0f) {
    -865            return 1.5707963267948966f - (float) Math.sqrt(1f - x) *
    -866                    (1.5707288f - 0.2121144f * x + 0.0742610f * x2 - 0.0187293f * x3);
    -867        }
    -868        else {
    -869            return -1.5707964f + (float) Math.sqrt(1f + x) *
    -870                    (1.5707288f + 0.2121144f * x + 0.0742610f * x2 + 0.0187293f * x3);
    -871        }
    -872    }
    -873    /**
    -874     * Arc cosine approximation with very low error, using an algorithm from the 1955 research study
    -875     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    -876     * and least precise). This method is usually much faster than {@link Math#acos(double)}, but is somewhat less
    -877     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    -878     * <br>
    -879     * Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    -880     * @param x an input to the inverse cosine function, from -1 to 1 inclusive
    -881     * @return an output from the inverse cosine function, from 0 to PI inclusive.
    -882     */
    -883    public static float acos(final float x) {
    -884        final float x2 = x * x;
    -885        final float x3 = x * x2;
    -886        if (x >= 0f) {
    -887            return (float) Math.sqrt(1f - x) * (1.5707288f - 0.2121144f * x + 0.0742610f * x2 - 0.0187293f * x3);
    -888        }
    -889        else {
    -890            return 3.14159265358979323846f - (float) Math.sqrt(1f + x) * (1.5707288f + 0.2121144f * x + 0.0742610f * x2 + 0.0187293f * x3);
    +847        else if(x < 0) {
    +848            return atnDegrees360(n) + 180f;
    +849        }
    +850        else if(y > 0) return x + 90f;
    +851        else if(y < 0) return x + 270f;
    +852        else return x + y; // returns 0 for 0,0 or NaN if either y or x is NaN
    +853    }
    +854
    +855
    +856    /**
    +857     * Arc sine approximation with very low error, using an algorithm from the 1955 research study
    +858     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    +859     * and least precise). This method is usually much faster than {@link Math#asin(double)}, but is somewhat less
    +860     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    +861     * @param x an input to the inverse sine function, from -1 to 1 inclusive
    +862     * @return an output from the inverse sine function, from PI/-2.0 to PI/2.0 inclusive.
    +863     */
    +864    public static float asin(final float x) {
    +865        final float x2 = x * x;
    +866        final float x3 = x * x2;
    +867        if (x >= 0f) {
    +868            return 1.5707963267948966f - (float) Math.sqrt(1f - x) *
    +869                    (1.5707288f - 0.2121144f * x + 0.0742610f * x2 - 0.0187293f * x3);
    +870        }
    +871        else {
    +872            return -1.5707964f + (float) Math.sqrt(1f + x) *
    +873                    (1.5707288f + 0.2121144f * x + 0.0742610f * x2 + 0.0187293f * x3);
    +874        }
    +875    }
    +876    /**
    +877     * Arc cosine approximation with very low error, using an algorithm from the 1955 research study
    +878     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    +879     * and least precise). This method is usually much faster than {@link Math#acos(double)}, but is somewhat less
    +880     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    +881     * <br>
    +882     * Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    +883     * @param x an input to the inverse cosine function, from -1 to 1 inclusive
    +884     * @return an output from the inverse cosine function, from 0 to PI inclusive.
    +885     */
    +886    public static float acos(final float x) {
    +887        final float x2 = x * x;
    +888        final float x3 = x * x2;
    +889        if (x >= 0f) {
    +890            return (float) Math.sqrt(1f - x) * (1.5707288f - 0.2121144f * x + 0.0742610f * x2 - 0.0187293f * x3);
     891        }
    -892    }
    -893
    -894    /**
    -895     * Arc sine approximation with very low error, using an algorithm from the 1955 research study
    -896     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    -897     * and least precise). This method is usually much faster than {@link Math#asin(double)}, but is somewhat less
    -898     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except
    -899     * that this takes a double and returns a double.
    -900     * <br>
    -901     * Accuracy: absolute error 0.000028447, relative error -0.000000033, max error 0.000067592 .
    -902     * @param x an input to the inverse sine function, from -1 to 1 inclusive
    -903     * @return an output from the inverse sine function, from PI/-2.0 to PI/2.0 inclusive.
    -904     */
    -905    public static double asin(final double x) {
    -906        final double x2 = x * x;
    -907        final double x3 = x * x2;
    -908        if (x >= 0.0) {
    -909            return 1.5707963267948966 - Math.sqrt(1.0 - x) *
    -910                    (1.5707288 - 0.2121144 * x + 0.0742610 * x2 - 0.0187293 * x3);
    -911        }
    -912        else {
    -913            return -1.5707963267948966 + Math.sqrt(1.0 + x) *
    -914                    (1.5707288 + 0.2121144 * x + 0.0742610 * x2 + 0.0187293 * x3);
    -915        }
    -916    }
    -917    /**
    -918     * Arc cosine approximation with very low error, using an algorithm from the 1955 research study
    -919     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    -920     * and least precise). This method is usually much faster than {@link Math#acos(double)}, but is somewhat less
    -921     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except
    -922     * that this takes a double and returns a double.
    -923     * <br>
    -924     * Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    -925     * @param x an input to the inverse cosine function, from -1 to 1 inclusive
    -926     * @return an output from the inverse cosine function, from 0 to PI inclusive.
    -927     */
    -928    public static double acos(final double x) {
    -929        final double x2 = x * x;
    -930        final double x3 = x * x2;
    -931        if (x >= 0.0) {
    -932            return Math.sqrt(1.0 - x) * (1.5707288 - 0.2121144 * x + 0.0742610 * x2 - 0.0187293 * x3);
    -933        }
    -934        else {
    -935            return 3.14159265358979323846 - Math.sqrt(1.0 + x) * (1.5707288 + 0.2121144 * x + 0.0742610 * x2 + 0.0187293 * x3);
    +892        else {
    +893            return 3.14159265358979323846f - (float) Math.sqrt(1f + x) * (1.5707288f + 0.2121144f * x + 0.0742610f * x2 + 0.0187293f * x3);
    +894        }
    +895    }
    +896
    +897    /**
    +898     * Arc sine approximation with very low error, using an algorithm from the 1955 research study
    +899     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    +900     * and least precise). This method is usually much faster than {@link Math#asin(double)}, but is somewhat less
    +901     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except
    +902     * that this takes a double and returns a double.
    +903     * <br>
    +904     * Accuracy: absolute error 0.000028447, relative error -0.000000033, max error 0.000067592 .
    +905     * @param x an input to the inverse sine function, from -1 to 1 inclusive
    +906     * @return an output from the inverse sine function, from PI/-2.0 to PI/2.0 inclusive.
    +907     */
    +908    public static double asin(final double x) {
    +909        final double x2 = x * x;
    +910        final double x3 = x * x2;
    +911        if (x >= 0.0) {
    +912            return 1.5707963267948966 - Math.sqrt(1.0 - x) *
    +913                    (1.5707288 - 0.2121144 * x + 0.0742610 * x2 - 0.0187293 * x3);
    +914        }
    +915        else {
    +916            return -1.5707963267948966 + Math.sqrt(1.0 + x) *
    +917                    (1.5707288 + 0.2121144 * x + 0.0742610 * x2 + 0.0187293 * x3);
    +918        }
    +919    }
    +920    /**
    +921     * Arc cosine approximation with very low error, using an algorithm from the 1955 research study
    +922     * "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest
    +923     * and least precise). This method is usually much faster than {@link Math#acos(double)}, but is somewhat less
    +924     * precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except
    +925     * that this takes a double and returns a double.
    +926     * <br>
    +927     * Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    +928     * @param x an input to the inverse cosine function, from -1 to 1 inclusive
    +929     * @return an output from the inverse cosine function, from 0 to PI inclusive.
    +930     */
    +931    public static double acos(final double x) {
    +932        final double x2 = x * x;
    +933        final double x3 = x * x2;
    +934        if (x >= 0.0) {
    +935            return Math.sqrt(1.0 - x) * (1.5707288 - 0.2121144 * x + 0.0742610 * x2 - 0.0187293 * x3);
     936        }
    -937    }
    -938    /**
    -939     * Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this
    -940     * range from 0.75 (inclusive) to 1.0 (exclusive), and continuing past that to 0.0 (inclusive) to 0.25 (inclusive).
    -941     * <br>
    -942     * This method is extremely similar to the non-turn approximation, but it never returns a negative result.
    -943     * @param x a double from -1.0 to 1.0 (both inclusive), usually the output of sin_() or cos_()
    -944     * @return one of the values that would produce {@code n} if it were passed to {@link #sin_(double)}
    -945     */
    -946    public static double asin_(final double x)
    -947    {
    -948        final double x2 = x * x;
    -949        final double x3 = x * x2;
    -950        if (x >= 0.0) {
    -951            return 0.25 - Math.sqrt(1.0 - x) *
    -952                    (0.24998925277680106 - 0.033759055260971525 * x + 0.01181900522894724 * x2 - 0.0029808606756510357 * x3);
    -953        }
    -954        else {
    -955            return 0.75 + Math.sqrt(1.0 + x) *
    -956                    (0.24998925277680106 + 0.033759055260971525 * x + 0.01181900522894724 * x2 + 0.0029808606756510357 * x3);
    -957        }
    -958    }
    -959    /**
    -960     * Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this
    -961     * range from 0.0 (inclusive) to 0.5 (inclusive).
    -962     * <br>
    -963     * This method is extremely similar to the non-turn approximation.
    -964     * @param x a double from -1.0 to 1.0 (both inclusive), usually the output of sin_() or cos_()
    -965     * @return one of the values that would produce {@code n} if it were passed to {@link #cos_(double)}
    -966     */
    -967    public static double acos_(final double x)
    -968    {
    -969        final double x2 = x * x;
    -970        final double x3 = x * x2;
    -971        if (x >= 0.0) {
    -972            return Math.sqrt(1.0 - x) * (0.24998925277680106 - 0.033759055260971525 * x + 0.01181900522894724 * x2 - 0.0029808606756510357 * x3);
    -973        }
    -974        else {
    -975            return 0.5 - Math.sqrt(1.0 + x) * (0.24998925277680106 + 0.033759055260971525 * x + 0.01181900522894724 * x2 + 0.0029808606756510357 * x3);
    +937        else {
    +938            return 3.14159265358979323846 - Math.sqrt(1.0 + x) * (1.5707288 + 0.2121144 * x + 0.0742610 * x2 + 0.0187293 * x3);
    +939        }
    +940    }
    +941    /**
    +942     * Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this
    +943     * range from 0.75 (inclusive) to 1.0 (exclusive), and continuing past that to 0.0 (inclusive) to 0.25 (inclusive).
    +944     * <br>
    +945     * This method is extremely similar to the non-turn approximation, but it never returns a negative result.
    +946     * @param x a double from -1.0 to 1.0 (both inclusive), usually the output of sin_() or cos_()
    +947     * @return one of the values that would produce {@code n} if it were passed to {@link #sin_(double)}
    +948     */
    +949    public static double asin_(final double x)
    +950    {
    +951        final double x2 = x * x;
    +952        final double x3 = x * x2;
    +953        if (x >= 0.0) {
    +954            return 0.25 - Math.sqrt(1.0 - x) *
    +955                    (0.24998925277680106 - 0.033759055260971525 * x + 0.01181900522894724 * x2 - 0.0029808606756510357 * x3);
    +956        }
    +957        else {
    +958            return 0.75 + Math.sqrt(1.0 + x) *
    +959                    (0.24998925277680106 + 0.033759055260971525 * x + 0.01181900522894724 * x2 + 0.0029808606756510357 * x3);
    +960        }
    +961    }
    +962    /**
    +963     * Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this
    +964     * range from 0.0 (inclusive) to 0.5 (inclusive).
    +965     * <br>
    +966     * This method is extremely similar to the non-turn approximation.
    +967     * @param x a double from -1.0 to 1.0 (both inclusive), usually the output of sin_() or cos_()
    +968     * @return one of the values that would produce {@code n} if it were passed to {@link #cos_(double)}
    +969     */
    +970    public static double acos_(final double x)
    +971    {
    +972        final double x2 = x * x;
    +973        final double x3 = x * x2;
    +974        if (x >= 0.0) {
    +975            return Math.sqrt(1.0 - x) * (0.24998925277680106 - 0.033759055260971525 * x + 0.01181900522894724 * x2 - 0.0029808606756510357 * x3);
     976        }
    -977    }
    -978
    -979
    -980    /**
    -981     * Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this
    -982     * range from 0.75f (inclusive) to 1.0f (exclusive), and continuing past that to 0.0f (inclusive) to 0.25f
    -983     * (inclusive).
    -984     * <br>
    -985     * This method is extremely similar to the non-turn approximation, but it never returns a negative result.
    -986     * @param x a float from -1.0f to 1.0f (both inclusive), usually the output of sin_() or cos_()
    -987     * @return one of the values that would produce {@code n} if it were passed to {@link #sin_(float)}
    -988     */
    -989    public static float asin_(final float x)
    -990    {
    -991        final float x2 = x * x;
    -992        final float x3 = x * x2;
    -993        if (x >= 0f) {
    -994            return 0.25f - (float) Math.sqrt(1f - x) *
    -995                    (0.24998925277680106f - 0.033759055260971525f * x + 0.01181900522894724f * x2 - 0.0029808606756510357f * x3);
    -996        }
    -997        else {
    -998            return 0.75f + (float) Math.sqrt(1f + x) *
    -999                    (0.24998925277680106f + 0.033759055260971525f * x + 0.01181900522894724f * x2 + 0.0029808606756510357f * x3);
    -1000        }
    -1001    }
    -1002    /**
    -1003     * Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this
    -1004     * range from 0.0f (inclusive) to 0.5f (inclusive).
    -1005     * <br>
    -1006     * This method is extremely similar to the non-turn approximation.
    -1007     * @param x a float from -1.0f to 1.0f (both inclusive), usually the output of sin_() or cos_()
    -1008     * @return one of the values that would produce {@code n} if it were passed to {@link #cos_(float)}
    -1009     */
    -1010    public static float acos_(final float x)
    -1011    {
    -1012        final float x2 = x * x;
    -1013        final float x3 = x * x2;
    -1014        if (x >= 0f) {
    -1015            return (float) Math.sqrt(1f - x) * (0.24998925277680106f - 0.033759055260971525f * x + 0.01181900522894724f * x2 - 0.0029808606756510357f * x3);
    -1016        }
    -1017        else {
    -1018            return 0.5f - (float) Math.sqrt(1f + x) * (0.24998925277680106f + 0.033759055260971525f * x + 0.01181900522894724f * x2 + 0.0029808606756510357f * x3);
    +977        else {
    +978            return 0.5 - Math.sqrt(1.0 + x) * (0.24998925277680106 + 0.033759055260971525 * x + 0.01181900522894724 * x2 + 0.0029808606756510357 * x3);
    +979        }
    +980    }
    +981
    +982
    +983    /**
    +984     * Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this
    +985     * range from 0.75f (inclusive) to 1.0f (exclusive), and continuing past that to 0.0f (inclusive) to 0.25f
    +986     * (inclusive).
    +987     * <br>
    +988     * This method is extremely similar to the non-turn approximation, but it never returns a negative result.
    +989     * @param x a float from -1.0f to 1.0f (both inclusive), usually the output of sin_() or cos_()
    +990     * @return one of the values that would produce {@code n} if it were passed to {@link #sin_(float)}
    +991     */
    +992    public static float asin_(final float x)
    +993    {
    +994        final float x2 = x * x;
    +995        final float x3 = x * x2;
    +996        if (x >= 0f) {
    +997            return 0.25f - (float) Math.sqrt(1f - x) *
    +998                    (0.24998925277680106f - 0.033759055260971525f * x + 0.01181900522894724f * x2 - 0.0029808606756510357f * x3);
    +999        }
    +1000        else {
    +1001            return 0.75f + (float) Math.sqrt(1f + x) *
    +1002                    (0.24998925277680106f + 0.033759055260971525f * x + 0.01181900522894724f * x2 + 0.0029808606756510357f * x3);
    +1003        }
    +1004    }
    +1005    /**
    +1006     * Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this
    +1007     * range from 0.0f (inclusive) to 0.5f (inclusive).
    +1008     * <br>
    +1009     * This method is extremely similar to the non-turn approximation.
    +1010     * @param x a float from -1.0f to 1.0f (both inclusive), usually the output of sin_() or cos_()
    +1011     * @return one of the values that would produce {@code n} if it were passed to {@link #cos_(float)}
    +1012     */
    +1013    public static float acos_(final float x)
    +1014    {
    +1015        final float x2 = x * x;
    +1016        final float x3 = x * x2;
    +1017        if (x >= 0f) {
    +1018            return (float) Math.sqrt(1f - x) * (0.24998925277680106f - 0.033759055260971525f * x + 0.01181900522894724f * x2 - 0.0029808606756510357f * x3);
     1019        }
    -1020    }
    -1021
    -1022    /**
    -1023     * Linearly interpolates between fromValue to toValue on progress position.
    -1024     * @param fromValue starting float value; can be any finite float
    -1025     * @param toValue ending float value; can be any finite float
    -1026     * @param progress how far the interpolation should go, between 0 (equal to fromValue) and 1 (equal to toValue)
    -1027     */
    -1028    public static float lerp (final float fromValue, final float toValue, final float progress) {
    -1029        return fromValue + (toValue - fromValue) * progress;
    -1030    }
    -1031    /**
    -1032     * Linearly normalizes value from a range. Range must not be empty. This is the inverse of
    -1033     * {@link #lerp(float, float, float)}.
    -1034     * @param rangeStart Range start normalized to 0
    -1035     * @param rangeEnd Range end normalized to 1
    -1036     * @param value Value to normalize
    -1037     * @return Normalized value. Values outside the range are not clamped to 0 and 1 */
    -1038    public static float norm (float rangeStart, float rangeEnd, float value) {
    -1039        return (value - rangeStart) / (rangeEnd - rangeStart);
    -1040    }
    -1041
    -1042    /**
    -1043     * Returns the largest integer less than or equal to the specified float. This method will only properly floor
    -1044     * floats from {@code -16384} to {@code Float.MAX_VALUE - 16384}.
    -1045     * @param value the float to find the floor of
    -1046     * @return the int floor of {@code value}, that is, the largest int that is less than or equal to {@code value}
    -1047     */
    -1048    public static int floor (float value) {
    -1049        return (int)(value + 16384.0) - 16384;
    -1050    }
    -1051
    -1052    /**
    -1053     * A generalization on bias and gain functions that can represent both; this version is branch-less.
    -1054     * This is based on <a href="https://arxiv.org/abs/2010.09714">this micro-paper</a> by Jon Barron, which
    -1055     * generalizes the earlier bias and gain rational functions by Schlick. The second and final page of the
    -1056     * paper has useful graphs of what the s (shape) and t (turning point) parameters do; shape should be 0
    -1057     * or greater, while turning must be between 0 and 1, inclusive. This effectively combines two different
    -1058     * curving functions so they continue into each other when x equals turning. The shape parameter will
    -1059     * cause this to imitate "smoothstep-like" splines when greater than 1 (where the values ease into their
    -1060     * starting and ending levels), or to be the inverse when less than 1 (where values start like square
    -1061     * root does, taking off very quickly, but also end like square does, landing abruptly at the ending
    -1062     * level). You should only give x values between 0 and 1, inclusive.
    -1063     * @param x progress through the spline, from 0 to 1, inclusive
    -1064     * @param shape must be greater than or equal to 0; values greater than 1 are "normal interpolations"
    -1065     * @param turning a value between 0.0 and 1.0, inclusive, where the shape changes
    -1066     * @return a float between 0 and 1, inclusive
    -1067     */
    -1068    public static float barronSpline(final float x, final float shape, final float turning) {
    -1069        final float d = turning - x;
    -1070        final int f = BitConversion.floatToRawIntBits(d) >> 31, n = f | 1;
    -1071        return ((turning * n - f) * (x + f)) / (Float.MIN_NORMAL - f + (x + shape * d) * n) - f;
    -1072    }
    -1073
    -1074}
    +1020        else {
    +1021            return 0.5f - (float) Math.sqrt(1f + x) * (0.24998925277680106f + 0.033759055260971525f * x + 0.01181900522894724f * x2 + 0.0029808606756510357f * x3);
    +1022        }
    +1023    }
    +1024
    +1025    /**
    +1026     * Linearly interpolates between fromValue to toValue on progress position.
    +1027     * @param fromValue starting float value; can be any finite float
    +1028     * @param toValue ending float value; can be any finite float
    +1029     * @param progress how far the interpolation should go, between 0 (equal to fromValue) and 1 (equal to toValue)
    +1030     */
    +1031    public static float lerp (final float fromValue, final float toValue, final float progress) {
    +1032        return fromValue + (toValue - fromValue) * progress;
    +1033    }
    +1034    /**
    +1035     * Linearly normalizes value from a range. Range must not be empty. This is the inverse of
    +1036     * {@link #lerp(float, float, float)}.
    +1037     * @param rangeStart Range start normalized to 0
    +1038     * @param rangeEnd Range end normalized to 1
    +1039     * @param value Value to normalize
    +1040     * @return Normalized value. Values outside the range are not clamped to 0 and 1 */
    +1041    public static float norm (float rangeStart, float rangeEnd, float value) {
    +1042        return (value - rangeStart) / (rangeEnd - rangeStart);
    +1043    }
    +1044
    +1045    /**
    +1046     * Returns the largest integer less than or equal to the specified float. This method will only properly floor
    +1047     * floats from {@code -16384} to {@code Float.MAX_VALUE - 16384}.
    +1048     * @param value the float to find the floor of
    +1049     * @return the int floor of {@code value}, that is, the largest int that is less than or equal to {@code value}
    +1050     */
    +1051    public static int floor (float value) {
    +1052        return (int)(value + 16384.0) - 16384;
    +1053    }
    +1054
    +1055    /**
    +1056     * A generalization on bias and gain functions that can represent both; this version is branch-less.
    +1057     * This is based on <a href="https://arxiv.org/abs/2010.09714">this micro-paper</a> by Jon Barron, which
    +1058     * generalizes the earlier bias and gain rational functions by Schlick. The second and final page of the
    +1059     * paper has useful graphs of what the s (shape) and t (turning point) parameters do; shape should be 0
    +1060     * or greater, while turning must be between 0 and 1, inclusive. This effectively combines two different
    +1061     * curving functions so they continue into each other when x equals turning. The shape parameter will
    +1062     * cause this to imitate "smoothstep-like" splines when greater than 1 (where the values ease into their
    +1063     * starting and ending levels), or to be the inverse when less than 1 (where values start like square
    +1064     * root does, taking off very quickly, but also end like square does, landing abruptly at the ending
    +1065     * level). You should only give x values between 0 and 1, inclusive.
    +1066     * @param x progress through the spline, from 0 to 1, inclusive
    +1067     * @param shape must be greater than or equal to 0; values greater than 1 are "normal interpolations"
    +1068     * @param turning a value between 0.0 and 1.0, inclusive, where the shape changes
    +1069     * @return a float between 0 and 1, inclusive
    +1070     */
    +1071    public static float barronSpline(final float x, final float shape, final float turning) {
    +1072        final float d = turning - x;
    +1073        final int f = BitConversion.floatToRawIntBits(d) >> 31, n = f | 1;
    +1074        return ((turning * n - f) * (x + f)) / (Float.MIN_NORMAL - f + (x + shape * d) * n) - f;
    +1075    }
    +1076
    +1077}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html
    index ca450f44..396d575f 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/ColorTools.html
    @@ -16,1397 +16,1398 @@
     003import com.github.tommyettinger.colorful.pure.FloatColors;
     004import com.github.tommyettinger.colorful.pure.MathTools;
     005import com.github.tommyettinger.digital.BitConversion;
    -006import com.github.tommyettinger.random.EnhancedRandom;
    -007
    -008import java.util.Random;
    -009
    -010/**
    -011 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the CIE L*A*B* color space.
    -012 * This is the old standard (and for some things, gold standard) of color spaces, introduced in 1976 and never fully
    -013 * superseded by a newer color space. A reason there are still newer color spaces being introduced is in part that
    -014 * existing color spaces, such as CIELAB, don't have sufficient performance for a given task, and this is an especially
    -015 * fair criticism of CIELAB -- it's slow. But, if you calculate new colors infrequently and do the heaviest conversions
    -016 * in a shader, this might not be noticeably different from Oklab or IPT_HQ. This package emphasizes quality over speed,
    -017 * so some calculations that are approximated in Oklab and IPT_HQ are performed rigorously here.
    -018 * <br>
    -019 * The CIE L*A*B* color space has 3 channels, L, A, and B, each gamma-corrected (which is why an asterisk is added).
    -020 * L is lightness, A is a chroma axis that is (roughly) cyan-vs.-red, and B is a chroma axis that is (roughly)
    -021 * blue-vs.-yellow. This is the same in concept as Oklab, but Oklab is skewed somewhat so high B there is more orange
    -022 * than yellow; it's somewhat hard to accurately produce yellow in Oklab. This also has an alpha channel in each color,
    -023 * which acts like it does in every other color space package here (multiplicative alpha, higher is more opaque).
    -024 */
    -025public class ColorTools {
    -026    /**
    -027     * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A
    -028     * (a chromatic component ranging from cyan to red), B (a chromatic component ranging from blue to yellow), and
    -029     * alpha (or opacity). L should be between 0 and 1, inclusive, with 0 used for very dark colors (almost only black),
    -030     * and 1 used for very light colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when
    -031     * both are about 0.5. There's some aesthetic value in changing just one chroma value. When A is high and B is low,
    -032     * the color is more purple/magenta, when both are low it is more bluish, when B is high and A is low, the color
    -033     * tends to be greenish, and when both are high it tends to be orange. When A and B are both near 0.5f, the color is
    -034     * closer to gray. Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha.
    -035     *
    -036     * @param l     0f to 1f, lightness or L component of CIELAB, with 0.5f meaning "no change" and 1f brightening
    -037     * @param a     0f to 1f, A component of CIELAB, with 1f more orange, red, or magenta
    -038     * @param b     0f to 1f, B component of CIELAB, with 1f more green, yellow, or red
    -039     * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
    -040     * @return a float encoding a color with the given properties
    -041     */
    -042    public static float cielab(float l, float a, float b, float alpha) {
    -043        return BitConversion.intBitsToFloat(((int) (alpha * 255.999f) << 24 & 0xFE000000) | ((int) (b * 255.999f) << 16 & 0xFF0000)
    -044                | ((int) (a * 255.999f) << 8 & 0xFF00) | ((int) (l * 255.999f) & 0xFF));
    -045    }
    -046    /**
    -047     * Gets a packed float representation of a color given as 4 float components, L, A, B, and alpha, with each
    -048     * component clamped to the 0f to 1f range before being entered into the packed float color. This is only different
    -049     * from {@link #cielab(float, float, float, float)} in that it clamps each component. It still permits out-of-gamut
    -050     * colors to be stored, but as long as the rendering code (such as a shader or ColorfulBatch) does its own
    -051     * validation or correction of colors, then having out-of-gamut colors shouldn't be a problem.
    -052     *
    -053     * @see #cielab(float, float, float, float) This uses the same definitions for L, A, B, and alpha as cielab().
    -054     * @param l     0f to 1f, lightness or L component of CIELAB, with 0.5f meaning "no change" and 1f brightening
    -055     * @param a     0f to 1f, A component of CIELAB, with 1f more orange, red, or magenta
    -056     * @param b     0f to 1f, B component of CIELAB, with 1f more green, yellow, or red
    -057     * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
    -058     * @return a float encoding a color with the given properties
    -059     */
    -060    public static float clamp(float l, float a, float b, float alpha) {
    -061        return BitConversion.intBitsToFloat((Math.min(Math.max((int) (alpha * 127.999f), 0), 127) << 25)
    -062                | (Math.min(Math.max((int) (b * 255.999f), 0), 255) << 16)
    -063                | (Math.min(Math.max((int) (a * 255.999f), 0), 255) << 8)
    -064                | (Math.min(Math.max((int) (l * 255.999f), 0), 255))
    -065        );
    -066    }
    -067
    +006import com.github.tommyettinger.digital.TrigTools;
    +007import com.github.tommyettinger.random.EnhancedRandom;
    +008
    +009import java.util.Random;
    +010
    +011/**
    +012 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the CIE L*A*B* color space.
    +013 * This is the old standard (and for some things, gold standard) of color spaces, introduced in 1976 and never fully
    +014 * superseded by a newer color space. A reason there are still newer color spaces being introduced is in part that
    +015 * existing color spaces, such as CIELAB, don't have sufficient performance for a given task, and this is an especially
    +016 * fair criticism of CIELAB -- it's slow. But, if you calculate new colors infrequently and do the heaviest conversions
    +017 * in a shader, this might not be noticeably different from Oklab or IPT_HQ. This package emphasizes quality over speed,
    +018 * so some calculations that are approximated in Oklab and IPT_HQ are performed rigorously here.
    +019 * <br>
    +020 * The CIE L*A*B* color space has 3 channels, L, A, and B, each gamma-corrected (which is why an asterisk is added).
    +021 * L is lightness, A is a chroma axis that is (roughly) cyan-vs.-red, and B is a chroma axis that is (roughly)
    +022 * blue-vs.-yellow. This is the same in concept as Oklab, but Oklab is skewed somewhat so high B there is more orange
    +023 * than yellow; it's somewhat hard to accurately produce yellow in Oklab. This also has an alpha channel in each color,
    +024 * which acts like it does in every other color space package here (multiplicative alpha, higher is more opaque).
    +025 */
    +026public class ColorTools {
    +027    /**
    +028     * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A
    +029     * (a chromatic component ranging from cyan to red), B (a chromatic component ranging from blue to yellow), and
    +030     * alpha (or opacity). L should be between 0 and 1, inclusive, with 0 used for very dark colors (almost only black),
    +031     * and 1 used for very light colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when
    +032     * both are about 0.5. There's some aesthetic value in changing just one chroma value. When A is high and B is low,
    +033     * the color is more purple/magenta, when both are low it is more bluish, when B is high and A is low, the color
    +034     * tends to be greenish, and when both are high it tends to be orange. When A and B are both near 0.5f, the color is
    +035     * closer to gray. Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha.
    +036     *
    +037     * @param l     0f to 1f, lightness or L component of CIELAB, with 0.5f meaning "no change" and 1f brightening
    +038     * @param a     0f to 1f, A component of CIELAB, with 1f more orange, red, or magenta
    +039     * @param b     0f to 1f, B component of CIELAB, with 1f more green, yellow, or red
    +040     * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
    +041     * @return a float encoding a color with the given properties
    +042     */
    +043    public static float cielab(float l, float a, float b, float alpha) {
    +044        return BitConversion.intBitsToFloat(((int) (alpha * 255.999f) << 24 & 0xFE000000) | ((int) (b * 255.999f) << 16 & 0xFF0000)
    +045                | ((int) (a * 255.999f) << 8 & 0xFF00) | ((int) (l * 255.999f) & 0xFF));
    +046    }
    +047    /**
    +048     * Gets a packed float representation of a color given as 4 float components, L, A, B, and alpha, with each
    +049     * component clamped to the 0f to 1f range before being entered into the packed float color. This is only different
    +050     * from {@link #cielab(float, float, float, float)} in that it clamps each component. It still permits out-of-gamut
    +051     * colors to be stored, but as long as the rendering code (such as a shader or ColorfulBatch) does its own
    +052     * validation or correction of colors, then having out-of-gamut colors shouldn't be a problem.
    +053     *
    +054     * @see #cielab(float, float, float, float) This uses the same definitions for L, A, B, and alpha as cielab().
    +055     * @param l     0f to 1f, lightness or L component of CIELAB, with 0.5f meaning "no change" and 1f brightening
    +056     * @param a     0f to 1f, A component of CIELAB, with 1f more orange, red, or magenta
    +057     * @param b     0f to 1f, B component of CIELAB, with 1f more green, yellow, or red
    +058     * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
    +059     * @return a float encoding a color with the given properties
    +060     */
    +061    public static float clamp(float l, float a, float b, float alpha) {
    +062        return BitConversion.intBitsToFloat((Math.min(Math.max((int) (alpha * 127.999f), 0), 127) << 25)
    +063                | (Math.min(Math.max((int) (b * 255.999f), 0), 255) << 16)
    +064                | (Math.min(Math.max((int) (a * 255.999f), 0), 255) << 8)
    +065                | (Math.min(Math.max((int) (l * 255.999f), 0), 255))
    +066        );
    +067    }
     068
    -069    /**
    -070     * An approximation of the cube-root function for float inputs and outputs.
    -071     * This can be about twice as fast as {@link Math#cbrt(double)}. This
    -072     * version does not tolerate negative inputs, because in the narrow use
    -073     * case it has in this class, it never is given negative inputs.
    -074     * <br>
    -075     * Has very low relative error (less than 1E-9) when inputs are uniformly
    -076     * distributed between 0 and 512, and absolute mean error of less than
    -077     * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one
    -078     * presented in Hacker's Delight and also used in early 3D graphics (see
    -079     * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but
    -080     * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code
    -081     * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk"
    -082     * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 .
    -083     * It's worth noting that while hardware instructions for finding the
    -084     * square root of a float have gotten extremely fast, the same is not
    -085     * true for the cube root (which has to allow negative inputs), so while
    -086     * the bit-twiddling inverse square root is no longer a beneficial
    -087     * optimization on current hardware, this does seem to help.
    -088     * <br>
    -089     * This is used when converting from RGB to CIELAB, as an intermediate step.
    -090     * @param x any non-negative finite float to find the cube root of
    -091     * @return the cube root of x, approximated
    -092     */
    -093    private static float cbrtPositive(float x) {
    -094        int ix = BitConversion.floatToRawIntBits(x);
    -095        final float x0 = x;
    -096        ix = (ix>>>2) + (ix>>>4);
    -097        ix += (ix>>>4);
    -098        ix += (ix>>>8) + 0x2A5137A0;
    -099        x  = BitConversion.intBitsToFloat(ix);
    -100        x  = 0.33333334f*(2f * x + x0/(x*x));
    +069
    +070    /**
    +071     * An approximation of the cube-root function for float inputs and outputs.
    +072     * This can be about twice as fast as {@link Math#cbrt(double)}. This
    +073     * version does not tolerate negative inputs, because in the narrow use
    +074     * case it has in this class, it never is given negative inputs.
    +075     * <br>
    +076     * Has very low relative error (less than 1E-9) when inputs are uniformly
    +077     * distributed between 0 and 512, and absolute mean error of less than
    +078     * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one
    +079     * presented in Hacker's Delight and also used in early 3D graphics (see
    +080     * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but
    +081     * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code
    +082     * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk"
    +083     * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 .
    +084     * It's worth noting that while hardware instructions for finding the
    +085     * square root of a float have gotten extremely fast, the same is not
    +086     * true for the cube root (which has to allow negative inputs), so while
    +087     * the bit-twiddling inverse square root is no longer a beneficial
    +088     * optimization on current hardware, this does seem to help.
    +089     * <br>
    +090     * This is used when converting from RGB to CIELAB, as an intermediate step.
    +091     * @param x any non-negative finite float to find the cube root of
    +092     * @return the cube root of x, approximated
    +093     */
    +094    private static float cbrtPositive(float x) {
    +095        int ix = BitConversion.floatToRawIntBits(x);
    +096        final float x0 = x;
    +097        ix = (ix>>>2) + (ix>>>4);
    +098        ix += (ix>>>4);
    +099        ix += (ix>>>8) + 0x2A5137A0;
    +100        x  = BitConversion.intBitsToFloat(ix);
     101        x  = 0.33333334f*(2f * x + x0/(x*x));
    -102        return x;
    -103    }
    -104
    -105    /**
    -106     * Used when given non-linear sRGB inputs to make them linear, using an exact gamma of 2.4 and accounting for the
    -107     * darkest colors with a different formula.
    -108     * @param component any non-linear channel of a color, to be made linear
    -109     * @return a linear version of component
    -110     */
    -111    private static float forwardGamma(final float component) {
    -112        return component < 0.04045f ? component * (1f/12.92f) : (float)Math.pow((component + 0.055f) * (1f/1.055f), 2.4f);
    -113    }
    -114
    -115    /**
    -116     * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using an exact gamma of 2.4
    -117     * and accounting for the darkest colors with a different formula.
    -118     * @param component a linear channel of a color, to be made non-linear
    -119     * @return a non-linear version of component
    -120     */
    -121    private static float reverseGamma(final float component) {
    -122        return component < 0.0031308f ? component * 12.92f : (float)Math.pow(component, 1f/2.4f) * 1.055f - 0.055f;
    -123    }
    -124
    -125    private static float forwardXYZ(final float t) {
    -126        return (t < 0.00885645f) ? 7.787037f * t + 0.139731f : cbrtPositive(t);
    -127    }
    -128
    -129    private static float reverseXYZ(final float t) {
    -130        return (t < 0.20689655f) ? 0.1284185f * (t - 0.139731f) : t * t * t;
    -131    }
    -132
    -133    /**
    -134     * Converts a packed float color in the format produced by {@link #cielab(float, float, float, float)} to an RGBA8888 int.
    -135     * This format of int can be used with Pixmap and in some other places in libGDX.
    -136     * @param packed a packed float color, as produced by {@link #cielab(float, float, float, float)}
    -137     * @return an RGBA8888 int color
    -138     */
    -139    public static int toRGBA8888(final float packed)
    -140    {
    -141        final int decoded = BitConversion.floatToRawIntBits(packed);
    -142        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -143        final float A = ((decoded >>> 8 & 0xff) - 127.5f) * (0.2f / 127.5f);
    -144        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -145        final float x = reverseXYZ(L + A);
    -146        final float y = reverseXYZ(L);
    -147        final float z = reverseXYZ(L - B);
    -148        final int r = (int)(reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f)) * 255.999f);
    -149        final int g = (int)(reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f)) * 255.999f);
    -150        final int b = (int)(reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f)) * 255.999f);
    -151        return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
    -152    }
    -153
    -154    /**
    -155     * Converts a packed float color in the format produced by {@link #cielab(float, float, float, float)}
    -156     * to a packed float in ABGR8888 format.
    -157     * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    -158     * @param packed a packed float color, as produced by {@link #cielab(float, float, float, float)}
    -159     * @return a packed float color as ABGR8888
    -160     */
    -161    public static float toRGBA(final float packed)
    -162    {
    -163        final int decoded = BitConversion.floatToRawIntBits(packed);
    -164        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -165        final float A = ((decoded >>> 8 & 0xff) - 127.5f) * (0.2f / 127.5f);
    -166        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -167        final float x = reverseXYZ(L + A);
    -168        final float y = reverseXYZ(L);
    -169        final float z = reverseXYZ(L - B);
    -170        final int r = (int)(reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f)) * 255.999f);
    -171        final int g = (int)(reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f)) * 255.999f);
    -172        final int b = (int)(reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f)) * 255.999f);
    -173        return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
    -174    }
    -175
    -176    /**
    -177     * Takes a color encoded as an RGBA8888 int and converts to a packed float in the CIELAB format this uses.
    -178     * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
    -179     * @return a packed float as CIELAB, which this class can use
    -180     */
    -181    public static float fromRGBA8888(final int rgba) {
    -182        final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f);
    -183        final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    -184        final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    -185
    -186        final float x = forwardXYZ(0.4124564f * r  + 0.3575761f * g + 0.1804375f * b);
    -187        final float y = forwardXYZ(0.2126729f * r  + 0.7151522f * g + 0.0721750f * b);
    -188        final float z = forwardXYZ(0.0193339f * r  + 0.1191920f * g + 0.9503041f * b);
    -189
    -190        return BitConversion.intBitsToFloat(
    -191                          Math.min(Math.max((int)((1.16f*y - 0.16f) * 255.999f    ), 0), 255)
    -192                        | Math.min(Math.max((int)((x - y) * (127.999f * 5f) + 127.5f), 0), 255) << 8
    -193                        | Math.min(Math.max((int)((y - z) * (127.999f * 2f) + 127.5f), 0), 255) << 16
    -194                        | (rgba & 0xFE) << 24);
    -195    }
    -196
    -197    /**
    -198     * Takes a color encoded as an ABGR packed float and converts to a packed float in the CIELAB format this uses.
    -199     * @param packed a packed float in ABGR8888 format, with A in the MSB and R in the LSB
    -200     * @return a packed float as CIELAB, which this class can use
    -201     */
    -202    public static float fromRGBA(final float packed) {
    -203        final int abgr = BitConversion.floatToRawIntBits(packed);
    -204        final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f);
    -205        final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    -206        final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    -207
    -208        final float x = forwardXYZ(0.4124564f * r + 0.3575761f * g + 0.1804375f * b);
    -209        final float y = forwardXYZ(0.2126729f * r + 0.7151522f * g + 0.0721750f * b);
    -210        final float z = forwardXYZ(0.0193339f * r + 0.1191920f * g + 0.9503041f * b);
    -211
    -212        return BitConversion.intBitsToFloat(
    -213                          Math.min(Math.max((int)((1.16f*y - 0.16f) * 255.999f    ), 0), 255)
    -214                        | Math.min(Math.max((int)(((x - y)) * (127.999f * 5f) + 127.5f), 0), 255) << 8
    -215                        | Math.min(Math.max((int)(((y - z)) * (127.999f * 2f) + 127.5f), 0), 255) << 16
    -216                        | (abgr & 0xFE000000));
    -217    }
    -218
    -219    /**
    -220     * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the CIELAB format this uses.
    -221     * @param r red, from 0.0 to 1.0 (both inclusive)
    -222     * @param g green, from 0.0 to 1.0 (both inclusive)
    -223     * @param b blue, from 0.0 to 1.0 (both inclusive)
    -224     * @param a alpha, from 0.0 to 1.0 (both inclusive)
    -225     * @return a packed float as CIELAB, which this class can use
    -226     */
    -227    public static float fromRGBA(float r, float g, float b, final float a) {
    -228        r = forwardGamma(r);
    -229        g = forwardGamma(g);
    -230        b = forwardGamma(b);
    -231        final float x = forwardXYZ(0.4124564f * r + 0.3575761f * g + 0.1804375f * b);
    -232        final float y = forwardXYZ(0.2126729f * r + 0.7151522f * g + 0.0721750f * b);
    -233        final float z = forwardXYZ(0.0193339f * r + 0.1191920f * g + 0.9503041f * b);
    -234        return BitConversion.intBitsToFloat(
    -235                          Math.min(Math.max((int)((1.16f*y - 0.16f) * 255.999f    ), 0), 255)
    -236                        | Math.min(Math.max((int)(((x - y)) * (127.999f * 5f) + 127.5f), 0), 255) << 8
    -237                        | Math.min(Math.max((int)(((y - z)) * (127.999f * 2f) + 127.5f), 0), 255) << 16
    -238                        | ((int)(a * 255f) << 24 & 0xFE000000));
    -239    }
    -240
    -241        /**
    -242         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -243         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -244         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
    -245         */
    -246        public static int redInt(final float encoded)
    -247        {
    -248        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -249        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -250        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -251        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -252        final float x = reverseXYZ(L + A);
    -253        final float y = reverseXYZ(L);
    -254        final float z = reverseXYZ(L - B);
    -255        return (int)(reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f)) * 255.999f);
    -256        }
    -257
    -258        /**
    -259         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -260         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -261         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
    -262         */
    -263        public static int greenInt(final float encoded)
    -264        {
    -265        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -266        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -267        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -268        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -269        final float x = reverseXYZ(L + A);
    -270        final float y = reverseXYZ(L);
    -271        final float z = reverseXYZ(L - B);
    -272        return (int)(reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f)) * 255.999f);
    -273        }
    -274
    -275        /**
    -276         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -277         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -278         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
    -279         */
    -280        public static int blueInt(final float encoded)
    -281        {
    -282        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -283        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -284        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -285        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -286        final float x = reverseXYZ(L + A);
    -287        final float y = reverseXYZ(L);
    -288        final float z = reverseXYZ(L - B);
    -289        return (int)(reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f)) * 255.999f);
    -290        }
    -291
    -292        /**
    -293         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
    -294         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    -295         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -296         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
    -297         */
    -298        public static int alphaInt(final float encoded)
    -299        {
    -300                return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
    -301        }
    -302    /**
    -303     * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -304     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -305     * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
    -306     */
    -307    public static float red(final float encoded)
    -308    {
    -309        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -310        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -311        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -312        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -313        final float x = reverseXYZ(L + A);
    -314        final float y = reverseXYZ(L);
    -315        final float z = reverseXYZ(L - B);
    -316        return reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -317    }
    -318
    -319    /**
    -320     * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -321     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -322     * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
    -323     */
    -324    public static float green(final float encoded)
    -325    {
    -326        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -327        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -328        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -329        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -330        final float x = reverseXYZ(L + A);
    -331        final float y = reverseXYZ(L);
    -332        final float z = reverseXYZ(L - B);
    -333        return reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -334    }
    -335
    -336    /**
    -337     * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -338     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -339     * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
    -340     */
    -341    public static float blue(final float encoded)
    -342    {
    -343        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -344        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -345        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -346        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -347        final float x = reverseXYZ(L + A);
    -348        final float y = reverseXYZ(L);
    -349        final float z = reverseXYZ(L - B);
    -350        return reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -351    }
    -352
    -353    /**
    -354     * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -355     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -356     * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
    -357     */
    -358    public static float alpha(final float encoded)
    -359    {
    -360        return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
    -361    }
    -362
    +102        x  = 0.33333334f*(2f * x + x0/(x*x));
    +103        return x;
    +104    }
    +105
    +106    /**
    +107     * Used when given non-linear sRGB inputs to make them linear, using an exact gamma of 2.4 and accounting for the
    +108     * darkest colors with a different formula.
    +109     * @param component any non-linear channel of a color, to be made linear
    +110     * @return a linear version of component
    +111     */
    +112    private static float forwardGamma(final float component) {
    +113        return component < 0.04045f ? component * (1f/12.92f) : (float)Math.pow((component + 0.055f) * (1f/1.055f), 2.4f);
    +114    }
    +115
    +116    /**
    +117     * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using an exact gamma of 2.4
    +118     * and accounting for the darkest colors with a different formula.
    +119     * @param component a linear channel of a color, to be made non-linear
    +120     * @return a non-linear version of component
    +121     */
    +122    private static float reverseGamma(final float component) {
    +123        return component < 0.0031308f ? component * 12.92f : (float)Math.pow(component, 1f/2.4f) * 1.055f - 0.055f;
    +124    }
    +125
    +126    private static float forwardXYZ(final float t) {
    +127        return (t < 0.00885645f) ? 7.787037f * t + 0.139731f : cbrtPositive(t);
    +128    }
    +129
    +130    private static float reverseXYZ(final float t) {
    +131        return (t < 0.20689655f) ? 0.1284185f * (t - 0.139731f) : t * t * t;
    +132    }
    +133
    +134    /**
    +135     * Converts a packed float color in the format produced by {@link #cielab(float, float, float, float)} to an RGBA8888 int.
    +136     * This format of int can be used with Pixmap and in some other places in libGDX.
    +137     * @param packed a packed float color, as produced by {@link #cielab(float, float, float, float)}
    +138     * @return an RGBA8888 int color
    +139     */
    +140    public static int toRGBA8888(final float packed)
    +141    {
    +142        final int decoded = BitConversion.floatToRawIntBits(packed);
    +143        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +144        final float A = ((decoded >>> 8 & 0xff) - 127.5f) * (0.2f / 127.5f);
    +145        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +146        final float x = reverseXYZ(L + A);
    +147        final float y = reverseXYZ(L);
    +148        final float z = reverseXYZ(L - B);
    +149        final int r = (int)(reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f)) * 255.999f);
    +150        final int g = (int)(reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f)) * 255.999f);
    +151        final int b = (int)(reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f)) * 255.999f);
    +152        return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
    +153    }
    +154
    +155    /**
    +156     * Converts a packed float color in the format produced by {@link #cielab(float, float, float, float)}
    +157     * to a packed float in ABGR8888 format.
    +158     * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    +159     * @param packed a packed float color, as produced by {@link #cielab(float, float, float, float)}
    +160     * @return a packed float color as ABGR8888
    +161     */
    +162    public static float toRGBA(final float packed)
    +163    {
    +164        final int decoded = BitConversion.floatToRawIntBits(packed);
    +165        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +166        final float A = ((decoded >>> 8 & 0xff) - 127.5f) * (0.2f / 127.5f);
    +167        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +168        final float x = reverseXYZ(L + A);
    +169        final float y = reverseXYZ(L);
    +170        final float z = reverseXYZ(L - B);
    +171        final int r = (int)(reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f)) * 255.999f);
    +172        final int g = (int)(reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f)) * 255.999f);
    +173        final int b = (int)(reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f)) * 255.999f);
    +174        return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
    +175    }
    +176
    +177    /**
    +178     * Takes a color encoded as an RGBA8888 int and converts to a packed float in the CIELAB format this uses.
    +179     * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
    +180     * @return a packed float as CIELAB, which this class can use
    +181     */
    +182    public static float fromRGBA8888(final int rgba) {
    +183        final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f);
    +184        final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    +185        final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    +186
    +187        final float x = forwardXYZ(0.4124564f * r  + 0.3575761f * g + 0.1804375f * b);
    +188        final float y = forwardXYZ(0.2126729f * r  + 0.7151522f * g + 0.0721750f * b);
    +189        final float z = forwardXYZ(0.0193339f * r  + 0.1191920f * g + 0.9503041f * b);
    +190
    +191        return BitConversion.intBitsToFloat(
    +192                          Math.min(Math.max((int)((1.16f*y - 0.16f) * 255.999f    ), 0), 255)
    +193                        | Math.min(Math.max((int)((x - y) * (127.999f * 5f) + 127.5f), 0), 255) << 8
    +194                        | Math.min(Math.max((int)((y - z) * (127.999f * 2f) + 127.5f), 0), 255) << 16
    +195                        | (rgba & 0xFE) << 24);
    +196    }
    +197
    +198    /**
    +199     * Takes a color encoded as an ABGR packed float and converts to a packed float in the CIELAB format this uses.
    +200     * @param packed a packed float in ABGR8888 format, with A in the MSB and R in the LSB
    +201     * @return a packed float as CIELAB, which this class can use
    +202     */
    +203    public static float fromRGBA(final float packed) {
    +204        final int abgr = BitConversion.floatToRawIntBits(packed);
    +205        final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f);
    +206        final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    +207        final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    +208
    +209        final float x = forwardXYZ(0.4124564f * r + 0.3575761f * g + 0.1804375f * b);
    +210        final float y = forwardXYZ(0.2126729f * r + 0.7151522f * g + 0.0721750f * b);
    +211        final float z = forwardXYZ(0.0193339f * r + 0.1191920f * g + 0.9503041f * b);
    +212
    +213        return BitConversion.intBitsToFloat(
    +214                          Math.min(Math.max((int)((1.16f*y - 0.16f) * 255.999f    ), 0), 255)
    +215                        | Math.min(Math.max((int)(((x - y)) * (127.999f * 5f) + 127.5f), 0), 255) << 8
    +216                        | Math.min(Math.max((int)(((y - z)) * (127.999f * 2f) + 127.5f), 0), 255) << 16
    +217                        | (abgr & 0xFE000000));
    +218    }
    +219
    +220    /**
    +221     * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the CIELAB format this uses.
    +222     * @param r red, from 0.0 to 1.0 (both inclusive)
    +223     * @param g green, from 0.0 to 1.0 (both inclusive)
    +224     * @param b blue, from 0.0 to 1.0 (both inclusive)
    +225     * @param a alpha, from 0.0 to 1.0 (both inclusive)
    +226     * @return a packed float as CIELAB, which this class can use
    +227     */
    +228    public static float fromRGBA(float r, float g, float b, final float a) {
    +229        r = forwardGamma(r);
    +230        g = forwardGamma(g);
    +231        b = forwardGamma(b);
    +232        final float x = forwardXYZ(0.4124564f * r + 0.3575761f * g + 0.1804375f * b);
    +233        final float y = forwardXYZ(0.2126729f * r + 0.7151522f * g + 0.0721750f * b);
    +234        final float z = forwardXYZ(0.0193339f * r + 0.1191920f * g + 0.9503041f * b);
    +235        return BitConversion.intBitsToFloat(
    +236                          Math.min(Math.max((int)((1.16f*y - 0.16f) * 255.999f    ), 0), 255)
    +237                        | Math.min(Math.max((int)(((x - y)) * (127.999f * 5f) + 127.5f), 0), 255) << 8
    +238                        | Math.min(Math.max((int)(((y - z)) * (127.999f * 2f) + 127.5f), 0), 255) << 16
    +239                        | ((int)(a * 255f) << 24 & 0xFE000000));
    +240    }
    +241
    +242        /**
    +243         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +244         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +245         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
    +246         */
    +247        public static int redInt(final float encoded)
    +248        {
    +249        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +250        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +251        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +252        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +253        final float x = reverseXYZ(L + A);
    +254        final float y = reverseXYZ(L);
    +255        final float z = reverseXYZ(L - B);
    +256        return (int)(reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f)) * 255.999f);
    +257        }
    +258
    +259        /**
    +260         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +261         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +262         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
    +263         */
    +264        public static int greenInt(final float encoded)
    +265        {
    +266        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +267        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +268        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +269        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +270        final float x = reverseXYZ(L + A);
    +271        final float y = reverseXYZ(L);
    +272        final float z = reverseXYZ(L - B);
    +273        return (int)(reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f)) * 255.999f);
    +274        }
    +275
    +276        /**
    +277         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +278         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +279         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
    +280         */
    +281        public static int blueInt(final float encoded)
    +282        {
    +283        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +284        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +285        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +286        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +287        final float x = reverseXYZ(L + A);
    +288        final float y = reverseXYZ(L);
    +289        final float z = reverseXYZ(L - B);
    +290        return (int)(reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f)) * 255.999f);
    +291        }
    +292
    +293        /**
    +294         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
    +295         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    +296         * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +297         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
    +298         */
    +299        public static int alphaInt(final float encoded)
    +300        {
    +301                return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
    +302        }
    +303    /**
    +304     * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +305     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +306     * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
    +307     */
    +308    public static float red(final float encoded)
    +309    {
    +310        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +311        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +312        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +313        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +314        final float x = reverseXYZ(L + A);
    +315        final float y = reverseXYZ(L);
    +316        final float z = reverseXYZ(L - B);
    +317        return reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +318    }
    +319
    +320    /**
    +321     * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +322     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +323     * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
    +324     */
    +325    public static float green(final float encoded)
    +326    {
    +327        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +328        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +329        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +330        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +331        final float x = reverseXYZ(L + A);
    +332        final float y = reverseXYZ(L);
    +333        final float z = reverseXYZ(L - B);
    +334        return reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +335    }
    +336
    +337    /**
    +338     * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +339     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +340     * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
    +341     */
    +342    public static float blue(final float encoded)
    +343    {
    +344        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +345        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +346        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +347        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +348        final float x = reverseXYZ(L + A);
    +349        final float y = reverseXYZ(L);
    +350        final float z = reverseXYZ(L - B);
    +351        return reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +352    }
    +353
    +354    /**
    +355     * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +356     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +357     * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
    +358     */
    +359    public static float alpha(final float encoded)
    +360    {
    +361        return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
    +362    }
     363
    -364    /**
    -365     * Gets the "chroma" or "colorfulness" of a given CIELAB color. Chroma is similar to saturation in that grayscale
    -366     * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is
    -367     * that colors that are perceptually more-colorful have higher chroma than colors that are perceptually
    -368     * less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That
    -369     * is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color
    -370     * isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that
    -371     * is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to
    -372     * 0 chroma, and the most colorful value (a shade of purple) should have 1.26365817 chroma.
    -373     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -374     * @return a float between 0.0f and 1.26365817 that represents how colorful the given value is
    -375     */
    -376    public static float chroma(final float encoded) {
    -377        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -378        final float a = ((decoded >>> 7 & 0x1FE) - 255) / 255f;
    -379        final float b = ((decoded >>> 15 & 0x1FE) - 255) / 255f;
    -380        return (float) Math.sqrt(a * a + b * b);
    -381    }
    -382    /**
    -383     * Given a hue and lightness, this gets the (very approximate) maximum chroma possible for that hue-lightness
    -384     * combination, using CIELAB's versions of lightness and hue (not HSL). This is useful to know the bounds of
    -385     * {@link #chroma(float)}. This should be no greater than 1.26365817f . Note that this version of chromaLimit() is
    -386     * much slower than Oklab's version, because this has to go to much greater lengths to become accurate.
    -387     * @param hue the hue, typically between 0.0f and 1.0f, to look up
    -388     * @param lightness the lightness, clamped between 0.0f and 1.0f, to look up
    -389     * @return the maximum possible chroma for the given hue and lightness, between 0.0f and 1.26365817f
    -390     */
    -391    public static float chromaLimit(final float hue, final float lightness) {
    -392        final float h = hue - MathTools.floor(hue);
    -393        final float L = (1f/1.16f)*(lightness + 0.16f);
    -394        final float A = MathTools.cos_(h) * (1.26365817f);
    -395        final float B = MathTools.sin_(h) * (1.26365817f);
    -396        final float y = reverseXYZ(L);
    -397        float A2 = A, B2 = B;
    -398        for (int attempt = 127; attempt >= 0; attempt--) {
    -399            final float x = reverseXYZ(L + A2);
    -400            final float z = reverseXYZ(L - B2);
    -401            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    -402            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    -403            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    -404            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -405                break;
    -406            final float progress = attempt * 0x1p-7f;
    -407            A2 = (A * progress);
    -408            B2 = (B * progress);
    -409        }
    -410        return (float) Math.sqrt(A2 * A2 + B2 * B2);
    -411    }
    -412    /**
    -413     * Gets the color with the same L as the CIELAB color stored in the given packed float, but the furthest A
    -414     * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    -415     * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    -416     * @param packed a packed float color in CIELAB format; does not need to be in-gamut
    -417     * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    -418     * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
    -419     */
    -420    public static float maximizeSaturation(final float packed) {
    -421        final int decoded = BitConversion.floatToRawIntBits(packed);
    -422        final float lightness = (decoded & 255) / 255f;
    -423        final float h = MathTools.atan2_(((decoded >>> 16 & 0xff) - 127.5f), ((decoded >>> 8 & 0xff) - 127.5f));
    -424        final float L = (1f/1.16f)*(lightness + 0.16f);
    -425        final float A = MathTools.cos_(h) * 1.26365817f * 0.2f;
    -426        final float B = MathTools.sin_(h) * 1.26365817f * 0.5f;
    -427        final float y = reverseXYZ(L);
    -428        float A2 = A, B2 = B;
    -429        for (int attempt = 127; attempt >= 0; attempt--) {
    -430            final float x = reverseXYZ(L + A2);
    -431            final float z = reverseXYZ(L - B2);
    -432            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    -433            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    -434            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    -435            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -436                break;
    -437            final float progress = attempt * 0x1p-7f;
    -438            A2 = (A * progress);
    -439            B2 = (B * progress);
    -440        }
    -441        return cielab(lightness, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    -442    }
    -443    /**
    -444     * Gets the color with the same L as the CIELAB color stored in the given packed float, but the furthest A
    -445     * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    -446     * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    -447     * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    -448     * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    -449     * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    -450     * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
    -451     * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    -452     * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation
    -453     * for out-of-gamut colors.
    -454     */
    -455    public static float maximizeSaturation(float L, float A, float B, float alpha) {
    -456        L = Math.min(Math.max(L, 0f), 1f);
    -457        A = Math.min(Math.max(A, 0f), 1f);
    -458        B = Math.min(Math.max(B, 0f), 1f);
    -459        alpha = Math.min(Math.max(alpha, 0f), 1f);
    -460        final float h = MathTools.atan2_(B - 0.5f, A - 0.5f);
    -461        final float L0 = (1f/1.16f)*(L + 0.16f);
    -462        final float A0 = MathTools.cos_(h) * 1.26365817f;
    -463        final float B0 = MathTools.sin_(h) * 1.26365817f;
    -464        final float y = reverseXYZ(L0);
    -465        float A2 = A0, B2 = B0;
    -466        for (int attempt = 127; attempt >= 0; attempt--) {
    -467            final float x = reverseXYZ(L0 + A2);
    -468            final float z = reverseXYZ(L0 - B2);
    -469            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    -470            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    -471            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    -472            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -473                break;
    -474            final float progress = attempt * 0x1p-7f;
    -475            A2 = (A0 * progress);
    -476            B2 = (B0 * progress);
    -477        }
    -478        return cielab(L, A2, B2, alpha);
    -479    }
    -480
    -481    /**
    -482     * Gets the hue of the given CIELAB float color, but as CIELAB understands hue rather than how HSL does.
    -483     * This is different from {@link #hue(float)}, which uses HSL. This gives a float between 0 (inclusive)
    -484     * and 1 (exclusive).
    -485     *
    -486     * @param packed a packed CIELAB float color
    -487     * @return a float between 0 (inclusive) and 1 (exclusive) that represents hue in the CIELAB color space
    -488     */
    -489    public static float cielabHue(final float packed) {
    -490        final int decoded = BitConversion.floatToRawIntBits(packed);
    -491        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -492        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -493        return MathTools.atan2_(B, A);
    -494    }
    -495
    -496    /**
    -497     * Gets the saturation of the given CIELAB float color, but as CIELAB understands saturation rather than how HSL
    -498     * does. Saturation here is a fraction of the chroma limit (see {@link #chromaLimit(float, float)}) for a given hue
    -499     * and lightness, and is between 0 and 1. This gives a float between 0 (inclusive) and 1 (inclusive).
    -500     *
    -501     * @param packed a packed CIELAB float color
    -502     * @return a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the CIELAB color space
    -503     */
    -504    public static float cielabSaturation(final float packed) {
    -505        final int decoded = BitConversion.floatToRawIntBits(packed);
    -506        final float L = (1f/1.16f)*(((decoded & 0xff) / 255f) + 0.16f);
    -507        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -508        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -509        final float h = MathTools.atan2_(B, A);
    -510        final float L0 = (1f/1.16f)*(L + 0.16f);
    -511        final float A0 = MathTools.cos_(h) * 1.26365817f;
    -512        final float B0 = MathTools.sin_(h) * 1.26365817f;
    -513        final float y = reverseXYZ(L0);
    -514        float A2 = A0, B2 = B0;
    -515        for (int attempt = 127; attempt >= 0; attempt--) {
    -516            final float x = reverseXYZ(L + A2);
    -517            final float z = reverseXYZ(L - B2);
    -518            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    -519            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    -520            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    -521            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -522                break;
    -523            final float progress = attempt * 0x1p-7f;
    -524            A2 = (A0 * progress);
    -525            B2 = (B0 * progress);
    -526        }
    -527        final float dist = (float) Math.sqrt(A2 * A2 + B2 * B2);
    -528        return (float) Math.sqrt(A * A + B * B) / dist;
    -529    }
    -530    /**
    -531     * Gets the lightness of the given CIELAB float color, but as CIELAB understands lightness rather than how HSL does.
    -532     * This is different from {@link #lightness(float)}, which uses HSL. This gives a float between 0 (inclusive)
    -533     * and 1 (inclusive).
    -534     * <br>
    -535     * This is the same as {@link #channelL(float)}.
    -536     *
    -537     * @param packed a packed CIELAB float color
    -538     * @return a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the CIELAB color space
    -539     */
    -540    public static float cielabLightness(final float packed){
    -541        return (BitConversion.floatToRawIntBits(packed) & 0xff) / 255f;
    -542    }
    -543
    -544    /**
    -545     * A different way to specify a CIELAB color, using hue, saturation, lightness, and alpha like a normal HSL(A) color
    -546     * but calculating them directly in the CIELAB color space. This is more efficient than
    -547     * {@link #floatGetHSL(float, float, float, float)}. You may prefer using
    -548     * {@link #cielabByHCL(float, float, float, float)}, which takes an absolute chroma as opposed to the saturation
    -549     * here (which is a fraction of the maximum chroma).
    -550     * <br>
    -551     * Note that this takes a different value for its {@code hue} that the method {@link #hue(float)} produces, just
    -552     * like its {@code saturation} and the method {@link #saturation(float)}, and {@code lightness} and the method
    -553     * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
    -554     * {@link #channelL(float)}, but the saturation here refers to what fraction the chroma should be of the maximum
    -555     * chroma for the given hue and lightness. You can use {@link #cielabHue(float)}, {@link #cielabSaturation(float)},
    -556     * and {@link #cielabLightness(float)} to get the hue, saturation, and lightness values from an existing color that
    -557     * this will understand ({@link #alpha(float)} too). This method is likely to be significantly slower than
    -558     * {@link #cielabByHCL(float, float, float, float)} because this needs to calculate the gamut.
    -559     * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    -560     * @param saturation will be clamped between 0 and 1
    -561     * @param lightness will be clamped between 0 and 1
    -562     * @param alpha will be clamped between 0 and 1
    -563     * @return a packed CIELAB float color that tries to match the requested hue, saturation, and lightness
    -564     */
    -565    public static float cielabByHSL(float hue, float saturation, float lightness, float alpha) {
    -566        lightness = Math.min(Math.max(lightness, 0f), 1f);
    -567        saturation = Math.min(Math.max(saturation, 0f), 1f);
    -568        hue -= MathTools.floor(hue);
    -569        alpha = Math.min(Math.max(alpha, 0f), 1f);
    -570        final float L = (1f/1.16f)*(lightness + 0.16f);
    -571        final float L0 = (1f/1.16f)*(L + 0.16f);
    -572        final float cos = MathTools.cos_(hue);
    -573        final float sin = MathTools.sin_(hue);
    -574        final float A0 = cos * 1.26365817f * 0.2f;
    -575        final float B0 = sin * 1.26365817f * 0.5f;
    -576        final float y = reverseXYZ(L0);
    -577        float A2 = A0, B2 = B0;
    -578        for (int attempt = 127; attempt >= 0; attempt--) {
    -579            final float x = reverseXYZ(L + A2);
    -580            final float z = reverseXYZ(L - B2);
    -581            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    -582            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    -583            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    -584            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -585                break;
    -586            final float progress = attempt * 0x1p-7f;
    -587            A2 = (A0 * progress);
    -588            B2 = (B0 * progress);
    -589        }
    -590        final float dist = (float) Math.sqrt(A2 * A2 + B2 * B2) * saturation;
    -591        return BitConversion.intBitsToFloat(
    -592                (int) (alpha * 127.999f) << 25 |
    -593                        Math.min(Math.max((int) (sin * dist + 127.5f), 0), 255) << 16 |
    -594                        Math.min(Math.max((int) (cos * dist + 127.5f), 0), 255) << 8 |
    -595                        (int) (lightness * 255.999f));
    -596    }
    -597
    -598    /**
    -599     * A different way to specify a CIELAB color, using hue, chroma, lightness, and alpha something like a normal HSL(A)
    -600     * color but calculating them directly in the CIELAB color space. This has you specify the desired chroma directly,
    -601     * as obtainable with {@link #chroma(float)}, rather than the saturation, which is a fraction of the maximum chroma
    -602     * (saturation is what {@link #cielabByHSL(float, float, float, float)} uses). Note that this takes a different
    -603     * value for its {@code hue} that the method {@link #hue(float)} produces, just like {@code lightness} and the
    -604     * method {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent
    -605     * to {@link #channelL(float)}. If you use this to get two colors with the same chroma and lightness, but different
    -606     * hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the
    -607     * gamut limit (you can get this limit with {@link #chromaLimit(float, float)}). If a chroma value given is greater
    -608     * than the chroma limit, this clamps chroma to that limit. You can use {@link #cielabHue(float)},
    -609     * {@link #chroma(float)}, and {@link #cielabLightness(float)} to get the hue, chroma, and lightness values from an
    -610     * existing color that this will understand ({@link #alpha(float)} too). This method should be significantly faster
    -611     * than {@link #cielabByHSL(float, float, float, float)} because it doesn't need to calculate the gamut.
    -612     * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    -613     * @param chroma will be clamped between 0 and the maximum chroma possible for the given hue and lightness
    -614     * @param lightness will be clamped between 0 and 1
    -615     * @param alpha will be clamped between 0 and 1
    -616     * @return a packed CIELAB float color that tries to match the requested hue, chroma, and lightness
    -617     */
    -618    public static float cielabByHCL(float hue, float chroma, float lightness, float alpha) {
    -619        lightness = Math.min(Math.max(lightness, 0f), 1f);
    -620        chroma = Math.max(chroma, 0f) * 127.5f;
    -621        hue -= MathTools.floor(hue);
    -622        alpha = Math.min(Math.max(alpha, 0f), 1f);
    -623        return BitConversion.intBitsToFloat(
    -624                (int) (alpha * 127.999f) << 25 |
    -625                        Math.min(Math.max((int) (MathTools.sin_(hue) /* * 2f */ * chroma + 127.5f), 0), 255) << 16 |
    -626                        Math.min(Math.max((int) (MathTools.cos_(hue) /* * 5f */ * chroma + 127.5f), 0), 255) << 8 |
    -627                        (int) (lightness * 255.999f));
    -628    }
    -629
    -630    /**
    -631     * Gets a color as a CIELAB packed float given floats representing hue, saturation, lightness, and opacity.
    -632     * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
    -633     * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
    -634     * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
    -635     * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
    -636     * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
    -637     * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
    -638     * of high-saturation where lightness is 0.5f.
    -639     *
    -640     * @param hue        0f to 1f, color wheel position
    -641     * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
    -642     * @param lightness  0f to 1f, 0f is black and 1f is white
    -643     * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
    -644     * @return a CIELAB float encoding a color with the given properties
    -645     */
    -646    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
    -647        if (lightness <= 0.001f) {
    -648            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    -649        } else {
    -650            return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    -651        }
    -652    }
    -653
    -654    /**
    -655     * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
    -656     * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details.
    -657     *
    -658     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -659     * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    -660     */
    -661    public static float saturation(final float encoded) {
    -662        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -663        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -664        if(Math.abs(L - 0.5) > 0.495f) return 0f;
    -665        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -666        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -667        final float x = reverseXYZ(L + A);
    -668        final float y = reverseXYZ(L);
    -669        final float z = reverseXYZ(L - B);
    -670        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -671        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -672        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -673        float X, Y, W;
    -674        if(g < b) {
    -675            X = b;
    -676            Y = g;
    -677        }
    -678        else {
    -679            X = g;
    -680            Y = b;
    -681        }
    -682        if(r < X) {
    -683            W = r;
    -684        }
    -685        else {
    -686            W = X;
    -687            X = r;
    -688        }
    -689        return X - Math.min(W, Y);
    -690    }
    -691
    -692    /**
    -693     * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for CIELAB. This
    -694     * ranges from 0.0f (black) to 1.0f (white).
    -695     *
    -696     * @param encoded a packed float CIELAB color
    -697     * @return the lightness of the given color as HSL would calculate it
    -698     */
    -699    public static float lightness(final float encoded) {
    -700        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -701        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -702        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -703        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -704        final float x = reverseXYZ(L + A);
    -705        final float y = reverseXYZ(L);
    -706        final float z = reverseXYZ(L - B);
    -707        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -708        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -709        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -710        float X, Y, W;
    -711        if(g < b) {
    -712            X = b;
    -713            Y = g;
    -714        }
    -715        else {
    -716            X = g;
    -717            Y = b;
    -718        }
    -719        if(r < X) {
    -720            W = r;
    -721        }
    -722        else {
    -723            W = X;
    -724            X = r;
    -725        }
    -726        float d = X - Math.min(W, Y);
    -727        return X * (1f - 0.5f * d / (X + 1e-10f));
    -728    }
    -729
    -730    /**
    -731     * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    -732     * to 1f (exclusive, red and approaching purple if decreased).
    -733     *
    -734     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    -735     * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    -736     * eventually to purple before looping back to almost the same red (1.0, exclusive)
    -737     */
    -738    public static float hue(final float encoded) {
    -739        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -740        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -741        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -742        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -743        final float x = reverseXYZ(L + A);
    -744        final float y = reverseXYZ(L);
    -745        final float z = reverseXYZ(L - B);
    -746        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -747        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -748        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -749        float X, Y, Z, W;
    -750        if(g < b) {
    -751            X = b;
    -752            Y = g;
    -753            Z = -1f;
    -754            W = 2f / 3f;
    -755        }
    -756        else {
    -757            X = g;
    -758            Y = b;
    -759            Z = 0f;
    -760            W = -1f / 3f;
    -761        }
    -762        if(r < X) {
    -763            Z = W;
    -764            W = r;
    -765        }
    -766        else {
    -767            W = X;
    -768            X = r;
    -769        }
    -770        float d = X - Math.min(W, Y);
    -771        return Math.abs(Z + (W - Y) / (6f * d + 1e-10f));
    -772    }
    -773    /**
    -774     * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    -775     * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not CIELAB! Takes
    -776     * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    -777     * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is likely to be
    -778     * different than the result of {@code basis} unless hue, saturation, lightness, and opacity are all 0.
    -779     * This won't allocate any objects.
    -780     * <br>
    -781     * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    -782     * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    -783     * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    -784     * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    -785     * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    -786     *
    -787     * @param basis      a packed float color that will be used as the starting point to make the next color
    -788     * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    -789     * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    -790     * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    -791     * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    -792     * @return a float encoding a variation of basis with the given changes
    -793     */
    -794    public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    -795        final int decoded = BitConversion.floatToRawIntBits(basis);
    -796        final float li = Math.min(Math.max(light + (decoded & 0xff) / 255f, 0f), 1f);
    -797        opacity = Math.min(Math.max(opacity + (decoded >>> 25) * (1f / 127f), 0f), 1f);
    -798        if (li <= 0.001f)
    -799            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
    -800        final float L = (1f/1.16f)*(li + 0.16f);
    -801        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -802        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -803        final float x = reverseXYZ(L + A);
    -804        final float y = reverseXYZ(L);
    -805        final float z = reverseXYZ(L - B);
    -806        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -807        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -808        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -809        float X, Y, Z, W;
    -810        if(g < b) {
    -811            X = b;
    -812            Y = g;
    -813            Z = -1f;
    -814            W = 2f / 3f;
    -815        }
    -816        else {
    -817            X = g;
    -818            Y = b;
    -819            Z = 0f;
    -820            W = -1f / 3f;
    -821        }
    -822        if(r < X) {
    -823            Z = W;
    -824            W = r;
    -825        }
    -826        else {
    -827            W = X;
    -828            X = r;
    -829        }
    -830        final float d = X - Math.min(W, Y);
    -831        final float lum = X * (1f - 0.5f * d / (X + 1e-10f));
    -832        hue += Math.abs(Z + (W - Y) / (6f * d + 1e-10f)) + 1f;
    -833        saturation += (X - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    -834        return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    -835    }
    -836
    +364
    +365    /**
    +366     * Gets the "chroma" or "colorfulness" of a given CIELAB color. Chroma is similar to saturation in that grayscale
    +367     * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is
    +368     * that colors that are perceptually more-colorful have higher chroma than colors that are perceptually
    +369     * less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That
    +370     * is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color
    +371     * isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that
    +372     * is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to
    +373     * 0 chroma, and the most colorful value (a shade of purple) should have 1.26365817 chroma.
    +374     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +375     * @return a float between 0.0f and 1.26365817 that represents how colorful the given value is
    +376     */
    +377    public static float chroma(final float encoded) {
    +378        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +379        final float a = ((decoded >>> 7 & 0x1FE) - 255) / 255f;
    +380        final float b = ((decoded >>> 15 & 0x1FE) - 255) / 255f;
    +381        return (float) Math.sqrt(a * a + b * b);
    +382    }
    +383    /**
    +384     * Given a hue and lightness, this gets the (very approximate) maximum chroma possible for that hue-lightness
    +385     * combination, using CIELAB's versions of lightness and hue (not HSL). This is useful to know the bounds of
    +386     * {@link #chroma(float)}. This should be no greater than 1.26365817f . Note that this version of chromaLimit() is
    +387     * much slower than Oklab's version, because this has to go to much greater lengths to become accurate.
    +388     * @param hue the hue, typically between 0.0f and 1.0f, to look up
    +389     * @param lightness the lightness, clamped between 0.0f and 1.0f, to look up
    +390     * @return the maximum possible chroma for the given hue and lightness, between 0.0f and 1.26365817f
    +391     */
    +392    public static float chromaLimit(final float hue, final float lightness) {
    +393        final float h = hue - MathTools.floor(hue);
    +394        final float L = (1f/1.16f)*(lightness + 0.16f);
    +395        final float A = TrigTools.cosTurns(h) * (1.26365817f);
    +396        final float B = MathTools.sin_(h) * (1.26365817f);
    +397        final float y = reverseXYZ(L);
    +398        float A2 = A, B2 = B;
    +399        for (int attempt = 127; attempt >= 0; attempt--) {
    +400            final float x = reverseXYZ(L + A2);
    +401            final float z = reverseXYZ(L - B2);
    +402            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    +403            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    +404            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    +405            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +406                break;
    +407            final float progress = attempt * 0x1p-7f;
    +408            A2 = (A * progress);
    +409            B2 = (B * progress);
    +410        }
    +411        return (float) Math.sqrt(A2 * A2 + B2 * B2);
    +412    }
    +413    /**
    +414     * Gets the color with the same L as the CIELAB color stored in the given packed float, but the furthest A
    +415     * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    +416     * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    +417     * @param packed a packed float color in CIELAB format; does not need to be in-gamut
    +418     * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    +419     * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
    +420     */
    +421    public static float maximizeSaturation(final float packed) {
    +422        final int decoded = BitConversion.floatToRawIntBits(packed);
    +423        final float lightness = (decoded & 255) / 255f;
    +424        final float h = MathTools.atan2_(((decoded >>> 16 & 0xff) - 127.5f), ((decoded >>> 8 & 0xff) - 127.5f));
    +425        final float L = (1f/1.16f)*(lightness + 0.16f);
    +426        final float A = TrigTools.cosTurns(h) * 1.26365817f * 0.2f;
    +427        final float B = MathTools.sin_(h) * 1.26365817f * 0.5f;
    +428        final float y = reverseXYZ(L);
    +429        float A2 = A, B2 = B;
    +430        for (int attempt = 127; attempt >= 0; attempt--) {
    +431            final float x = reverseXYZ(L + A2);
    +432            final float z = reverseXYZ(L - B2);
    +433            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    +434            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    +435            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    +436            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +437                break;
    +438            final float progress = attempt * 0x1p-7f;
    +439            A2 = (A * progress);
    +440            B2 = (B * progress);
    +441        }
    +442        return cielab(lightness, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    +443    }
    +444    /**
    +445     * Gets the color with the same L as the CIELAB color stored in the given packed float, but the furthest A
    +446     * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    +447     * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    +448     * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    +449     * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    +450     * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    +451     * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
    +452     * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    +453     * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation
    +454     * for out-of-gamut colors.
    +455     */
    +456    public static float maximizeSaturation(float L, float A, float B, float alpha) {
    +457        L = Math.min(Math.max(L, 0f), 1f);
    +458        A = Math.min(Math.max(A, 0f), 1f);
    +459        B = Math.min(Math.max(B, 0f), 1f);
    +460        alpha = Math.min(Math.max(alpha, 0f), 1f);
    +461        final float h = MathTools.atan2_(B - 0.5f, A - 0.5f);
    +462        final float L0 = (1f/1.16f)*(L + 0.16f);
    +463        final float A0 = TrigTools.cosTurns(h) * 1.26365817f;
    +464        final float B0 = MathTools.sin_(h) * 1.26365817f;
    +465        final float y = reverseXYZ(L0);
    +466        float A2 = A0, B2 = B0;
    +467        for (int attempt = 127; attempt >= 0; attempt--) {
    +468            final float x = reverseXYZ(L0 + A2);
    +469            final float z = reverseXYZ(L0 - B2);
    +470            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    +471            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    +472            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    +473            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +474                break;
    +475            final float progress = attempt * 0x1p-7f;
    +476            A2 = (A0 * progress);
    +477            B2 = (B0 * progress);
    +478        }
    +479        return cielab(L, A2, B2, alpha);
    +480    }
    +481
    +482    /**
    +483     * Gets the hue of the given CIELAB float color, but as CIELAB understands hue rather than how HSL does.
    +484     * This is different from {@link #hue(float)}, which uses HSL. This gives a float between 0 (inclusive)
    +485     * and 1 (exclusive).
    +486     *
    +487     * @param packed a packed CIELAB float color
    +488     * @return a float between 0 (inclusive) and 1 (exclusive) that represents hue in the CIELAB color space
    +489     */
    +490    public static float cielabHue(final float packed) {
    +491        final int decoded = BitConversion.floatToRawIntBits(packed);
    +492        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +493        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +494        return MathTools.atan2_(B, A);
    +495    }
    +496
    +497    /**
    +498     * Gets the saturation of the given CIELAB float color, but as CIELAB understands saturation rather than how HSL
    +499     * does. Saturation here is a fraction of the chroma limit (see {@link #chromaLimit(float, float)}) for a given hue
    +500     * and lightness, and is between 0 and 1. This gives a float between 0 (inclusive) and 1 (inclusive).
    +501     *
    +502     * @param packed a packed CIELAB float color
    +503     * @return a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the CIELAB color space
    +504     */
    +505    public static float cielabSaturation(final float packed) {
    +506        final int decoded = BitConversion.floatToRawIntBits(packed);
    +507        final float L = (1f/1.16f)*(((decoded & 0xff) / 255f) + 0.16f);
    +508        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +509        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +510        final float h = MathTools.atan2_(B, A);
    +511        final float L0 = (1f/1.16f)*(L + 0.16f);
    +512        final float A0 = TrigTools.cosTurns(h) * 1.26365817f;
    +513        final float B0 = MathTools.sin_(h) * 1.26365817f;
    +514        final float y = reverseXYZ(L0);
    +515        float A2 = A0, B2 = B0;
    +516        for (int attempt = 127; attempt >= 0; attempt--) {
    +517            final float x = reverseXYZ(L + A2);
    +518            final float z = reverseXYZ(L - B2);
    +519            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    +520            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    +521            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    +522            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +523                break;
    +524            final float progress = attempt * 0x1p-7f;
    +525            A2 = (A0 * progress);
    +526            B2 = (B0 * progress);
    +527        }
    +528        final float dist = (float) Math.sqrt(A2 * A2 + B2 * B2);
    +529        return (float) Math.sqrt(A * A + B * B) / dist;
    +530    }
    +531    /**
    +532     * Gets the lightness of the given CIELAB float color, but as CIELAB understands lightness rather than how HSL does.
    +533     * This is different from {@link #lightness(float)}, which uses HSL. This gives a float between 0 (inclusive)
    +534     * and 1 (inclusive).
    +535     * <br>
    +536     * This is the same as {@link #channelL(float)}.
    +537     *
    +538     * @param packed a packed CIELAB float color
    +539     * @return a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the CIELAB color space
    +540     */
    +541    public static float cielabLightness(final float packed){
    +542        return (BitConversion.floatToRawIntBits(packed) & 0xff) / 255f;
    +543    }
    +544
    +545    /**
    +546     * A different way to specify a CIELAB color, using hue, saturation, lightness, and alpha like a normal HSL(A) color
    +547     * but calculating them directly in the CIELAB color space. This is more efficient than
    +548     * {@link #floatGetHSL(float, float, float, float)}. You may prefer using
    +549     * {@link #cielabByHCL(float, float, float, float)}, which takes an absolute chroma as opposed to the saturation
    +550     * here (which is a fraction of the maximum chroma).
    +551     * <br>
    +552     * Note that this takes a different value for its {@code hue} that the method {@link #hue(float)} produces, just
    +553     * like its {@code saturation} and the method {@link #saturation(float)}, and {@code lightness} and the method
    +554     * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
    +555     * {@link #channelL(float)}, but the saturation here refers to what fraction the chroma should be of the maximum
    +556     * chroma for the given hue and lightness. You can use {@link #cielabHue(float)}, {@link #cielabSaturation(float)},
    +557     * and {@link #cielabLightness(float)} to get the hue, saturation, and lightness values from an existing color that
    +558     * this will understand ({@link #alpha(float)} too). This method is likely to be significantly slower than
    +559     * {@link #cielabByHCL(float, float, float, float)} because this needs to calculate the gamut.
    +560     * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    +561     * @param saturation will be clamped between 0 and 1
    +562     * @param lightness will be clamped between 0 and 1
    +563     * @param alpha will be clamped between 0 and 1
    +564     * @return a packed CIELAB float color that tries to match the requested hue, saturation, and lightness
    +565     */
    +566    public static float cielabByHSL(float hue, float saturation, float lightness, float alpha) {
    +567        lightness = Math.min(Math.max(lightness, 0f), 1f);
    +568        saturation = Math.min(Math.max(saturation, 0f), 1f);
    +569        hue -= MathTools.floor(hue);
    +570        alpha = Math.min(Math.max(alpha, 0f), 1f);
    +571        final float L = (1f/1.16f)*(lightness + 0.16f);
    +572        final float L0 = (1f/1.16f)*(L + 0.16f);
    +573        final float cos = TrigTools.cosTurns(hue);
    +574        final float sin = MathTools.sin_(hue);
    +575        final float A0 = cos * 1.26365817f * 0.2f;
    +576        final float B0 = sin * 1.26365817f * 0.5f;
    +577        final float y = reverseXYZ(L0);
    +578        float A2 = A0, B2 = B0;
    +579        for (int attempt = 127; attempt >= 0; attempt--) {
    +580            final float x = reverseXYZ(L + A2);
    +581            final float z = reverseXYZ(L - B2);
    +582            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    +583            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    +584            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    +585            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +586                break;
    +587            final float progress = attempt * 0x1p-7f;
    +588            A2 = (A0 * progress);
    +589            B2 = (B0 * progress);
    +590        }
    +591        final float dist = (float) Math.sqrt(A2 * A2 + B2 * B2) * saturation;
    +592        return BitConversion.intBitsToFloat(
    +593                (int) (alpha * 127.999f) << 25 |
    +594                        Math.min(Math.max((int) (sin * dist + 127.5f), 0), 255) << 16 |
    +595                        Math.min(Math.max((int) (cos * dist + 127.5f), 0), 255) << 8 |
    +596                        (int) (lightness * 255.999f));
    +597    }
    +598
    +599    /**
    +600     * A different way to specify a CIELAB color, using hue, chroma, lightness, and alpha something like a normal HSL(A)
    +601     * color but calculating them directly in the CIELAB color space. This has you specify the desired chroma directly,
    +602     * as obtainable with {@link #chroma(float)}, rather than the saturation, which is a fraction of the maximum chroma
    +603     * (saturation is what {@link #cielabByHSL(float, float, float, float)} uses). Note that this takes a different
    +604     * value for its {@code hue} that the method {@link #hue(float)} produces, just like {@code lightness} and the
    +605     * method {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent
    +606     * to {@link #channelL(float)}. If you use this to get two colors with the same chroma and lightness, but different
    +607     * hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the
    +608     * gamut limit (you can get this limit with {@link #chromaLimit(float, float)}). If a chroma value given is greater
    +609     * than the chroma limit, this clamps chroma to that limit. You can use {@link #cielabHue(float)},
    +610     * {@link #chroma(float)}, and {@link #cielabLightness(float)} to get the hue, chroma, and lightness values from an
    +611     * existing color that this will understand ({@link #alpha(float)} too). This method should be significantly faster
    +612     * than {@link #cielabByHSL(float, float, float, float)} because it doesn't need to calculate the gamut.
    +613     * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    +614     * @param chroma will be clamped between 0 and the maximum chroma possible for the given hue and lightness
    +615     * @param lightness will be clamped between 0 and 1
    +616     * @param alpha will be clamped between 0 and 1
    +617     * @return a packed CIELAB float color that tries to match the requested hue, chroma, and lightness
    +618     */
    +619    public static float cielabByHCL(float hue, float chroma, float lightness, float alpha) {
    +620        lightness = Math.min(Math.max(lightness, 0f), 1f);
    +621        chroma = Math.max(chroma, 0f) * 127.5f;
    +622        hue -= MathTools.floor(hue);
    +623        alpha = Math.min(Math.max(alpha, 0f), 1f);
    +624        return BitConversion.intBitsToFloat(
    +625                (int) (alpha * 127.999f) << 25 |
    +626                        Math.min(Math.max((int) (MathTools.sin_(hue) /* * 2f */ * chroma + 127.5f), 0), 255) << 16 |
    +627                        Math.min(Math.max((int) (TrigTools.cosTurns(hue) /* * 5f */ * chroma + 127.5f), 0), 255) << 8 |
    +628                        (int) (lightness * 255.999f));
    +629    }
    +630
    +631    /**
    +632     * Gets a color as a CIELAB packed float given floats representing hue, saturation, lightness, and opacity.
    +633     * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
    +634     * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
    +635     * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
    +636     * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
    +637     * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
    +638     * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
    +639     * of high-saturation where lightness is 0.5f.
    +640     *
    +641     * @param hue        0f to 1f, color wheel position
    +642     * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
    +643     * @param lightness  0f to 1f, 0f is black and 1f is white
    +644     * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
    +645     * @return a CIELAB float encoding a color with the given properties
    +646     */
    +647    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
    +648        if (lightness <= 0.001f) {
    +649            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    +650        } else {
    +651            return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    +652        }
    +653    }
    +654
    +655    /**
    +656     * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
    +657     * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details.
    +658     *
    +659     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +660     * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    +661     */
    +662    public static float saturation(final float encoded) {
    +663        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +664        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +665        if(Math.abs(L - 0.5) > 0.495f) return 0f;
    +666        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +667        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +668        final float x = reverseXYZ(L + A);
    +669        final float y = reverseXYZ(L);
    +670        final float z = reverseXYZ(L - B);
    +671        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +672        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +673        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +674        float X, Y, W;
    +675        if(g < b) {
    +676            X = b;
    +677            Y = g;
    +678        }
    +679        else {
    +680            X = g;
    +681            Y = b;
    +682        }
    +683        if(r < X) {
    +684            W = r;
    +685        }
    +686        else {
    +687            W = X;
    +688            X = r;
    +689        }
    +690        return X - Math.min(W, Y);
    +691    }
    +692
    +693    /**
    +694     * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for CIELAB. This
    +695     * ranges from 0.0f (black) to 1.0f (white).
    +696     *
    +697     * @param encoded a packed float CIELAB color
    +698     * @return the lightness of the given color as HSL would calculate it
    +699     */
    +700    public static float lightness(final float encoded) {
    +701        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +702        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +703        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +704        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +705        final float x = reverseXYZ(L + A);
    +706        final float y = reverseXYZ(L);
    +707        final float z = reverseXYZ(L - B);
    +708        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +709        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +710        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +711        float X, Y, W;
    +712        if(g < b) {
    +713            X = b;
    +714            Y = g;
    +715        }
    +716        else {
    +717            X = g;
    +718            Y = b;
    +719        }
    +720        if(r < X) {
    +721            W = r;
    +722        }
    +723        else {
    +724            W = X;
    +725            X = r;
    +726        }
    +727        float d = X - Math.min(W, Y);
    +728        return X * (1f - 0.5f * d / (X + 1e-10f));
    +729    }
    +730
    +731    /**
    +732     * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    +733     * to 1f (exclusive, red and approaching purple if decreased).
    +734     *
    +735     * @param encoded a color as a packed float that can be obtained by {@link #cielab(float, float, float, float)}
    +736     * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    +737     * eventually to purple before looping back to almost the same red (1.0, exclusive)
    +738     */
    +739    public static float hue(final float encoded) {
    +740        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +741        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +742        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +743        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +744        final float x = reverseXYZ(L + A);
    +745        final float y = reverseXYZ(L);
    +746        final float z = reverseXYZ(L - B);
    +747        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +748        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +749        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +750        float X, Y, Z, W;
    +751        if(g < b) {
    +752            X = b;
    +753            Y = g;
    +754            Z = -1f;
    +755            W = 2f / 3f;
    +756        }
    +757        else {
    +758            X = g;
    +759            Y = b;
    +760            Z = 0f;
    +761            W = -1f / 3f;
    +762        }
    +763        if(r < X) {
    +764            Z = W;
    +765            W = r;
    +766        }
    +767        else {
    +768            W = X;
    +769            X = r;
    +770        }
    +771        float d = X - Math.min(W, Y);
    +772        return Math.abs(Z + (W - Y) / (6f * d + 1e-10f));
    +773    }
    +774    /**
    +775     * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    +776     * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not CIELAB! Takes
    +777     * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    +778     * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is likely to be
    +779     * different than the result of {@code basis} unless hue, saturation, lightness, and opacity are all 0.
    +780     * This won't allocate any objects.
    +781     * <br>
    +782     * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    +783     * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    +784     * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    +785     * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    +786     * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    +787     *
    +788     * @param basis      a packed float color that will be used as the starting point to make the next color
    +789     * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    +790     * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    +791     * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    +792     * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    +793     * @return a float encoding a variation of basis with the given changes
    +794     */
    +795    public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    +796        final int decoded = BitConversion.floatToRawIntBits(basis);
    +797        final float li = Math.min(Math.max(light + (decoded & 0xff) / 255f, 0f), 1f);
    +798        opacity = Math.min(Math.max(opacity + (decoded >>> 25) * (1f / 127f), 0f), 1f);
    +799        if (li <= 0.001f)
    +800            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
    +801        final float L = (1f/1.16f)*(li + 0.16f);
    +802        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +803        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +804        final float x = reverseXYZ(L + A);
    +805        final float y = reverseXYZ(L);
    +806        final float z = reverseXYZ(L - B);
    +807        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +808        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +809        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +810        float X, Y, Z, W;
    +811        if(g < b) {
    +812            X = b;
    +813            Y = g;
    +814            Z = -1f;
    +815            W = 2f / 3f;
    +816        }
    +817        else {
    +818            X = g;
    +819            Y = b;
    +820            Z = 0f;
    +821            W = -1f / 3f;
    +822        }
    +823        if(r < X) {
    +824            Z = W;
    +825            W = r;
    +826        }
    +827        else {
    +828            W = X;
    +829            X = r;
    +830        }
    +831        final float d = X - Math.min(W, Y);
    +832        final float lum = X * (1f - 0.5f * d / (X + 1e-10f));
    +833        hue += Math.abs(Z + (W - Y) / (6f * d + 1e-10f)) + 1f;
    +834        saturation += (X - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    +835        return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    +836    }
     837
    -838    /**
    -839     * Given a packed float CIELAB color, this edits its L, A, B, and alpha channels by adding the corresponding "add"
    -840     * parameter and then clamping. This returns a different float value (of course, the given float can't be edited
    -841     * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the
    -842     * resulting color so it contains in-range L, A, B, and alpha values, but it doesn't guarantee it stays in-gamut.
    -843     * @param encoded a packed float CIELAB color
    -844     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    -845     * @param addA how much to add to the A channel; typically in the -1 to 1 range
    -846     * @param addB how much to add to the B channel; typically in the -1 to 1 range
    -847     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -848     * @return a packed float CIELAB color with the requested edits applied to {@code encoded}
    -849     */
    -850    public static float editCIELAB(float encoded, float addL, float addA, float addB, float addAlpha) {
    -851        return editCIELAB(encoded, addL, addA, addB, addAlpha, 1f, 1f, 1f, 1f);
    -852    }
    -853    /**
    -854     * Given a packed float CIELAB color, this edits its L, A, B, and alpha channels by first multiplying each channel
    -855     * by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This
    -856     * means the lightness value {@code L} is multiplied by {@code mulL}, then has {@code addL} added, and then is
    -857     * clamped to the normal range for L (0 to 1). This returns a different float value (of course, the given float
    -858     * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a
    -859     * value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5
    -860     * range, so if you multiply by a small number like {@code 0.25f}, then this will produce a less-saturated color,
    -861     * and if you multiply by a larger number like {@code 4f}, then you will get a much more-saturated color. This
    -862     * clamps the resulting color so it contains in-range L, A, B, and alpha values, but it doesn't guarantee it stays
    -863     * in-gamut.
    -864     * @param encoded a packed float CIELAB color
    -865     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    -866     * @param addA how much to add to the A channel; typically in the -1 to 1 range
    -867     * @param addB how much to add to the B channel; typically in the -1 to 1 range
    -868     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -869     * @param mulL how much to multiply the L channel by; should be non-negative
    -870     * @param mulA how much to multiply the A channel by; usually non-negative (not always)
    -871     * @param mulB how much to multiply the B channel by; usually non-negative (not always)
    -872     * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    -873     * @return a packed float CIELAB color with the requested edits applied to {@code encoded}
    -874     */
    -875    public static float editCIELAB(float encoded, float addL, float addA, float addB, float addAlpha,
    -876                                  float mulL, float mulA, float mulB, float mulAlpha) {
    -877        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -878        float L = (decoded & 0xff) / 255f;
    -879        float A = ((decoded >>> 8 & 0xff) - 127.5f)  * (0.2f / 127.5f);
    -880        float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -881        float alpha = (decoded >>> 25) / 127f;
    -882
    -883        L = Math.min(Math.max(L * mulL + addL, 0f), 1f);
    -884        A = Math.min(Math.max(A * mulA + addA * 2f, -1f), 1f) * 0.5f;
    -885        B = Math.min(Math.max(B * mulB + addB * 2f, -1f), 1f) * 0.5f;
    -886        alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    -887        return clamp(L, A, B, alpha);
    -888    }
    -889
    -890    /**
    -891     * The "L" channel of the given packed float in CIELAB format, which is its lightness; ranges from 0.0f to
    -892     * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
    -893     *
    -894     * @param encoded a color encoded as a packed float, as by {@link #cielab(float, float, float, float)}
    -895     * @return the L value as a float from 0.0f to 1.0f
    -896     */
    -897    public static float channelL(final float encoded)
    -898    {
    -899        return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    -900    }
    -901
    -902    /**
    -903     * The "A" channel of the given packed float in CIELAB format, which when combined with the B channel describes the
    -904     * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or
    -905     * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with
    -906     * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}.
    -907     * @param encoded a color encoded as a packed float, as by {@link #cielab(float, float, float, float)}
    -908     * @return the A value as a float from 0.0f to 1.0f
    -909     */
    -910    public static float channelA(final float encoded)
    -911    {
    -912        return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    -913    }
    -914
    -915    /**
    -916     * The "B" channel of the given packed float in CIELAB format, which when combined with the A channel describes the
    -917     * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more
    -918     * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit
    -919     * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}.
    -920     * @param encoded a color encoded as a packed float, as by {@link #cielab(float, float, float, float)}
    -921     * @return the B value as a float from 0.0f to 1.0f
    -922     */
    -923    public static float channelB(final float encoded)
    -924    {
    -925        return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    -926    }
    -927
    -928    /**
    -929     * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    -930     * start as-is) and 1f (return white), start should be a packed color, as from
    -931     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -932     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -933     * towards white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both
    -934     * chroma of start as-is.
    -935     * @see #darken(float, float) the counterpart method that darkens a float color
    -936     * @param start the starting color as a packed float
    -937     * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    -938     * @return a packed float that represents a color between start and white
    -939     */
    -940    public static float lighten(final float start, final float change) {
    -941        final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    -942        return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
    -943    }
    -944
    -945    /**
    -946     * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    -947     * start as-is) and 1f (return black), start should be a packed color, as from
    -948     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -949     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -950     * towards black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both
    -951     * chroma of start as-is.
    -952     * @see #lighten(float, float) the counterpart method that lightens a float color
    -953     * @param start the starting color as a packed float
    -954     * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    -955     * @return a packed float that represents a color between start and black
    -956     */
    -957    public static float darken(final float start, final float change) {
    -958        final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    -959        return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
    -960    }
    -961
    -962    /**
    -963     * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
    -964     * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
    -965     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -966     * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    -967     * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    -968     * alpha and L of start as-is.
    -969     * @see #lowerA(float, float) the counterpart method that cools a float color
    -970     * @param start the starting color as a packed float
    -971     * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
    -972     * @return a packed float that represents a color between start and a warmer color
    -973     */
    -974    public static float raiseA(final float start, final float change) {
    -975        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -976        return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    -977    }
    -978
    -979    /**
    -980     * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
    -981     * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
    -982     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -983     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -984     * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
    -985     * L of start as-is.
    -986     * @see #raiseA(float, float) the counterpart method that warms a float color
    -987     * @param start the starting color as a packed float
    -988     * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
    -989     * @return a packed float that represents a color between start and a cooler color
    -990     */
    -991    public static float lowerA(final float start, final float change) {
    -992        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -993        return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    -994    }
    -995
    -996    /**
    -997     * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    -998     * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed
    -999     * color, as from {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    -1000     * Colors, and is a little more efficient and clear than using
    -1001     * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
    -1002     * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
    -1003     * @see #lowerB(float, float) the counterpart method that makes a float color less natural
    -1004     * @param start the starting color as a packed float
    -1005     * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
    -1006     * @return a packed float that represents a color between start and a more natural color
    -1007     */
    -1008    public static float raiseB(final float start, final float change) {
    -1009        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -1010        return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    -1011    }
    -1012
    -1013    /**
    -1014     * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    -1015     * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed
    -1016     * color, as from {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    -1017     * Colors, and is a little more efficient and clear than using
    -1018     * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more artificial color. Unlike
    -1019     * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
    -1020     * @see #raiseB(float, float) the counterpart method that makes a float color less artificial
    -1021     * @param start the starting color as a packed float
    -1022     * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
    -1023     * @return a packed float that represents a color between start and a more artificial color
    -1024     */
    -1025    public static float lowerB(final float start, final float change) {
    -1026        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -1027        return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    -1028    }
    -1029
    -1030    /**
    -1031     * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    -1032     * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    -1033     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -1034     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -1035     * towards transparent. This won't change the L, A, or B of the color.
    -1036     * @see #fade(float, float) the counterpart method that makes a float color more translucent
    -1037     * @param start the starting color as a packed float
    -1038     * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    -1039     * @return a packed float that represents a color between start and its opaque version
    -1040     */
    -1041    public static float blot(final float start, final float change) {
    -1042        final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    -1043        return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    -1044    }
    -1045
    -1046    /**
    -1047     * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    -1048     * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    -1049     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -1050     * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    -1051     * lerp towards transparent. This won't change the L, A, or B of the color.
    -1052     * @see #blot(float, float) the counterpart method that makes a float color more opaque
    -1053     * @param start the starting color as a packed float
    -1054     * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    -1055     * @return a packed float that represents a color between start and transparent
    -1056     */
    -1057    public static float fade(final float start, final float change) {
    -1058        final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    -1059        return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    -1060    }
    -1061
    -1062    /**
    -1063     * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
    -1064     * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    -1065     * from {@link #cielab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone.
    -1066     * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    -1067     * @param start the starting color as a packed float
    -1068     * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    -1069     * @return a packed float that represents a color between start and a desaturated color
    -1070     */
    -1071    public static float dullen(final float start, final float change) {
    -1072        final int s = BitConversion.floatToRawIntBits(start);
    -1073        return cielab((s & 0xFF) / 255f,
    -1074                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    -1075                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    -1076                (s >>> 25) / 127f);
    -1077    }
    -1078
    -1079    /**
    -1080     * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
    -1081     * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    -1082     * from {@link #cielab(float, float, float, float)}. This changes only A and B. This prevents high values for change
    -1083     * from pushing A or B out of the valid range by using {@link #clamp(float, float, float, float)}; this doesn't
    -1084     * actually keep the color in-gamut, but usually rendering code can handle out-of-gamut colors in some way.
    -1085     * Alpha. The alpha never changes. It never changes L either.
    -1086     * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    -1087     * @param start the starting color as a packed float
    -1088     * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    -1089     * @return a packed float that represents a color between start and a saturated color
    -1090     */
    -1091    public static float enrich(final float start, final float change) {
    -1092        final int s = BitConversion.floatToRawIntBits(start);
    -1093        return clamp((s & 0xFF) / 255f,
    -1094                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    -1095                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    -1096                (s >>> 25) / 127f);
    -1097    }
    -1098
    -1099    /**
    -1100     * Given a packed float CIELAB color {@code mainColor} and another CIELAB color that it should be made to contrast with,
    -1101     * gets a packed float CIELAB color with roughly inverted intnsity but the same chromatic channels and opacity (P and T
    -1102     * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
    -1103     * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows
    -1104     * most of the colors this method produces to contrast well as a foreground when displayed on a background of
    -1105     * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the
    -1106     * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
    -1107     * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
    -1108     * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
    -1109     * {@code contrastingColor} without losing its other qualities.
    -1110     * @param mainColor a packed float color, as produced by {@link #cielab(float, float, float, float)}; this is the color that will be adjusted
    -1111     * @param contrastingColor a packed float color, as produced by {@link #cielab(float, float, float, float)}; the adjusted mainColor will contrast with this
    -1112     * @return a different CIELAB packed float color, based on mainColor but with potentially very different lightness
    -1113     */
    -1114    public static float inverseLightness(final float mainColor, final float contrastingColor)
    -1115    {
    -1116        final int bits = BitConversion.floatToRawIntBits(mainColor),
    -1117                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    -1118                L = (bits & 0xff),
    -1119                A = (bits >>> 8 & 0xff),
    -1120                B = (bits >>> 16 & 0xff),
    -1121                cL = (contrastBits & 0xff),
    -1122                cA = (contrastBits >>> 8 & 0xff),
    -1123                cB = (contrastBits >>> 16 & 0xff);
    -1124        if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000)
    -1125            return mainColor;
    -1126        return cielab(cL < 128 ? L * (0.45f / 255f) + 0.5f : 0.5f - L * (0.45f / 255f), A / 255f, B / 255f, 0x1.0p-8f * (bits >>> 24));
    -1127    }
    -1128
    -1129    /**
    -1130     * Given a packed float CIELAB color {@code mainColor} and another CIELAB color that it should be made to contrast
    -1131     * with, gets a packed float CIELAB color with L that should be quite different from {@code contrastingColor}'s L,
    -1132     * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
    -1133     * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
    -1134     * a background of {@code contrastingColor}, or vice versa.
    -1135     * <br>
    -1136     * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    -1137     * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    -1138     * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
    -1139     * @param mainColor a packed CIELAB float color; this is the color that will be adjusted
    -1140     * @param contrastingColor a packed CIELAB float color; the adjusted mainColor will contrast with the I of this
    -1141     * @return a different packed CIELAB float color, based on mainColor but typically with different lightness
    -1142     */
    -1143    public static float differentiateLightness(final float mainColor, final float contrastingColor)
    -1144    {
    -1145        final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    -1146        return BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1);
    -1147    }
    -1148
    -1149    /**
    -1150     * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
    -1151     * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
    -1152     * results in the middle-range of possible lightness.
    -1153     * @param mainColor a packed CIELAB float color
    -1154     * @return a different packed CIELAB float color, with its L channel changed and limited to the correct gamut
    -1155     */
    -1156    public static float offsetLightness(final float mainColor) {
    -1157        final int decoded = BitConversion.floatToRawIntBits(mainColor);
    -1158        return BitConversion.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1);
    -1159    }
    -1160
    -1161    /**
    -1162     * Makes the additive CIELAB color stored in {@code color} cause less of a change when used as a tint, as if it were
    -1163     * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    -1164     * 50% gray, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    -1165     * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    -1166     * @param color a color that should have its tinting effect potentially weakened
    -1167     * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    -1168     * @return a CIELAB float color between gray and {@code color}
    -1169     */
    -1170    public static float lessenChange(final float color, float fraction) {
    -1171        final int e = BitConversion.floatToRawIntBits(color),
    -1172                sL = 0x80, sA = 0x80, sB = 0x80,
    -1173                eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
    -1174        return BitConversion.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF)
    -1175                | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8)
    -1176                | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16)
    -1177                | (eAlpha << 24));
    -1178    }
    -1179
    -1180    /**
    -1181     * Returns true if the given packed float color, as CIELAB, is valid to convert losslessly back to RGBA.
    -1182     * @param packed a packed float color as CIELAB
    -1183     * @return true if the given packed float color can be converted back and forth to RGBA
    -1184     */
    -1185    public static boolean inGamut(final float packed)
    -1186    {
    -1187        final int decoded = BitConversion.floatToRawIntBits(packed);
    -1188        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -1189        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -1190        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -1191        final float x = reverseXYZ(L + A);
    -1192        final float y = reverseXYZ(L);
    -1193        final float z = reverseXYZ(L - B);
    -1194        final float r = +3.2404542f * x + -1.5371385f * y + -0.4985314f * z;
    -1195        if(r <= -0x1p-8f || r >= 0x1.01p0f) return false;
    -1196        final float g = -0.9692660f * x + +1.8760108f * y + +0.0415560f * z;
    -1197        if(g <= -0x1p-8f || g >= 0x1.01p0f) return false;
    -1198        final float b = +0.0556434f * x + -0.2040259f * y + +1.0572252f * z;
    -1199        return (b > -0x1p-8f && b < 0x1.01p0f);
    -1200
    -1201//        final int decoded = BitConversion.floatToRawIntBits(packed);
    -1202//        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -1203//        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -1204//        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -1205//        final float x = reverseXYZ(L + A);
    -1206//        final float y = reverseXYZ(L);
    -1207//        final float z = reverseXYZ(L - B);
    -1208//        boolean ret = true;
    -1209//        final float r = +3.2406f * x + -1.5372f * y + -0.4986f * z;
    -1210////        final float r = +3.2404542f * x + -1.5371385f * y + -0.4985314f * z;
    -1211//        if(r <= -0x1p-8f || r >= 0x1.01p0f) ret = false;
    -1212////        final float g = -0.9689f * x + +1.8758f * y + +0.0415f * z;
    -1213//        final float g = -0.9692660f * x + +1.8760108f * y + +0.0415560f * z;
    -1214//        if(g <= -0x1p-8f || g >= 0x1.01p0f) ret = false;
    -1215////        final float b = +0.0557f * x + -0.2040f * y + +1.0570f * z;
    -1216//        final float b = +0.0556434f * x + -0.2040259f * y + +1.0572252f * z;
    -1217//        ret &= (b > -0x1p-8f && b < 0x1.01p0f);
    -1218//        if(!ret) System.out.printf("L %f, A %f, B %f, x %f, y %f, z %f, r %f, g %f, b %f\n", L, A, B,  x, y, z,  r, g, b);
    -1219//        return ret;
    -1220
    -1221    }
    -1222
    -1223    /**
    -1224     * Returns true if the given CIELAB values are valid to convert losslessly back to RGBA.
    -1225     * @param L lightness, as a float from 0 to 1
    -1226     * @param A cyan-to-red chroma, as a float from 0 to 1
    -1227     * @param B blue-to-yellow chroma, as a float from 0 to 1
    -1228     * @return true if the given packed float color can be converted back and forth to RGBA
    -1229     */
    -1230    public static boolean inGamut(float L, float A, float B)
    -1231    {
    -1232        L = (1f/1.16f)*(L + 0.16f);
    -1233        A = (A - 0.5f) * (0.4f);
    -1234        B = (B - 0.5f);
    -1235        final float x = reverseXYZ(L + A);
    -1236        final float y = reverseXYZ(L);
    -1237        final float z = reverseXYZ(L - B);
    -1238        final float r = +3.2404542f * x + -1.5371385f * y + -0.4985314f * z;
    -1239        if(r < 0f || r > 1.0f) return false;
    -1240        final float g = -0.9692660f * x + +1.8760108f * y + +0.0415560f * z;
    -1241        if(g < 0f || g > 1.0f) return false;
    -1242        final float b = +0.0556434f * x + -0.2040259f * y + +1.0572252f * z;
    -1243        return (b >= 0f && b <= 1.0f);
    -1244    }
    -1245
    -1246    /**
    -1247     * Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if
    -1248     * it isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the L of the color, only bringing A and B
    -1249     * closer to grayscale. Note that this version of limitToGamut() is much slower than Oklab's version, because Oklab
    -1250     * stores its entire gamut as a large constant, while this has to calculate it.
    -1251     * @param packed a packed float color in CIELAB format; often this color is not in-gamut
    -1252     * @return the first color this finds that is between the given CIELAB color and grayscale, and is in-gamut
    -1253     * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
    -1254     */
    -1255    public static float limitToGamut(final float packed) {
    -1256        final int decoded = BitConversion.floatToRawIntBits(packed);
    -1257        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    -1258        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -1259        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -1260        final float y = reverseXYZ(L);
    -1261        float A2 = A, B2 = B;
    -1262        for (int attempt = 127; attempt >= 0; attempt--) {
    -1263            final float x = reverseXYZ(L + A2);
    -1264            final float z = reverseXYZ(L - B2);
    -1265            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    -1266            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    -1267            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    -1268            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -1269                break;
    -1270            final float progress = attempt * 0x1p-7f;
    -1271            A2 = (A * progress);
    -1272            B2 = (B * progress);
    -1273        }
    -1274        return cielab(L, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    -1275    }
    -1276
    -1277    /**
    -1278     * Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if it
    -1279     * isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the L of the color, only bringing A and B
    -1280     * closer to grayscale. This always produces an opaque color.
    -1281     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    -1282     * @param A cyan-to-red chroma; will be clamped between 0 and 1 if it isn't already
    -1283     * @param B blue-to-yellow chroma; will be clamped between 0 and 1 if it isn't already
    -1284     * @return the first color this finds that is between the given CIELAB color and grayscale, and is in-gamut
    -1285     * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    -1286     */
    -1287    public static float limitToGamut(float L, float A, float B) {
    -1288        return limitToGamut(L, A, B, 1f);
    -1289    }
    -1290    /**
    -1291     * Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if it
    -1292     * isn't in-gamut, or returns it as soon as it is in-gamut. Note that this version of limitToGamut() is much slower
    -1293     * than Oklab's version, because Oklab stores its entire gamut as a large constant, while this has to calculate it.
    -1294     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    -1295     * @param A cyan-to-red chroma; will be clamped between 0 and 1 if it isn't already
    -1296     * @param B blue-to-yellow chroma; will be clamped between 0 and 1 if it isn't already
    -1297     * @param alpha opacity; will be clamped between 0 and 1 if it isn't already
    -1298     * @return the first color this finds that is between the given CIELAB color and grayscale, and is in-gamut
    -1299     * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    -1300     */
    -1301    public static float limitToGamut(float L, float A, float B, float alpha) {
    -1302
    -1303        L = (1f/1.16f)*(Math.min(Math.max(L, 0f), 1f) + 0.16f);
    -1304        A = (Math.min(Math.max(A, 0f), 1f) - 0.5f) * 0.4f;
    -1305        B = (Math.min(Math.max(B, 0f), 1f) - 0.5f);
    -1306        alpha = Math.min(Math.max(alpha, 0f), 1f);
    -1307
    -1308        final float y = reverseXYZ(L);
    -1309        float A2 = A, B2 = B;
    -1310        for (int attempt = 127; attempt >= 0; attempt--) {
    -1311            final float x = reverseXYZ(L + A2);
    -1312            final float z = reverseXYZ(L - B2);
    -1313            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    -1314            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    -1315            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    -1316            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -1317                break;
    -1318            final float progress = attempt * 0x1p-7f;
    -1319            A2 = (A * progress);
    -1320            B2 = (B * progress);
    -1321        }
    -1322        return cielab(L, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, alpha);
    -1323    }
    -1324
    -1325    /**
    -1326     * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    -1327     * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    -1328     * be different each time this is called, and can be obtained from a random number generator to make the colors more
    -1329     * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    -1330     * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the
    -1331     * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    -1332     * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1,
    -1333     * but only internally for measuring distance).
    -1334     * @param color a packed float color, as produced by {@link #cielab(float, float, float, float)}
    -1335     * @param seed a long seed that should be different on each call; should not be 0
    -1336     * @param variance max amount of difference between the given color and the generated color; always less than 1
    -1337     * @return a generated packed float color that should be at least somewhat different from {@code color}
    -1338     */
    -1339    public static float randomEdit(final float color, long seed, final float variance) {
    -1340        final int decoded = BitConversion.floatToRawIntBits(color);
    -1341        final float L = (decoded & 0xff) / 255f;
    -1342        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    -1343        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    -1344        final float limit = variance * variance;
    -1345        float dist, x, y, z;
    -1346        for (int j = 0; j < 50; j++) {
    -1347            x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -1348            y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -1349            z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -1350            seed += 0x9E3779B97F4A7C15L;
    -1351            dist = x * x + y * y + z * z;
    -1352            if(dist <= limit)
    -1353                return clamp(x + L, (A + y) * 0.5f + 0.5f, (B + z) * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    -1354        }
    -1355        return color;
    -1356    }
    -1357
    -1358    /**
    -1359     * Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    -1360     * @param random a Random object (preferably a subclass of Random, like {@link com.github.tommyettinger.random.LaserRandom})
    -1361     * @return a packed float color that is always in-gamut
    -1362     */
    -1363    public static float randomColor(Random random) {
    -1364        float L = random.nextFloat();
    -1365        float A = random.nextFloat();
    -1366        float B = random.nextFloat();
    -1367        while (!inGamut(L, A, B)) {
    -1368            L = random.nextFloat();
    -1369            A = random.nextFloat();
    -1370            B = random.nextFloat();
    -1371        }
    -1372        return cielab(L, A, B, 1f);
    -1373    }
    -1374
    -1375        /**
    -1376         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    -1377         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    -1378         * and EnhancedRandom.
    -1379         * @param random any subclass of juniper's EnhancedRandom, such as a
    -1380         * {@link com.github.tommyettinger.random.DistinctRandom} or
    -1381         * {@link com.github.tommyettinger.random.FourWheelRandom}
    -1382         * @return a packed float color that is always in-gamut
    -1383         */
    -1384    public static float randomizedColor(EnhancedRandom random) {
    -1385        float L = random.nextFloat();
    -1386        float A = random.nextFloat();
    -1387        float B = random.nextFloat();
    -1388        while (!inGamut(L, A, B)) {
    -1389            L = random.nextFloat();
    -1390            A = random.nextFloat();
    -1391            B = random.nextFloat();
    -1392        }
    -1393        return cielab(L, A, B, 1f);
    -1394    }
    -1395
    -1396}
    +838
    +839    /**
    +840     * Given a packed float CIELAB color, this edits its L, A, B, and alpha channels by adding the corresponding "add"
    +841     * parameter and then clamping. This returns a different float value (of course, the given float can't be edited
    +842     * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the
    +843     * resulting color so it contains in-range L, A, B, and alpha values, but it doesn't guarantee it stays in-gamut.
    +844     * @param encoded a packed float CIELAB color
    +845     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    +846     * @param addA how much to add to the A channel; typically in the -1 to 1 range
    +847     * @param addB how much to add to the B channel; typically in the -1 to 1 range
    +848     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +849     * @return a packed float CIELAB color with the requested edits applied to {@code encoded}
    +850     */
    +851    public static float editCIELAB(float encoded, float addL, float addA, float addB, float addAlpha) {
    +852        return editCIELAB(encoded, addL, addA, addB, addAlpha, 1f, 1f, 1f, 1f);
    +853    }
    +854    /**
    +855     * Given a packed float CIELAB color, this edits its L, A, B, and alpha channels by first multiplying each channel
    +856     * by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This
    +857     * means the lightness value {@code L} is multiplied by {@code mulL}, then has {@code addL} added, and then is
    +858     * clamped to the normal range for L (0 to 1). This returns a different float value (of course, the given float
    +859     * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a
    +860     * value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5
    +861     * range, so if you multiply by a small number like {@code 0.25f}, then this will produce a less-saturated color,
    +862     * and if you multiply by a larger number like {@code 4f}, then you will get a much more-saturated color. This
    +863     * clamps the resulting color so it contains in-range L, A, B, and alpha values, but it doesn't guarantee it stays
    +864     * in-gamut.
    +865     * @param encoded a packed float CIELAB color
    +866     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    +867     * @param addA how much to add to the A channel; typically in the -1 to 1 range
    +868     * @param addB how much to add to the B channel; typically in the -1 to 1 range
    +869     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +870     * @param mulL how much to multiply the L channel by; should be non-negative
    +871     * @param mulA how much to multiply the A channel by; usually non-negative (not always)
    +872     * @param mulB how much to multiply the B channel by; usually non-negative (not always)
    +873     * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    +874     * @return a packed float CIELAB color with the requested edits applied to {@code encoded}
    +875     */
    +876    public static float editCIELAB(float encoded, float addL, float addA, float addB, float addAlpha,
    +877                                  float mulL, float mulA, float mulB, float mulAlpha) {
    +878        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +879        float L = (decoded & 0xff) / 255f;
    +880        float A = ((decoded >>> 8 & 0xff) - 127.5f)  * (0.2f / 127.5f);
    +881        float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +882        float alpha = (decoded >>> 25) / 127f;
    +883
    +884        L = Math.min(Math.max(L * mulL + addL, 0f), 1f);
    +885        A = Math.min(Math.max(A * mulA + addA * 2f, -1f), 1f) * 0.5f;
    +886        B = Math.min(Math.max(B * mulB + addB * 2f, -1f), 1f) * 0.5f;
    +887        alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    +888        return clamp(L, A, B, alpha);
    +889    }
    +890
    +891    /**
    +892     * The "L" channel of the given packed float in CIELAB format, which is its lightness; ranges from 0.0f to
    +893     * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
    +894     *
    +895     * @param encoded a color encoded as a packed float, as by {@link #cielab(float, float, float, float)}
    +896     * @return the L value as a float from 0.0f to 1.0f
    +897     */
    +898    public static float channelL(final float encoded)
    +899    {
    +900        return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    +901    }
    +902
    +903    /**
    +904     * The "A" channel of the given packed float in CIELAB format, which when combined with the B channel describes the
    +905     * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or
    +906     * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with
    +907     * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}.
    +908     * @param encoded a color encoded as a packed float, as by {@link #cielab(float, float, float, float)}
    +909     * @return the A value as a float from 0.0f to 1.0f
    +910     */
    +911    public static float channelA(final float encoded)
    +912    {
    +913        return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    +914    }
    +915
    +916    /**
    +917     * The "B" channel of the given packed float in CIELAB format, which when combined with the A channel describes the
    +918     * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more
    +919     * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit
    +920     * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}.
    +921     * @param encoded a color encoded as a packed float, as by {@link #cielab(float, float, float, float)}
    +922     * @return the B value as a float from 0.0f to 1.0f
    +923     */
    +924    public static float channelB(final float encoded)
    +925    {
    +926        return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    +927    }
    +928
    +929    /**
    +930     * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    +931     * start as-is) and 1f (return white), start should be a packed color, as from
    +932     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +933     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +934     * towards white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both
    +935     * chroma of start as-is.
    +936     * @see #darken(float, float) the counterpart method that darkens a float color
    +937     * @param start the starting color as a packed float
    +938     * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    +939     * @return a packed float that represents a color between start and white
    +940     */
    +941    public static float lighten(final float start, final float change) {
    +942        final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    +943        return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
    +944    }
    +945
    +946    /**
    +947     * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    +948     * start as-is) and 1f (return black), start should be a packed color, as from
    +949     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +950     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +951     * towards black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both
    +952     * chroma of start as-is.
    +953     * @see #lighten(float, float) the counterpart method that lightens a float color
    +954     * @param start the starting color as a packed float
    +955     * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    +956     * @return a packed float that represents a color between start and black
    +957     */
    +958    public static float darken(final float start, final float change) {
    +959        final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    +960        return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
    +961    }
    +962
    +963    /**
    +964     * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
    +965     * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
    +966     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +967     * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    +968     * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    +969     * alpha and L of start as-is.
    +970     * @see #lowerA(float, float) the counterpart method that cools a float color
    +971     * @param start the starting color as a packed float
    +972     * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
    +973     * @return a packed float that represents a color between start and a warmer color
    +974     */
    +975    public static float raiseA(final float start, final float change) {
    +976        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +977        return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    +978    }
    +979
    +980    /**
    +981     * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
    +982     * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
    +983     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +984     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +985     * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
    +986     * L of start as-is.
    +987     * @see #raiseA(float, float) the counterpart method that warms a float color
    +988     * @param start the starting color as a packed float
    +989     * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
    +990     * @return a packed float that represents a color between start and a cooler color
    +991     */
    +992    public static float lowerA(final float start, final float change) {
    +993        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +994        return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    +995    }
    +996
    +997    /**
    +998     * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    +999     * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed
    +1000     * color, as from {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +1001     * Colors, and is a little more efficient and clear than using
    +1002     * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
    +1003     * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
    +1004     * @see #lowerB(float, float) the counterpart method that makes a float color less natural
    +1005     * @param start the starting color as a packed float
    +1006     * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
    +1007     * @return a packed float that represents a color between start and a more natural color
    +1008     */
    +1009    public static float raiseB(final float start, final float change) {
    +1010        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +1011        return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    +1012    }
    +1013
    +1014    /**
    +1015     * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    +1016     * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed
    +1017     * color, as from {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +1018     * Colors, and is a little more efficient and clear than using
    +1019     * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more artificial color. Unlike
    +1020     * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
    +1021     * @see #raiseB(float, float) the counterpart method that makes a float color less artificial
    +1022     * @param start the starting color as a packed float
    +1023     * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
    +1024     * @return a packed float that represents a color between start and a more artificial color
    +1025     */
    +1026    public static float lowerB(final float start, final float change) {
    +1027        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +1028        return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    +1029    }
    +1030
    +1031    /**
    +1032     * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    +1033     * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    +1034     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +1035     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +1036     * towards transparent. This won't change the L, A, or B of the color.
    +1037     * @see #fade(float, float) the counterpart method that makes a float color more translucent
    +1038     * @param start the starting color as a packed float
    +1039     * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    +1040     * @return a packed float that represents a color between start and its opaque version
    +1041     */
    +1042    public static float blot(final float start, final float change) {
    +1043        final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    +1044        return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    +1045    }
    +1046
    +1047    /**
    +1048     * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    +1049     * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    +1050     * {@link #cielab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +1051     * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    +1052     * lerp towards transparent. This won't change the L, A, or B of the color.
    +1053     * @see #blot(float, float) the counterpart method that makes a float color more opaque
    +1054     * @param start the starting color as a packed float
    +1055     * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    +1056     * @return a packed float that represents a color between start and transparent
    +1057     */
    +1058    public static float fade(final float start, final float change) {
    +1059        final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    +1060        return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    +1061    }
    +1062
    +1063    /**
    +1064     * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
    +1065     * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    +1066     * from {@link #cielab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone.
    +1067     * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    +1068     * @param start the starting color as a packed float
    +1069     * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    +1070     * @return a packed float that represents a color between start and a desaturated color
    +1071     */
    +1072    public static float dullen(final float start, final float change) {
    +1073        final int s = BitConversion.floatToRawIntBits(start);
    +1074        return cielab((s & 0xFF) / 255f,
    +1075                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    +1076                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    +1077                (s >>> 25) / 127f);
    +1078    }
    +1079
    +1080    /**
    +1081     * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
    +1082     * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    +1083     * from {@link #cielab(float, float, float, float)}. This changes only A and B. This prevents high values for change
    +1084     * from pushing A or B out of the valid range by using {@link #clamp(float, float, float, float)}; this doesn't
    +1085     * actually keep the color in-gamut, but usually rendering code can handle out-of-gamut colors in some way.
    +1086     * Alpha. The alpha never changes. It never changes L either.
    +1087     * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    +1088     * @param start the starting color as a packed float
    +1089     * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    +1090     * @return a packed float that represents a color between start and a saturated color
    +1091     */
    +1092    public static float enrich(final float start, final float change) {
    +1093        final int s = BitConversion.floatToRawIntBits(start);
    +1094        return clamp((s & 0xFF) / 255f,
    +1095                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    +1096                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    +1097                (s >>> 25) / 127f);
    +1098    }
    +1099
    +1100    /**
    +1101     * Given a packed float CIELAB color {@code mainColor} and another CIELAB color that it should be made to contrast with,
    +1102     * gets a packed float CIELAB color with roughly inverted intnsity but the same chromatic channels and opacity (P and T
    +1103     * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
    +1104     * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows
    +1105     * most of the colors this method produces to contrast well as a foreground when displayed on a background of
    +1106     * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the
    +1107     * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
    +1108     * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
    +1109     * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
    +1110     * {@code contrastingColor} without losing its other qualities.
    +1111     * @param mainColor a packed float color, as produced by {@link #cielab(float, float, float, float)}; this is the color that will be adjusted
    +1112     * @param contrastingColor a packed float color, as produced by {@link #cielab(float, float, float, float)}; the adjusted mainColor will contrast with this
    +1113     * @return a different CIELAB packed float color, based on mainColor but with potentially very different lightness
    +1114     */
    +1115    public static float inverseLightness(final float mainColor, final float contrastingColor)
    +1116    {
    +1117        final int bits = BitConversion.floatToRawIntBits(mainColor),
    +1118                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    +1119                L = (bits & 0xff),
    +1120                A = (bits >>> 8 & 0xff),
    +1121                B = (bits >>> 16 & 0xff),
    +1122                cL = (contrastBits & 0xff),
    +1123                cA = (contrastBits >>> 8 & 0xff),
    +1124                cB = (contrastBits >>> 16 & 0xff);
    +1125        if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000)
    +1126            return mainColor;
    +1127        return cielab(cL < 128 ? L * (0.45f / 255f) + 0.5f : 0.5f - L * (0.45f / 255f), A / 255f, B / 255f, 0x1.0p-8f * (bits >>> 24));
    +1128    }
    +1129
    +1130    /**
    +1131     * Given a packed float CIELAB color {@code mainColor} and another CIELAB color that it should be made to contrast
    +1132     * with, gets a packed float CIELAB color with L that should be quite different from {@code contrastingColor}'s L,
    +1133     * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
    +1134     * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
    +1135     * a background of {@code contrastingColor}, or vice versa.
    +1136     * <br>
    +1137     * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    +1138     * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    +1139     * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
    +1140     * @param mainColor a packed CIELAB float color; this is the color that will be adjusted
    +1141     * @param contrastingColor a packed CIELAB float color; the adjusted mainColor will contrast with the I of this
    +1142     * @return a different packed CIELAB float color, based on mainColor but typically with different lightness
    +1143     */
    +1144    public static float differentiateLightness(final float mainColor, final float contrastingColor)
    +1145    {
    +1146        final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    +1147        return BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1);
    +1148    }
    +1149
    +1150    /**
    +1151     * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
    +1152     * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
    +1153     * results in the middle-range of possible lightness.
    +1154     * @param mainColor a packed CIELAB float color
    +1155     * @return a different packed CIELAB float color, with its L channel changed and limited to the correct gamut
    +1156     */
    +1157    public static float offsetLightness(final float mainColor) {
    +1158        final int decoded = BitConversion.floatToRawIntBits(mainColor);
    +1159        return BitConversion.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1);
    +1160    }
    +1161
    +1162    /**
    +1163     * Makes the additive CIELAB color stored in {@code color} cause less of a change when used as a tint, as if it were
    +1164     * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    +1165     * 50% gray, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    +1166     * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    +1167     * @param color a color that should have its tinting effect potentially weakened
    +1168     * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    +1169     * @return a CIELAB float color between gray and {@code color}
    +1170     */
    +1171    public static float lessenChange(final float color, float fraction) {
    +1172        final int e = BitConversion.floatToRawIntBits(color),
    +1173                sL = 0x80, sA = 0x80, sB = 0x80,
    +1174                eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
    +1175        return BitConversion.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF)
    +1176                | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8)
    +1177                | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16)
    +1178                | (eAlpha << 24));
    +1179    }
    +1180
    +1181    /**
    +1182     * Returns true if the given packed float color, as CIELAB, is valid to convert losslessly back to RGBA.
    +1183     * @param packed a packed float color as CIELAB
    +1184     * @return true if the given packed float color can be converted back and forth to RGBA
    +1185     */
    +1186    public static boolean inGamut(final float packed)
    +1187    {
    +1188        final int decoded = BitConversion.floatToRawIntBits(packed);
    +1189        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +1190        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +1191        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +1192        final float x = reverseXYZ(L + A);
    +1193        final float y = reverseXYZ(L);
    +1194        final float z = reverseXYZ(L - B);
    +1195        final float r = +3.2404542f * x + -1.5371385f * y + -0.4985314f * z;
    +1196        if(r <= -0x1p-8f || r >= 0x1.01p0f) return false;
    +1197        final float g = -0.9692660f * x + +1.8760108f * y + +0.0415560f * z;
    +1198        if(g <= -0x1p-8f || g >= 0x1.01p0f) return false;
    +1199        final float b = +0.0556434f * x + -0.2040259f * y + +1.0572252f * z;
    +1200        return (b > -0x1p-8f && b < 0x1.01p0f);
    +1201
    +1202//        final int decoded = BitConversion.floatToRawIntBits(packed);
    +1203//        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +1204//        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +1205//        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +1206//        final float x = reverseXYZ(L + A);
    +1207//        final float y = reverseXYZ(L);
    +1208//        final float z = reverseXYZ(L - B);
    +1209//        boolean ret = true;
    +1210//        final float r = +3.2406f * x + -1.5372f * y + -0.4986f * z;
    +1211////        final float r = +3.2404542f * x + -1.5371385f * y + -0.4985314f * z;
    +1212//        if(r <= -0x1p-8f || r >= 0x1.01p0f) ret = false;
    +1213////        final float g = -0.9689f * x + +1.8758f * y + +0.0415f * z;
    +1214//        final float g = -0.9692660f * x + +1.8760108f * y + +0.0415560f * z;
    +1215//        if(g <= -0x1p-8f || g >= 0x1.01p0f) ret = false;
    +1216////        final float b = +0.0557f * x + -0.2040f * y + +1.0570f * z;
    +1217//        final float b = +0.0556434f * x + -0.2040259f * y + +1.0572252f * z;
    +1218//        ret &= (b > -0x1p-8f && b < 0x1.01p0f);
    +1219//        if(!ret) System.out.printf("L %f, A %f, B %f, x %f, y %f, z %f, r %f, g %f, b %f\n", L, A, B,  x, y, z,  r, g, b);
    +1220//        return ret;
    +1221
    +1222    }
    +1223
    +1224    /**
    +1225     * Returns true if the given CIELAB values are valid to convert losslessly back to RGBA.
    +1226     * @param L lightness, as a float from 0 to 1
    +1227     * @param A cyan-to-red chroma, as a float from 0 to 1
    +1228     * @param B blue-to-yellow chroma, as a float from 0 to 1
    +1229     * @return true if the given packed float color can be converted back and forth to RGBA
    +1230     */
    +1231    public static boolean inGamut(float L, float A, float B)
    +1232    {
    +1233        L = (1f/1.16f)*(L + 0.16f);
    +1234        A = (A - 0.5f) * (0.4f);
    +1235        B = (B - 0.5f);
    +1236        final float x = reverseXYZ(L + A);
    +1237        final float y = reverseXYZ(L);
    +1238        final float z = reverseXYZ(L - B);
    +1239        final float r = +3.2404542f * x + -1.5371385f * y + -0.4985314f * z;
    +1240        if(r < 0f || r > 1.0f) return false;
    +1241        final float g = -0.9692660f * x + +1.8760108f * y + +0.0415560f * z;
    +1242        if(g < 0f || g > 1.0f) return false;
    +1243        final float b = +0.0556434f * x + -0.2040259f * y + +1.0572252f * z;
    +1244        return (b >= 0f && b <= 1.0f);
    +1245    }
    +1246
    +1247    /**
    +1248     * Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if
    +1249     * it isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the L of the color, only bringing A and B
    +1250     * closer to grayscale. Note that this version of limitToGamut() is much slower than Oklab's version, because Oklab
    +1251     * stores its entire gamut as a large constant, while this has to calculate it.
    +1252     * @param packed a packed float color in CIELAB format; often this color is not in-gamut
    +1253     * @return the first color this finds that is between the given CIELAB color and grayscale, and is in-gamut
    +1254     * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
    +1255     */
    +1256    public static float limitToGamut(final float packed) {
    +1257        final int decoded = BitConversion.floatToRawIntBits(packed);
    +1258        final float L = (1f/1.16f)*((decoded & 0xff) / 255f + 0.16f);
    +1259        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +1260        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +1261        final float y = reverseXYZ(L);
    +1262        float A2 = A, B2 = B;
    +1263        for (int attempt = 127; attempt >= 0; attempt--) {
    +1264            final float x = reverseXYZ(L + A2);
    +1265            final float z = reverseXYZ(L - B2);
    +1266            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    +1267            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    +1268            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    +1269            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +1270                break;
    +1271            final float progress = attempt * 0x1p-7f;
    +1272            A2 = (A * progress);
    +1273            B2 = (B * progress);
    +1274        }
    +1275        return cielab(L, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    +1276    }
    +1277
    +1278    /**
    +1279     * Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if it
    +1280     * isn't in-gamut, or returns it as soon as it is in-gamut. Maintains the L of the color, only bringing A and B
    +1281     * closer to grayscale. This always produces an opaque color.
    +1282     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    +1283     * @param A cyan-to-red chroma; will be clamped between 0 and 1 if it isn't already
    +1284     * @param B blue-to-yellow chroma; will be clamped between 0 and 1 if it isn't already
    +1285     * @return the first color this finds that is between the given CIELAB color and grayscale, and is in-gamut
    +1286     * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    +1287     */
    +1288    public static float limitToGamut(float L, float A, float B) {
    +1289        return limitToGamut(L, A, B, 1f);
    +1290    }
    +1291    /**
    +1292     * Iteratively checks whether the given CIELAB color is in-gamut, and either brings the color closer to grayscale if it
    +1293     * isn't in-gamut, or returns it as soon as it is in-gamut. Note that this version of limitToGamut() is much slower
    +1294     * than Oklab's version, because Oklab stores its entire gamut as a large constant, while this has to calculate it.
    +1295     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    +1296     * @param A cyan-to-red chroma; will be clamped between 0 and 1 if it isn't already
    +1297     * @param B blue-to-yellow chroma; will be clamped between 0 and 1 if it isn't already
    +1298     * @param alpha opacity; will be clamped between 0 and 1 if it isn't already
    +1299     * @return the first color this finds that is between the given CIELAB color and grayscale, and is in-gamut
    +1300     * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    +1301     */
    +1302    public static float limitToGamut(float L, float A, float B, float alpha) {
    +1303
    +1304        L = (1f/1.16f)*(Math.min(Math.max(L, 0f), 1f) + 0.16f);
    +1305        A = (Math.min(Math.max(A, 0f), 1f) - 0.5f) * 0.4f;
    +1306        B = (Math.min(Math.max(B, 0f), 1f) - 0.5f);
    +1307        alpha = Math.min(Math.max(alpha, 0f), 1f);
    +1308
    +1309        final float y = reverseXYZ(L);
    +1310        float A2 = A, B2 = B;
    +1311        for (int attempt = 127; attempt >= 0; attempt--) {
    +1312            final float x = reverseXYZ(L + A2);
    +1313            final float z = reverseXYZ(L - B2);
    +1314            final float r = reverseGamma(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z);
    +1315            final float g = reverseGamma(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z);
    +1316            final float b = reverseGamma(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z);
    +1317            if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +1318                break;
    +1319            final float progress = attempt * 0x1p-7f;
    +1320            A2 = (A * progress);
    +1321            B2 = (B * progress);
    +1322        }
    +1323        return cielab(L, A2 * 0.5f + 0.5f, B2 * 0.5f + 0.5f, alpha);
    +1324    }
    +1325
    +1326    /**
    +1327     * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    +1328     * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    +1329     * be different each time this is called, and can be obtained from a random number generator to make the colors more
    +1330     * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    +1331     * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the
    +1332     * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    +1333     * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1,
    +1334     * but only internally for measuring distance).
    +1335     * @param color a packed float color, as produced by {@link #cielab(float, float, float, float)}
    +1336     * @param seed a long seed that should be different on each call; should not be 0
    +1337     * @param variance max amount of difference between the given color and the generated color; always less than 1
    +1338     * @return a generated packed float color that should be at least somewhat different from {@code color}
    +1339     */
    +1340    public static float randomEdit(final float color, long seed, final float variance) {
    +1341        final int decoded = BitConversion.floatToRawIntBits(color);
    +1342        final float L = (decoded & 0xff) / 255f;
    +1343        final float A = ((decoded >>> 8 & 0xff) - 127.5f) *  (0.2f / 127.5f);
    +1344        final float B = ((decoded >>> 16 & 0xff) - 127.5f) * (0.5f / 127.5f);
    +1345        final float limit = variance * variance;
    +1346        float dist, x, y, z;
    +1347        for (int j = 0; j < 50; j++) {
    +1348            x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +1349            y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +1350            z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +1351            seed += 0x9E3779B97F4A7C15L;
    +1352            dist = x * x + y * y + z * z;
    +1353            if(dist <= limit)
    +1354                return clamp(x + L, (A + y) * 0.5f + 0.5f, (B + z) * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    +1355        }
    +1356        return color;
    +1357    }
    +1358
    +1359    /**
    +1360     * Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    +1361     * @param random a Random object (preferably a subclass of Random, like {@link com.github.tommyettinger.random.LaserRandom})
    +1362     * @return a packed float color that is always in-gamut
    +1363     */
    +1364    public static float randomColor(Random random) {
    +1365        float L = random.nextFloat();
    +1366        float A = random.nextFloat();
    +1367        float B = random.nextFloat();
    +1368        while (!inGamut(L, A, B)) {
    +1369            L = random.nextFloat();
    +1370            A = random.nextFloat();
    +1371            B = random.nextFloat();
    +1372        }
    +1373        return cielab(L, A, B, 1f);
    +1374    }
    +1375
    +1376        /**
    +1377         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    +1378         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    +1379         * and EnhancedRandom.
    +1380         * @param random any subclass of juniper's EnhancedRandom, such as a
    +1381         * {@link com.github.tommyettinger.random.DistinctRandom} or
    +1382         * {@link com.github.tommyettinger.random.FourWheelRandom}
    +1383         * @return a packed float color that is always in-gamut
    +1384         */
    +1385    public static float randomizedColor(EnhancedRandom random) {
    +1386        float L = random.nextFloat();
    +1387        float A = random.nextFloat();
    +1388        float B = random.nextFloat();
    +1389        while (!inGamut(L, A, B)) {
    +1390            L = random.nextFloat();
    +1391            A = random.nextFloat();
    +1392            B = random.nextFloat();
    +1393        }
    +1394        return cielab(L, A, B, 1f);
    +1395    }
    +1396
    +1397}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html
    index 9deaca51..07d7667a 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/cielab/GradientTools.html
    @@ -14,252 +14,253 @@
     
    001package com.github.tommyettinger.colorful.pure.cielab;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.Interpolation;
    -005import com.github.tommyettinger.colorful.pure.MathTools;
    -006import com.github.tommyettinger.ds.FloatList;
    -007
    -008/**
    -009 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    -010 * The intent is for the FloatList to be used as a sequence of packed float CIELAB colors. You can create a new
    -011 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    -012 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    -013 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    -014 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    -015 * than two colors. You can also customize each section between colors with
    -016 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    -017 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    -018 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    -019 * <br>
    -020 * This class does some special handling for CIELAB colors.
    -021 */
    -022public class GradientTools {
    -023    /**
    -024     * No need to instantiate.
    -025     */
    -026    private GradientTools(){
    -027    }
    -028
    -029    /**
    -030     * Creates a FloatList gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color
    -031     * {@code end}, taking the specified number of steps and using linear interpolation.
    -032     * This limits individual steps of color to the correct CIELAB gamut, so even interpolations between colors at
    -033     * extreme points in the color space will stay in-gamut.
    -034     * @param start the packed float CIELAB color to start with
    -035     * @param end the packed float CIELAB color to end on
    -036     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -037     * @return a new FloatList that contains the requested gradient
    -038     */
    -039    public static FloatList makeGradient(float start, float end, int steps) {
    -040        return makeGradient(start, end, steps, Interpolation.linear);
    -041    }
    -042    /**
    -043     * Creates a FloatList gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color
    -044     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -045     * This limits individual steps of color to the correct CIELAB gamut, so even interpolations between colors at
    -046     * extreme points in the color space will stay in-gamut.
    -047     * @param start the packed float CIELAB color to start with
    -048     * @param end the packed float CIELAB color to end on
    -049     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -050     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -051     * @return a new FloatList that contains the requested gradient
    -052     */
    -053    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    -054        FloatList appending = new FloatList(steps);
    -055        if(steps <= 0) {
    -056            return appending;
    -057        }
    -058        if(steps == 1) {
    -059            appending.add(start);
    -060            return appending;
    -061        }
    -062        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -063        return appending;
    -064    }
    -065
    -066    /**
    -067     * Appends a gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color {@code end},
    -068     * taking the specified number of steps and using linear Interpolation for how it transitions. This limits
    -069     * individual steps of color to the correct CIELAB gamut, so even interpolations between colors at extreme points in
    -070     * the color space will stay in-gamut.
    -071     * @param appending a FloatList that will be appended to
    -072     * @param start the packed float CIELAB color to start with
    -073     * @param end the packed float CIELAB color to end on
    -074     * @param steps how many steps the gradient should use; usually greater than 2
    -075     * @return {@code appending}, after adding the gradient to the end
    -076     */
    -077    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    -078        return appendGradient(appending, start, end, steps, Interpolation.linear);
    -079    }
    -080    /**
    -081     * Appends a gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color {@code end},
    -082     * taking the specified number of steps and using the specified Interpolation for how it transitions. This limits
    -083     * individual steps of color to the correct CIELAB gamut, so even interpolations between colors at extreme points in
    -084     * the color space will stay in-gamut.
    -085     * @param appending a FloatList that will be appended to
    -086     * @param start the packed float CIELAB color to start with
    -087     * @param end the packed float CIELAB color to end on
    -088     * @param steps how many steps the gradient should use; usually greater than 2
    -089     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -090     * @return {@code appending}, after adding the gradient to the end
    -091     */
    -092    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    -093        if(appending == null)
    -094            return null;
    -095        if(steps <= 0) {
    -096            return appending;
    -097        }
    -098        if(steps == 1) {
    -099            appending.add(start);
    -100            return appending;
    -101        }
    -102        appending.ensureCapacity(steps);
    -103        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -104        return appending;
    -105    }
    -106
    -107    /**
    -108     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses linear
    -109     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -110     * {@code steps} colors.
    -111     * @param appending a FloatList that will be appended to
    -112     * @param steps how many steps the gradient should use; usually greater than 2
    -113     * @param chain an array or varargs of packed float CIELAB colors that this will interpolate through in order
    -114     * @return {@code appending}, after adding the gradient to the end
    -115     */
    -116    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    -117        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -118    }
    -119
    -120    /**
    -121     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses linear
    -122     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -123     * {@code steps} colors.
    -124     * @param appending a FloatList that will be appended to
    -125     * @param steps how many steps the gradient should use; usually greater than 2
    -126     * @param chain a FloatList of packed float CIELAB colors that this will interpolate through in order
    -127     * @return {@code appending}, after adding the gradient to the end
    -128     */
    -129    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    -130        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -131    }
    -132
    -133    /**
    -134     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses the specified
    -135     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -136     * end of {@code appending} and produces a total of {@code steps} colors.
    -137     * @param appending a FloatList that will be appended to
    -138     * @param steps how many steps the gradient should use; usually greater than 2
    -139     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -140     * @param chain a FloatList of packed float CIELAB colors that this will interpolate through in order
    -141     * @return {@code appending}, after adding the gradient to the end
    -142     */
    -143    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    -144        if (appending == null)
    -145            return null;
    -146        if(chain == null)
    -147            return appending;
    -148        if (steps <= 0 || chain.size() == 0) {
    -149            return appending;
    -150        }
    -151        if (steps == 1 || chain.size() == 1) {
    -152            appending.add(chain.first());
    -153            return appending;
    -154        }
    -155        appending.ensureCapacity(steps);
    -156        int limit = steps - 1, splits = chain.size() - 1;
    -157        float step = 1f / steps, change = 0f;
    -158        for (int i = 0; i < limit; i++) {
    -159            float interp = interpolation.apply(change);
    -160            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -161            int idx = (int)splint;
    -162            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint))));
    -163            change += step;
    -164        }
    -165        appending.add(chain.get(splits));
    -166        return appending;
    -167    }
    -168
    -169    /**
    -170     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses the specified
    -171     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -172     * end of {@code appending} and produces a total of {@code steps} colors.
    -173     * @param appending a FloatList that will be appended to
    -174     * @param steps how many steps the gradient should use; usually greater than 2
    -175     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -176     * @param chain an array or varargs of packed float CIELAB colors that this will interpolate through in order
    -177     * @return {@code appending}, after adding the gradient to the end
    -178     */
    -179    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    -180        if (appending == null)
    -181            return null;
    -182        if(chain == null)
    -183            return appending;
    -184        if (steps <= 0 || chain.length == 0) {
    -185            return appending;
    -186        }
    -187        if (steps == 1 || chain.length == 1) {
    -188            appending.add(chain[0]);
    -189            return appending;
    -190        }
    -191        appending.ensureCapacity(steps);
    -192        int limit = steps - 1, splits = chain.length - 1;
    -193        float step = 1f / steps, change = 0f;
    -194        for (int i = 0; i < limit; i++) {
    -195            float interp = interpolation.apply(change);
    -196            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -197            int idx = (int)splint;
    -198            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint))));
    -199            change += step;
    -200        }
    -201        appending.add(chain[splits]);
    -202        return appending;
    -203    }
    -204
    -205    /**
    -206     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    -207     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -208     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -209     * number of steps, it just doesn't append {@code end} in the last step.
    -210     * @param appending a FloatList that will be appended to
    -211     * @param start the packed float CIELAB color to start with
    -212     * @param end the packed float CIELAB color to end just before
    -213     * @param steps how many steps the gradient should use; usually greater than 2
    -214     * @return {@code appending}, after adding the gradient to its end
    -215     */
    -216    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    -217        return appendPartialGradient(appending, start, end, steps, Interpolation.linear);
    -218    }
    -219    /**
    -220     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    -221     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -222     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -223     * number of steps, it just doesn't append {@code end} in the last step.
    -224     * @param appending a FloatList that will be appended to
    -225     * @param start the packed float CIELAB color to start with
    -226     * @param end the packed float CIELAB color to end just before
    -227     * @param steps how many steps the gradient should use; usually greater than 2
    -228     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    -229     * @return {@code appending}, after adding the gradient to its end
    -230     */
    -231    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    -232        if(appending == null)
    -233            return null;
    -234        if(steps <= 0) {
    -235            return appending;
    -236        }
    -237        if(steps == 1) {
    -238            appending.add(start);
    -239            return appending;
    -240        }
    -241        int limit = steps;
    -242        float step = 1f / steps, change = 0f;
    -243        for (int i = 0; i < limit; i++) {
    -244            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(start, end, interpolation.apply(change))));
    -245            change += step;
    -246        }
    -247        return appending;
    -248    }
    -249}
    +004import com.github.tommyettinger.colorful.pure.Interpolations;
    +005import com.github.tommyettinger.colorful.pure.Interpolations.Interpolation;
    +006import com.github.tommyettinger.colorful.pure.MathTools;
    +007import com.github.tommyettinger.ds.FloatList;
    +008
    +009/**
    +010 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    +011 * The intent is for the FloatList to be used as a sequence of packed float CIELAB colors. You can create a new
    +012 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    +013 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    +014 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    +015 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    +016 * than two colors. You can also customize each section between colors with
    +017 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    +018 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    +019 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    +020 * <br>
    +021 * This class does some special handling for CIELAB colors.
    +022 */
    +023public class GradientTools {
    +024    /**
    +025     * No need to instantiate.
    +026     */
    +027    private GradientTools(){
    +028    }
    +029
    +030    /**
    +031     * Creates a FloatList gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color
    +032     * {@code end}, taking the specified number of steps and using linear interpolation.
    +033     * This limits individual steps of color to the correct CIELAB gamut, so even interpolations between colors at
    +034     * extreme points in the color space will stay in-gamut.
    +035     * @param start the packed float CIELAB color to start with
    +036     * @param end the packed float CIELAB color to end on
    +037     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +038     * @return a new FloatList that contains the requested gradient
    +039     */
    +040    public static FloatList makeGradient(float start, float end, int steps) {
    +041        return makeGradient(start, end, steps, Interpolations.linear);
    +042    }
    +043    /**
    +044     * Creates a FloatList gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color
    +045     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    +046     * This limits individual steps of color to the correct CIELAB gamut, so even interpolations between colors at
    +047     * extreme points in the color space will stay in-gamut.
    +048     * @param start the packed float CIELAB color to start with
    +049     * @param end the packed float CIELAB color to end on
    +050     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +051     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +052     * @return a new FloatList that contains the requested gradient
    +053     */
    +054    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    +055        FloatList appending = new FloatList(steps);
    +056        if(steps <= 0) {
    +057            return appending;
    +058        }
    +059        if(steps == 1) {
    +060            appending.add(start);
    +061            return appending;
    +062        }
    +063        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +064        return appending;
    +065    }
    +066
    +067    /**
    +068     * Appends a gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color {@code end},
    +069     * taking the specified number of steps and using linear Interpolation for how it transitions. This limits
    +070     * individual steps of color to the correct CIELAB gamut, so even interpolations between colors at extreme points in
    +071     * the color space will stay in-gamut.
    +072     * @param appending a FloatList that will be appended to
    +073     * @param start the packed float CIELAB color to start with
    +074     * @param end the packed float CIELAB color to end on
    +075     * @param steps how many steps the gradient should use; usually greater than 2
    +076     * @return {@code appending}, after adding the gradient to the end
    +077     */
    +078    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    +079        return appendGradient(appending, start, end, steps, Interpolations.linear);
    +080    }
    +081    /**
    +082     * Appends a gradient from the packed float CIELAB color {@code start} to the packed float CIELAB color {@code end},
    +083     * taking the specified number of steps and using the specified Interpolation for how it transitions. This limits
    +084     * individual steps of color to the correct CIELAB gamut, so even interpolations between colors at extreme points in
    +085     * the color space will stay in-gamut.
    +086     * @param appending a FloatList that will be appended to
    +087     * @param start the packed float CIELAB color to start with
    +088     * @param end the packed float CIELAB color to end on
    +089     * @param steps how many steps the gradient should use; usually greater than 2
    +090     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +091     * @return {@code appending}, after adding the gradient to the end
    +092     */
    +093    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    +094        if(appending == null)
    +095            return null;
    +096        if(steps <= 0) {
    +097            return appending;
    +098        }
    +099        if(steps == 1) {
    +100            appending.add(start);
    +101            return appending;
    +102        }
    +103        appending.ensureCapacity(steps);
    +104        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +105        return appending;
    +106    }
    +107
    +108    /**
    +109     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses linear
    +110     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +111     * {@code steps} colors.
    +112     * @param appending a FloatList that will be appended to
    +113     * @param steps how many steps the gradient should use; usually greater than 2
    +114     * @param chain an array or varargs of packed float CIELAB colors that this will interpolate through in order
    +115     * @return {@code appending}, after adding the gradient to the end
    +116     */
    +117    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    +118        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +119    }
    +120
    +121    /**
    +122     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses linear
    +123     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +124     * {@code steps} colors.
    +125     * @param appending a FloatList that will be appended to
    +126     * @param steps how many steps the gradient should use; usually greater than 2
    +127     * @param chain a FloatList of packed float CIELAB colors that this will interpolate through in order
    +128     * @return {@code appending}, after adding the gradient to the end
    +129     */
    +130    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    +131        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +132    }
    +133
    +134    /**
    +135     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses the specified
    +136     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +137     * end of {@code appending} and produces a total of {@code steps} colors.
    +138     * @param appending a FloatList that will be appended to
    +139     * @param steps how many steps the gradient should use; usually greater than 2
    +140     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +141     * @param chain a FloatList of packed float CIELAB colors that this will interpolate through in order
    +142     * @return {@code appending}, after adding the gradient to the end
    +143     */
    +144    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    +145        if (appending == null)
    +146            return null;
    +147        if(chain == null)
    +148            return appending;
    +149        if (steps <= 0 || chain.size() == 0) {
    +150            return appending;
    +151        }
    +152        if (steps == 1 || chain.size() == 1) {
    +153            appending.add(chain.first());
    +154            return appending;
    +155        }
    +156        appending.ensureCapacity(steps);
    +157        int limit = steps - 1, splits = chain.size() - 1;
    +158        float step = 1f / steps, change = 0f;
    +159        for (int i = 0; i < limit; i++) {
    +160            float interp = interpolation.apply(change);
    +161            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +162            int idx = (int)splint;
    +163            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint))));
    +164            change += step;
    +165        }
    +166        appending.add(chain.get(splits));
    +167        return appending;
    +168    }
    +169
    +170    /**
    +171     * Appends a gradient between several packed float CIELAB colors provided in {@code chain}. This uses the specified
    +172     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +173     * end of {@code appending} and produces a total of {@code steps} colors.
    +174     * @param appending a FloatList that will be appended to
    +175     * @param steps how many steps the gradient should use; usually greater than 2
    +176     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +177     * @param chain an array or varargs of packed float CIELAB colors that this will interpolate through in order
    +178     * @return {@code appending}, after adding the gradient to the end
    +179     */
    +180    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    +181        if (appending == null)
    +182            return null;
    +183        if(chain == null)
    +184            return appending;
    +185        if (steps <= 0 || chain.length == 0) {
    +186            return appending;
    +187        }
    +188        if (steps == 1 || chain.length == 1) {
    +189            appending.add(chain[0]);
    +190            return appending;
    +191        }
    +192        appending.ensureCapacity(steps);
    +193        int limit = steps - 1, splits = chain.length - 1;
    +194        float step = 1f / steps, change = 0f;
    +195        for (int i = 0; i < limit; i++) {
    +196            float interp = interpolation.apply(change);
    +197            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +198            int idx = (int)splint;
    +199            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint))));
    +200            change += step;
    +201        }
    +202        appending.add(chain[splits]);
    +203        return appending;
    +204    }
    +205
    +206    /**
    +207     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    +208     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +209     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +210     * number of steps, it just doesn't append {@code end} in the last step.
    +211     * @param appending a FloatList that will be appended to
    +212     * @param start the packed float CIELAB color to start with
    +213     * @param end the packed float CIELAB color to end just before
    +214     * @param steps how many steps the gradient should use; usually greater than 2
    +215     * @return {@code appending}, after adding the gradient to its end
    +216     */
    +217    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    +218        return appendPartialGradient(appending, start, end, steps, Interpolations.linear);
    +219    }
    +220    /**
    +221     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    +222     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +223     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +224     * number of steps, it just doesn't append {@code end} in the last step.
    +225     * @param appending a FloatList that will be appended to
    +226     * @param start the packed float CIELAB color to start with
    +227     * @param end the packed float CIELAB color to end just before
    +228     * @param steps how many steps the gradient should use; usually greater than 2
    +229     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    +230     * @return {@code appending}, after adding the gradient to its end
    +231     */
    +232    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    +233        if(appending == null)
    +234            return null;
    +235        if(steps <= 0) {
    +236            return appending;
    +237        }
    +238        if(steps == 1) {
    +239            appending.add(start);
    +240            return appending;
    +241        }
    +242        int limit = steps;
    +243        float step = 1f / steps, change = 0f;
    +244        for (int i = 0; i < limit; i++) {
    +245            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(start, end, interpolation.apply(change))));
    +246            change += step;
    +247        }
    +248        return appending;
    +249    }
    +250}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/ColorTools.html
    index 3e959382..757ea75a 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/ColorTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/ColorTools.html
    @@ -233,7 +233,7 @@
     220            C = chromaLimit(H, L) * S;
     221
     222        // Lch to Luv
    -223        float U = MathTools.cos_(H) * C;
    +223        float U = TrigTools.cosTurns(H) * C;
     224        float V = MathTools.sin_(H) * C;
     225
     226        // Luv to XYZ
    @@ -287,7 +287,7 @@
     274            C = chromaLimit(H, L) * S;
     275
     276        // Lch to Luv
    -277        float U = MathTools.cos_(H) * C;
    +277        float U = TrigTools.cosTurns(H) * C;
     278        float V = MathTools.sin_(H) * C;
     279
     280        // Luv to XYZ
    @@ -486,7 +486,7 @@
     473            C = chromaLimit(H, L) * S;
     474
     475        // Lch to Luv
    -476        float U = MathTools.cos_(H) * C;
    +476        float U = TrigTools.cosTurns(H) * C;
     477        float V = MathTools.sin_(H) * C;
     478
     479        // Luv to XYZ
    @@ -535,7 +535,7 @@
     522            C = chromaLimit(H, L) * S;
     523
     524        // Lch to Luv
    -525        float U = MathTools.cos_(H) * C;
    +525        float U = TrigTools.cosTurns(H) * C;
     526        float V = MathTools.sin_(H) * C;
     527
     528        // Luv to XYZ
    @@ -584,7 +584,7 @@
     571            C = chromaLimit(H, L) * S;
     572
     573        // Lch to Luv
    -574        float U = MathTools.cos_(H) * C;
    +574        float U = TrigTools.cosTurns(H) * C;
     575        float V = MathTools.sin_(H) * C;
     576
     577        // Luv to XYZ
    @@ -643,7 +643,7 @@
     630            C = chromaLimit(H, L) * S;
     631
     632        // Lch to Luv
    -633        float U = MathTools.cos_(H) * C;
    +633        float U = TrigTools.cosTurns(H) * C;
     634        float V = MathTools.sin_(H) * C;
     635
     636        // Luv to XYZ
    @@ -692,7 +692,7 @@
     679            C = chromaLimit(H, L) * S;
     680
     681        // Lch to Luv
    -682        float U = MathTools.cos_(H) * C;
    +682        float U = TrigTools.cosTurns(H) * C;
     683        float V = MathTools.sin_(H) * C;
     684
     685        // Luv to XYZ
    @@ -741,7 +741,7 @@
     728            C = chromaLimit(H, L) * S;
     729
     730        // Lch to Luv
    -731        float U = MathTools.cos_(H) * C;
    +731        float U = TrigTools.cosTurns(H) * C;
     732        float V = MathTools.sin_(H) * C;
     733
     734        // Luv to XYZ
    @@ -815,7 +815,7 @@
     802    public static float chromaLimit(final float hue, final float lightness) {
     803        final float h = hue - floor(hue);
     804        float sin = MathTools.sin_(h);
    -805        float cos = MathTools.cos_(h);
    +805        float cos = TrigTools.cosTurns(h);
     806        float sub1 = (lightness + 0.16f) / 1.16f;
     807        sub1 *= sub1 * sub1;
     808        float sub2 = sub1 > epsilon ? sub1 : lightness / kappa;
    @@ -949,857 +949,859 @@
     936     */
     937    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
     938        if (lightness <= 0.001f) {
    -939            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    -940        } else {
    -941            return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    -942        }
    -943    }
    -944
    -945    /**
    -946     * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
    -947     * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details.
    -948     *
    -949     * @param encoded a color as a packed float that can be obtained by {@link #hsluv(float, float, float, float)}
    -950     * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    -951     */
    -952    public static float saturation(final float encoded) {
    -953        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -954        float H = ((decoded & 0xff) / 255f);
    -955        float S = ((decoded >>> 8 & 0xff) / 255f);
    -956        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    -957
    -958        // HSLuv to Lch
    -959        float C;
    -960        if (L > 0.99999f) {
    -961            L = 1;
    -962            C = 0;
    -963        } else if (L < 0.00001f) {
    -964            L = 0;
    -965            C = 0;
    -966        } else
    -967            C = chromaLimit(H, L) * S;
    -968
    -969        // Lch to Luv
    -970        float U = MathTools.cos_(H) * C;
    -971        float V = MathTools.sin_(H) * C;
    -972
    -973        // Luv to XYZ
    -974        float x, y, z;
    -975        if (L < 0.00001f) {
    -976            x = 0;
    -977            y = 0;
    -978            z = 0;
    -979        } else {
    -980            if (L <= 0.08f)
    -981                y = L / kappa;
    -982            else {
    -983                y = (L + 0.16f) / 1.16f;
    -984                y *= y * y;
    -985            }
    -986            float iL = 1f / (13f * L);
    -987            float varU = U * iL + refU;
    -988            float varV = V * iL + refV;
    -989            x = 9 * varU * y / (4 * varV);
    -990            z = (3 * y / varV) - x / 3 - 5 * y;
    -991        }
    -992        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -993        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -994        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -995        float X, Y, W;
    -996        if(g < b) {
    -997            X = b;
    -998            Y = g;
    -999        }
    -1000        else {
    -1001            X = g;
    -1002            Y = b;
    -1003        }
    -1004        if(r < X) {
    -1005            W = r;
    -1006        }
    -1007        else {
    -1008            W = X;
    -1009            X = r;
    -1010        }
    -1011        return X - Math.min(W, Y);
    -1012    }
    -1013
    -1014    /**
    -1015     * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for HSLuv. This
    -1016     * ranges from 0.0f (black) to 1.0f (white).
    -1017     *
    -1018     * @param encoded a packed float HSLuv color
    -1019     * @return the lightness of the given color as HSL would calculate it
    -1020     */
    -1021    public static float lightness(final float encoded) {
    -1022        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -1023        float H = ((decoded & 0xff) / 255f);
    -1024        float S = ((decoded >>> 8 & 0xff) / 255f);
    -1025        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    -1026
    -1027        // HSLuv to Lch
    -1028        float C;
    -1029        if (L > 0.99999f) {
    -1030            L = 1;
    -1031            C = 0;
    -1032        } else if (L < 0.00001f) {
    -1033            L = 0;
    -1034            C = 0;
    -1035        } else
    -1036            C = chromaLimit(H, L) * S;
    -1037
    -1038        // Lch to Luv
    -1039        float U = MathTools.cos_(H) * C;
    -1040        float V = MathTools.sin_(H) * C;
    -1041
    -1042        // Luv to XYZ
    -1043        float x, y, z;
    -1044        if (L < 0.00001f) {
    -1045            x = 0;
    -1046            y = 0;
    -1047            z = 0;
    -1048        } else {
    -1049            if (L <= 0.08f)
    -1050                y = L / kappa;
    -1051            else {
    -1052                y = (L + 0.16f) / 1.16f;
    -1053                y *= y * y;
    -1054            }
    -1055            float iL = 1f / (13f * L);
    -1056            float varU = U * iL + refU;
    -1057            float varV = V * iL + refV;
    -1058            x = 9 * varU * y / (4 * varV);
    -1059            z = (3 * y / varV) - x / 3 - 5 * y;
    -1060        }
    -1061        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -1062        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -1063        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -1064        float X, Y, W;
    -1065        if(g < b) {
    -1066            X = b;
    -1067            Y = g;
    -1068        }
    -1069        else {
    -1070            X = g;
    -1071            Y = b;
    -1072        }
    -1073        if(r < X) {
    -1074            W = r;
    -1075        }
    -1076        else {
    -1077            W = X;
    -1078            X = r;
    -1079        }
    -1080        float d = X - Math.min(W, Y);
    -1081        return X * (1f - 0.5f * d / (X + 1e-10f));
    -1082    }
    -1083
    -1084    /**
    -1085     * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    -1086     * to 1f (exclusive, red and approaching purple if decreased).
    -1087     *
    -1088     * @param encoded a color as a packed float that can be obtained by {@link #hsluv(float, float, float, float)}
    -1089     * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    -1090     * eventually to purple before looping back to almost the same red (1.0, exclusive)
    -1091     */
    -1092    public static float hue(final float encoded) {
    -1093        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -1094        float H = ((decoded & 0xff) / 255f);
    -1095        float S = ((decoded >>> 8 & 0xff) / 255f);
    -1096        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    -1097
    -1098        // HSLuv to Lch
    -1099        float C;
    -1100        if (L > 0.99999f) {
    -1101            L = 1;
    -1102            C = 0;
    -1103        } else if (L < 0.00001f) {
    -1104            L = 0;
    -1105            C = 0;
    -1106        } else
    -1107            C = chromaLimit(H, L) * S;
    -1108
    -1109        // Lch to Luv
    -1110        float U = MathTools.cos_(H) * C;
    -1111        float V = MathTools.sin_(H) * C;
    -1112
    -1113        // Luv to XYZ
    -1114        float x, y, z;
    -1115        if (L < 0.00001f) {
    -1116            x = 0;
    -1117            y = 0;
    -1118            z = 0;
    -1119        } else {
    -1120            if (L <= 0.08f)
    -1121                y = L / kappa;
    -1122            else {
    -1123                y = (L + 0.16f) / 1.16f;
    -1124                y *= y * y;
    -1125            }
    -1126            float iL = 1f / (13f * L);
    -1127            float varU = U * iL + refU;
    -1128            float varV = V * iL + refV;
    -1129            x = 9 * varU * y / (4 * varV);
    -1130            z = (3 * y / varV) - x / 3 - 5 * y;
    -1131        }
    -1132        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -1133        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -1134        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -1135        float X, Y, Z, W;
    -1136        if(g < b) {
    -1137            X = b;
    -1138            Y = g;
    -1139            Z = -1f;
    -1140            W = 2f / 3f;
    -1141        }
    -1142        else {
    -1143            X = g;
    -1144            Y = b;
    -1145            Z = 0f;
    -1146            W = -1f / 3f;
    -1147        }
    -1148        if(r < X) {
    -1149            Z = W;
    -1150            W = r;
    -1151        }
    -1152        else {
    -1153            W = X;
    -1154            X = r;
    -1155        }
    -1156        float d = X - Math.min(W, Y);
    -1157        return Math.abs(Z + (W - Y) / (6f * d + 1e-10f));
    -1158    }
    -1159    /**
    -1160     * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    -1161     * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not HSLuv! Takes
    -1162     * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    -1163     * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is likely to be
    -1164     * different from the result of {@code basis} unless hue, saturation, lightness, and opacity are all 0.
    -1165     * This won't allocate any objects.
    -1166     * <br>
    -1167     * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    -1168     * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    -1169     * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    -1170     * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    -1171     * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    -1172     *
    -1173     * @param basis      a packed float color that will be used as the starting point to make the next color
    -1174     * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    -1175     * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    -1176     * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    -1177     * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    -1178     * @return a float encoding a variation of basis with the given changes
    -1179     */
    -1180    public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    -1181        final int decoded = BitConversion.floatToRawIntBits(basis);
    -1182        final float li = Math.min(Math.max(light + reverseLight((decoded >>> 16 & 0xff) / 255f), 0f), 1f);
    -1183        opacity = Math.min(Math.max(opacity + (decoded >>> 25) / 127f, 0f), 1f);
    -1184        if (li <= 0.001f)
    -1185            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000));
    -1186        float H = ((decoded & 0xff) / 255f);
    -1187        float S = ((decoded >>> 8 & 0xff) / 255f);
    -1188        float L = li;
    -1189//        float L = (1f/1.16f)*(li + 0.16f);
    -1190
    -1191        // HSLuv to Lch
    -1192        float C;
    -1193        if (L > 0.99999f) {
    -1194            L = 1;
    -1195            C = 0;
    -1196        } else
    -1197            C = chromaLimit(H, L) * S;
    -1198
    -1199        // Lch to Luv
    -1200        float U = MathTools.cos_(H) * C;
    -1201        float V = MathTools.sin_(H) * C;
    -1202
    -1203        // Luv to XYZ
    -1204        float x, y, z;
    -1205        if (L <= 0.08f)
    -1206            y = L / kappa;
    -1207        else {
    -1208            y = (L + 0.16f) / 1.16f;
    -1209            y *= y * y;
    -1210        }
    -1211        float iL = 1f / (13f * L);
    -1212        float varU = U * iL + refU;
    -1213        float varV = V * iL + refV;
    -1214        x = 9 * varU * y / (4 * varV);
    -1215        z = (3 * y / varV) - x / 3 - 5 * y;
    -1216        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    -1217        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    -1218        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    -1219        float X, Y, Z, W;
    -1220        if(g < b) {
    -1221            X = b;
    -1222            Y = g;
    -1223            Z = -1f;
    -1224            W = 2f / 3f;
    -1225        }
    -1226        else {
    -1227            X = g;
    -1228            Y = b;
    -1229            Z = 0f;
    -1230            W = -1f / 3f;
    -1231        }
    -1232        if(r < X) {
    -1233            Z = W;
    -1234            W = r;
    -1235        }
    -1236        else {
    -1237            W = X;
    -1238            X = r;
    -1239        }
    -1240        final float d = X - Math.min(W, Y);
    -1241        final float lum = X * (1f - 0.5f * d / (X + 1e-10f));
    -1242        hue += Math.abs(Z + (W - Y) / (6f * d + 1e-10f)) + 1f;
    -1243        saturation += (X - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    -1244        return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    -1245    }
    -1246
    -1247
    -1248    /**
    -1249     * Given a packed float HSLuv color, this edits its H, S, L, and alpha channels by adding the corresponding "add"
    -1250     * parameter and then clamping. This returns a different float value (of course, the given float can't be edited
    -1251     * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. H is wrapped, while S,
    -1252     * L, and alpha are clamped.
    -1253     * @param encoded a packed float HSLuv color
    -1254     * @param addH how much to add to the H channel; typically in the -1 to 1 range
    -1255     * @param addS how much to add to the S channel; typically in the -1 to 1 range
    -1256     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    -1257     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -1258     * @return a packed float HSLuv color with the requested edits applied to {@code encoded}
    -1259     */
    -1260    public static float editHSLuv(float encoded, float addH, float addS, float addL, float addAlpha) {
    -1261        return editHSLuv(encoded, addH, addS, addL, addAlpha, 1f, 1f, 1f, 1f);
    -1262    }
    -1263    /**
    -1264     * Given a packed float HSLuv color, this edits its H, S, L, and alpha channels by first multiplying each channel
    -1265     * by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping (this
    -1266     * wraps H instead of clamping it). This means the lightness value {@code L} is multiplied by {@code mulL}, then has
    -1267     * {@code addL} added, and then is clamped to the normal range for L (0 to 1). This returns a different float value
    -1268     * (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want
    -1269     * to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change. You can multiply S by 0 to make
    -1270     * a grayscale color, or by a large value to make any non-grayscale color more vibrant. Multiplying H generally
    -1271     * isn't very useful, but adding to H can be used to do hue cycling (because H wraps).
    -1272     * @param encoded a packed float HSLuv color
    -1273     * @param addH how much to add to the H channel; typically in the -1 to 1 range
    -1274     * @param addS how much to add to the S channel; typically in the -1 to 1 range
    -1275     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    -1276     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -1277     * @param mulH how much to multiply the H channel by; should be non-negative (not always)
    -1278     * @param mulS how much to multiply the S channel by; usually non-negative
    -1279     * @param mulL how much to multiply the L channel by; usually non-negative (not always)
    -1280     * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    -1281     * @return a packed float HSLuv color with the requested edits applied to {@code encoded}
    -1282     */
    -1283    public static float editHSLuv(float encoded, float addH, float addS, float addL, float addAlpha,
    -1284                                  float mulH, float mulS, float mulL, float mulAlpha) {
    -1285        final int decoded = BitConversion.floatToRawIntBits(encoded);
    -1286        float H = (decoded & 0xff) / 255f;
    -1287        float S = (decoded >>> 8 & 0xff) / 255f;
    -1288        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    -1289        float alpha = (decoded >>> 25) / 127f;
    -1290
    -1291        H = H * mulH + addH;
    -1292        H -= floor(H);
    -1293        S = Math.min(Math.max(S * mulS + addS, 0f), 1f);
    -1294        L = Math.min(Math.max(L * mulL + addL, 0f), 1f);
    -1295        alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    -1296        return hsluv(H, S, L, alpha);
    -1297    }
    -1298
    -1299    /**
    -1300     * The "H" channel of the given packed float in HSLuv format, which is its hue; ranges from 0.0f to 1.0f .
    -1301     * You can edit the H of a color with {@link #rotateH(float, float)}.
    -1302     *
    -1303     * @param encoded a color encoded as a packed float, as by {@link #hsluv(float, float, float, float)}
    -1304     * @return the H value as a float from 0.0f to 1.0f
    -1305     */
    -1306    public static float channelH(final float encoded)
    -1307    {
    -1308        return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    -1309    }
    -1310
    -1311    /**
    -1312     * The "S" channel of the given packed float in HSLuv format, which is its saturation; ranges from 0.0f to
    -1313     * 1.0f . You can edit the S of a color with {@link #enrich(float, float)} and {@link #dullen(float, float)}.
    -1314     * @param encoded a color encoded as a packed float, as by {@link #hsluv(float, float, float, float)}
    -1315     * @return the S value as a float from 0.0f to 1.0f
    -1316     */
    -1317    public static float channelS(final float encoded)
    -1318    {
    -1319        return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    -1320    }
    -1321
    -1322    /**
    -1323     * The "L" channel of the given packed float in HSLuv format, which is its lightness; ranges from 0.0f to
    -1324     * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
    -1325     *
    -1326     * @param encoded a color encoded as a packed float, as by {@link #hsluv(float, float, float, float)}
    -1327     * @return the L value as a float from 0.0f to 1.0f
    -1328     */
    -1329    public static float channelL(final float encoded)
    -1330    {
    -1331        return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    -1332    }
    -1333
    -1334    /**
    -1335     * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    -1336     * start as-is) and 1f (return white), start should be a packed color, as from
    -1337     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -1338     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -1339     * towards white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha, hue, and
    -1340     * saturation of start as-is.
    -1341     * @see #darken(float, float) the counterpart method that darkens a float color
    -1342     * @param start the starting color as a packed float
    -1343     * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    -1344     * @return a packed float that represents a color between start and white
    -1345     */
    -1346    public static float lighten(final float start, final float change) {
    -1347        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -1348        return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    -1349    }
    -1350
    -1351    /**
    -1352     * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    -1353     * start as-is) and 1f (return black), start should be a packed color, as from
    -1354     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -1355     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -1356     * towards black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha, hue, and
    -1357     * saturation of start as-is.
    -1358     * @see #lighten(float, float) the counterpart method that lightens a float color
    -1359     * @param start the starting color as a packed float
    -1360     * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    -1361     * @return a packed float that represents a color between start and black
    -1362     */
    -1363    public static float darken(final float start, final float change) {
    -1364        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -1365        return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    -1366    }
    -1367
    -1368    /**
    -1369     * Moves the color of {@code start} away from grayscale by change (saturating the color). While change
    -1370     * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    -1371     * from {@link #hsluv(float, float, float, float)}. This changes only S, and won't change hue, lightness, or alpha.
    -1372     * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    -1373     * @param start the starting color as a packed float
    -1374     * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    -1375     * @return a packed float that represents a color between start and a saturated color
    -1376     */
    -1377    public static float enrich(final float start, final float change) {
    -1378        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -1379        return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    -1380    }
    -1381
    -1382    /**
    -1383     * Brings the color of {@code start} closer to grayscale by {@code change} (desaturating the color). While
    -1384     * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    -1385     * from {@link #hsluv(float, float, float, float)}. This changes only S, and won't change hue, lightness, or alpha.
    -1386     * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    -1387     * @param start the starting color as a packed float
    -1388     * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    -1389     * @return a packed float that represents a color between start and a desaturated color
    -1390     */
    -1391    public static float dullen(final float start, final float change) {
    -1392        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -1393        return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    -1394    }
    -1395
    -1396    /**
    -1397     * Cycles the hue of the packed float color by change. If change is 0f, this returns start as-is. If change is
    -1398     * positive, this rotates from red to orange to yellow to green, and so on. If change is negative, this instead
    -1399     * rotates from green to yellow to orange to red.  A change value is typically between -1f and 1f; if change is
    -1400     * exactly an integer, then this will wrap around in a perfect circle and produce no change. The start value should
    -1401     * be a packed color, as from {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations
    -1402     * of temporary Colors. This only changes H, and won't change saturation, lightness, or alpha.
    -1403     * @param start the starting color as a packed float
    -1404     * @param change how much to rotate hue by, as a float typically between -1 and 1; further from 0 rotates more
    -1405     * @return a packed float that represents a color like start but with a rotated hue
    -1406     */
    -1407    public static float rotateH(final float start, final float change) {
    -1408        final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    -1409        return BitConversion.intBitsToFloat(((int) (i + (256f * change)) & 0xFF) | other);
    -1410    }
    -1411
    -1412    /**
    -1413     * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    -1414     * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    -1415     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -1416     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -1417     * towards transparent. This won't change the H, S, or L of the color.
    -1418     * @see #fade(float, float) the counterpart method that makes a float color more translucent
    -1419     * @param start the starting color as a packed float
    -1420     * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    -1421     * @return a packed float that represents a color between start and its opaque version
    -1422     */
    -1423    public static float blot(final float start, final float change) {
    -1424        final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    -1425        return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    -1426    }
    -1427
    -1428    /**
    -1429     * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    -1430     * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    -1431     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -1432     * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    -1433     * lerp towards transparent. This won't change the H, S, or L of the color.
    -1434     * @see #blot(float, float) the counterpart method that makes a float color more opaque
    -1435     * @param start the starting color as a packed float
    -1436     * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    -1437     * @return a packed float that represents a color between start and transparent
    -1438     */
    -1439    public static float fade(final float start, final float change) {
    -1440        final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    -1441        return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    -1442    }
    -1443
    -1444    /**
    -1445     * Given a packed float HSLuv color {@code mainColor} and another HSLuv color that it should be made to contrast
    -1446     * with, gets a packed float HSLuv color with roughly inverted lightness but the same hue, saturation, and alpha.
    -1447     * This won't ever produce black or other very dark colors, and also has a gap in the range it produces for
    -1448     * lightness values between 0.5 and 0.55. That allows most of the colors this method produces to contrast well as a
    -1449     * foreground when displayed on a background of {@code contrastingColor}, or vice versa. This will leave the
    -1450     * lightness unchanged if the hues of the contrastingColor and those of the mainColor are already very different.
    -1451     * This has nothing to do with the contrast channel of the tweak in ColorfulBatch; where that part of the tweak can
    -1452     * make too-similar lightness values further apart by just a little, this makes a modification on {@code mainColor}
    -1453     * to maximize its lightness difference from {@code contrastingColor} without losing its other qualities.
    -1454     * @param mainColor a packed float color, as produced by {@link #hsluv(float, float, float, float)}; this is the color that will be adjusted
    -1455     * @param contrastingColor a packed float color, as produced by {@link #hsluv(float, float, float, float)}; the adjusted mainColor will contrast with this
    -1456     * @return a different HSLuv packed float color, based on mainColor but with potentially very different lightness
    -1457     */
    -1458    public static float inverseLightness(final float mainColor, final float contrastingColor)
    -1459    {
    -1460        final int bits = BitConversion.floatToRawIntBits(mainColor),
    -1461                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    -1462                H = (bits & 0xff),
    -1463//                S = (bits >>> 8 & 0xff),
    -1464                L = (bits >>> 16 & 0xff),
    -1465                cH = (contrastBits & 0xff),
    -1466//                cS = (contrastBits >>> 8 & 0xff),
    -1467                cL = (contrastBits >>> 16 & 0xff);
    -1468        if(Math.abs(H - cH) >= 90)
    -1469            return mainColor;
    -1470        return BitConversion.intBitsToFloat((bits & 0xFE00FFFF) | (int) (cL < 128 ? L * 0.45f + 128 : 128 - L * 0.45f) << 16);
    -1471    }
    -1472
    -1473    /**
    -1474     * Given a packed float HSLuv color {@code mainColor} and another HSLuv color that it should be made to contrast
    -1475     * with, gets a packed float HSLuv color with L that should be quite different from {@code contrastingColor}'s L,
    -1476     * but the same hue, saturation, and opacity. This allows most of the colors this method produces to contrast well
    -1477     * as a foreground when displayed on a background of {@code contrastingColor}, or vice versa.
    -1478     * <br>
    -1479     * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    -1480     * change the lightness of mainColor when the two given colors have close lightness but distant hues. Because it
    -1481     * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
    -1482     * @param mainColor a packed HSLuv float color; this is the color that will be adjusted
    -1483     * @param contrastingColor a packed HSLuv float color; the adjusted mainColor will contrast with the L of this
    -1484     * @return a different packed HSLuv float color, based on mainColor but typically with different lightness
    -1485     */
    -1486    public static float differentiateLightness(final float mainColor, final float contrastingColor)
    -1487    {
    -1488        final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    -1489        return BitConversion.intBitsToFloat((main & 0xFE00FFFF) | ((contrast >>> 16) + 128 & 0xFF) + (main >>> 16 & 0xFF) >>> 1);
    -1490    }
    -1491
    -1492    /**
    -1493     * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
    -1494     * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
    -1495     * results in the middle-range of possible lightness.
    -1496     * <br>
    -1497     * Calling {@code offsetLightness(mainColor)} is the same as calling
    -1498     * {@code ColorTools.differentiateLightness(mainColor, mainColor)}.
    -1499     * @param mainColor a packed HSLuv float color
    -1500     * @return a different packed HSLuv float color, with its L channel changed.
    -1501     */
    -1502    public static float offsetLightness(final float mainColor) {
    -1503        final int decoded = BitConversion.floatToRawIntBits(mainColor);
    -1504        return BitConversion.intBitsToFloat((decoded & 0xFE00FFFF) | ((decoded >>> 16) + 128 & 0xFF) + (decoded >>> 16 & 0xFF) >>> 1);
    -1505    }
    -1506
    -1507    /**
    -1508     * Makes the additive HSLuv color stored in {@code color} cause less of a change when used as a tint, as if it were
    -1509     * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    -1510     * returns {@code Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    -1511     * meant for things like area of effect abilities that make smaller color changes toward their periphery. This only
    -1512     * affects the saturation and lightness of the color; its hue and alpha are unchanged.
    -1513     * @param color a color that should have its tinting effect potentially weakened
    -1514     * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    -1515     * @return a HSLuv float color between gray and {@code color}
    -1516     */
    -1517    public static float lessenChange(final float color, float fraction) {
    -1518        final int e = BitConversion.floatToRawIntBits(color),
    -1519                sS = 0x80, sL = 0x80,
    -1520                eH = (e & 0xFF), eS = (e >>> 8) & 0xFF, eL = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
    -1521        return BitConversion.intBitsToFloat(eH
    -1522                | (((int) (sS + fraction * (eS - sS)) & 0xFF) << 8)
    -1523                | (((int) (sL + fraction * (eL - sL)) & 0xFF) << 16)
    -1524                | (eAlpha << 24));
    -1525    }
    -1526
    -1527    /**
    -1528     * Returns true always; HSLuv colors are always in-gamut.
    -1529     * @param packed a packed float color as HSLuv
    -1530     * @return true
    -1531     */
    -1532    public static boolean inGamut(final float packed)
    -1533    {
    -1534        return true;
    -1535    }
    -1536
    -1537    /**
    -1538     * Returns true if S and L are each between 0 and 1; if valid, HSLuv colors are always in-gamut.
    -1539     * @param H hue, as an unbounded float
    -1540     * @param S saturation, as a float from 0 to 1
    -1541     * @param L lightness, as a float from 0 to 1
    -1542     * @return true if S and L are both between 0 and 1
    -1543     */
    -1544    public static boolean inGamut(float H, float S, float L)
    -1545    {
    -1546        return (S >= 0f && S <= 1.0f && L >= 0f && L <= 1.0f);
    -1547    }
    -1548
    -1549    /**
    -1550     * Returns its argument unchanged; HSLuv colors are always in-gamut.
    -1551     * @param packed a packed float color in HSLuv format
    -1552     * @return {@code packed}, unchanged
    -1553     */
    -1554    public static float limitToGamut(final float packed) {
    -1555        return packed;
    -1556    }
    -1557
    -1558    /**
    -1559     * Identical to calling {@link #clamp(float, float, float, float)} with 1f as its last parameter.
    -1560     * @param H hue; will be wrapped between 0 and 1
    -1561     * @param S saturation; will be clamped between 0 and 1 if it isn't already
    -1562     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    -1563     * @return an HSLuv color with the specified channel values, wrapped or clamped as appropriate
    -1564     */
    -1565    public static float limitToGamut(float H, float S, float L) {
    -1566        return clamp(H - floor(H), S, L, 1f);
    -1567    }
    -1568    /**
    -1569     * Identical to calling {@link #clamp(float, float, float, float)} with 1f as its last parameter.
    -1570     * @param H hue; will be wrapped between 0 and 1
    -1571     * @param S saturation; will be clamped between 0 and 1 if it isn't already
    -1572     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    -1573     * @param alpha opacity; will be clamped between 0 and 1 if it isn't already
    -1574     * @return an HSLuv color with the specified channel values, wrapped or clamped as appropriate
    -1575     */
    -1576    public static float limitToGamut(float H, float S, float L, float alpha) {
    -1577        return clamp(H, S, L, alpha);
    -1578    }
    -1579
    -1580    /**
    -1581     * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    -1582     * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    -1583     * be different each time this is called, and can be obtained from a random number generator to make the colors more
    -1584     * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    -1585     * produce two similar colors in a row unless variance is very small. The variance affects the H, S, and L of the
    -1586     * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    -1587     * isn't greater than the variance.
    -1588     * @param color a packed float color, as produced by {@link #hsluv(float, float, float, float)}
    -1589     * @param seed a long seed that should be different on each call; should not be 0
    -1590     * @param variance max amount of difference between the given color and the generated color; always less than 1
    -1591     * @return a generated packed float color that should be at least somewhat different from {@code color}
    -1592     */
    -1593    public static float randomEdit(final float color, long seed, final float variance) {
    -1594        final int decoded = BitConversion.floatToRawIntBits(color);
    -1595        float H = (decoded & 0xff) / 255f;
    -1596        float S = (decoded >>> 8 & 0xff) / 255f;
    -1597        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    -1598        final float limit = variance * variance;
    -1599        float dist, x, y, z;
    -1600        for (int j = 0; j < 50; j++) {
    -1601            x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -1602            y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -1603            z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -1604            seed += 0x9E3779B97F4A7C15L;
    -1605            dist = x * x + y * y + z * z;
    -1606            if(dist <= limit)
    -1607                return clamp(H + x, S + y, L + z, (decoded >>> 25) / 127f);
    -1608        }
    -1609        return color;
    -1610    }
    -1611
    -1612    /**
    -1613     * Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    -1614     * @param random a Random object (preferably a subclass of Random, like
    -1615     * {@link com.github.tommyettinger.random.LaserRandom})
    -1616     * @return a packed float color that is always in-gamut
    -1617     */
    -1618    public static float randomColor(Random random) {
    -1619        return hsluv(random.nextFloat(), random.nextFloat(), random.nextFloat(), 1f);
    -1620    }
    -1621
    -1622    /**
    -1623     * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    -1624     * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    -1625     * and EnhancedRandom.
    -1626     * @param random any subclass of juniper's EnhancedRandom, such as a
    -1627     * {@link com.github.tommyettinger.random.DistinctRandom} or
    -1628     * {@link com.github.tommyettinger.random.FourWheelRandom}
    -1629     * @return a packed float color that is always in-gamut
    -1630     */
    -1631    public static float randomizedColor(EnhancedRandom random) {
    -1632        return hsluv(random.nextFloat(), random.nextFloat(), random.nextFloat(), 1f);
    -1633    }
    -1634    /**
    -1635     * Interpolates from the packed float color start towards end by change. Both start and end should be packed colors,
    -1636     * as from {@link #hsluv(float, float, float, float)}, and change can be between 0f (keep start) and 1f (only use
    -1637     * end). Both start and end must use HSLuv. This is a good way to reduce allocations of temporary Colors.
    -1638     * @param start the starting color as a packed float
    -1639     * @param end the target color as a packed float
    -1640     * @param change how much to go from start toward end, as a float between 0 and 1; higher means closer to end
    -1641     * @return a packed float that represents a color between start and end
    -1642     */
    -1643    public static float lerpFloatColors(final float start, final float end, float change) {
    -1644        final int s = BitConversion.floatToRawIntBits(start), e = BitConversion.floatToRawIntBits(end),
    -1645                hs = (s & 0xFF), ss = (s >>> 8) & 0xFF, ls = (s >>> 16) & 0xFF, as = s >>> 24 & 0xFE,
    -1646                he = (e & 0xFF), se = (e >>> 8) & 0xFF, le = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
    -1647        float Hs = hs / 255f, Cs, Ls;
    -1648        if (ls == 255) {
    -1649            Ls = 1f;
    -1650            Cs = 0f;
    -1651        } else if (ls == 0) {
    -1652            Ls = 0f;
    -1653            Cs = 0f;
    -1654        } else {
    -1655            Ls = ls / 255f;
    -1656            Cs = chromaLimit(Hs, Ls) * (ss / 255f);
    -1657        }
    -1658        // Lch to Luv
    -1659        float Us = MathTools.cos_(Hs) * Cs;
    -1660        float Vs = MathTools.sin_(Hs) * Cs;
    -1661
    -1662        float He = he / 255f, Ce, Le;
    -1663        if (le == 255) {
    -1664            Le = 1f;
    -1665            Ce = 0f;
    -1666        } else if (le == 0) {
    -1667            Le = 0f;
    -1668            Ce = 0f;
    -1669        } else {
    -1670            Le = le / 255f;
    -1671            Ce = chromaLimit(He, Le) * (se / 255f);
    -1672        }
    -1673        // Lch to Luv
    -1674        float Ue = TrigTools.cosTurns(He) * Ce;
    -1675        float Ve = TrigTools.sinTurns(He) * Ce;
    -1676
    -1677        float H, S, L, U, V;
    +939            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000));
    +940        } else if (lightness >= 0.999f) {
    +941            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x00FF0000);
    +942        } else {
    +943            return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    +944        }
    +945    }
    +946
    +947    /**
    +948     * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
    +949     * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details.
    +950     *
    +951     * @param encoded a color as a packed float that can be obtained by {@link #hsluv(float, float, float, float)}
    +952     * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    +953     */
    +954    public static float saturation(final float encoded) {
    +955        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +956        float H = ((decoded & 0xff) / 255f);
    +957        float S = ((decoded >>> 8 & 0xff) / 255f);
    +958        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    +959
    +960        // HSLuv to Lch
    +961        float C;
    +962        if (L > 0.99999f) {
    +963            L = 1;
    +964            C = 0;
    +965        } else if (L < 0.00001f) {
    +966            L = 0;
    +967            C = 0;
    +968        } else
    +969            C = chromaLimit(H, L) * S;
    +970
    +971        // Lch to Luv
    +972        float U = TrigTools.cosTurns(H) * C;
    +973        float V = MathTools.sin_(H) * C;
    +974
    +975        // Luv to XYZ
    +976        float x, y, z;
    +977        if (L < 0.00001f) {
    +978            x = 0;
    +979            y = 0;
    +980            z = 0;
    +981        } else {
    +982            if (L <= 0.08f)
    +983                y = L / kappa;
    +984            else {
    +985                y = (L + 0.16f) / 1.16f;
    +986                y *= y * y;
    +987            }
    +988            float iL = 1f / (13f * L);
    +989            float varU = U * iL + refU;
    +990            float varV = V * iL + refV;
    +991            x = 9 * varU * y / (4 * varV);
    +992            z = (3 * y / varV) - x / 3 - 5 * y;
    +993        }
    +994        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +995        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +996        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +997        float X, Y, W;
    +998        if(g < b) {
    +999            X = b;
    +1000            Y = g;
    +1001        }
    +1002        else {
    +1003            X = g;
    +1004            Y = b;
    +1005        }
    +1006        if(r < X) {
    +1007            W = r;
    +1008        }
    +1009        else {
    +1010            W = X;
    +1011            X = r;
    +1012        }
    +1013        return X - Math.min(W, Y);
    +1014    }
    +1015
    +1016    /**
    +1017     * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for HSLuv. This
    +1018     * ranges from 0.0f (black) to 1.0f (white).
    +1019     *
    +1020     * @param encoded a packed float HSLuv color
    +1021     * @return the lightness of the given color as HSL would calculate it
    +1022     */
    +1023    public static float lightness(final float encoded) {
    +1024        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +1025        float H = ((decoded & 0xff) / 255f);
    +1026        float S = ((decoded >>> 8 & 0xff) / 255f);
    +1027        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    +1028
    +1029        // HSLuv to Lch
    +1030        float C;
    +1031        if (L > 0.99999f) {
    +1032            L = 1;
    +1033            C = 0;
    +1034        } else if (L < 0.00001f) {
    +1035            L = 0;
    +1036            C = 0;
    +1037        } else
    +1038            C = chromaLimit(H, L) * S;
    +1039
    +1040        // Lch to Luv
    +1041        float U = TrigTools.cosTurns(H) * C;
    +1042        float V = MathTools.sin_(H) * C;
    +1043
    +1044        // Luv to XYZ
    +1045        float x, y, z;
    +1046        if (L < 0.00001f) {
    +1047            x = 0;
    +1048            y = 0;
    +1049            z = 0;
    +1050        } else {
    +1051            if (L <= 0.08f)
    +1052                y = L / kappa;
    +1053            else {
    +1054                y = (L + 0.16f) / 1.16f;
    +1055                y *= y * y;
    +1056            }
    +1057            float iL = 1f / (13f * L);
    +1058            float varU = U * iL + refU;
    +1059            float varV = V * iL + refV;
    +1060            x = 9 * varU * y / (4 * varV);
    +1061            z = (3 * y / varV) - x / 3 - 5 * y;
    +1062        }
    +1063        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +1064        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +1065        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +1066        float X, Y, W;
    +1067        if(g < b) {
    +1068            X = b;
    +1069            Y = g;
    +1070        }
    +1071        else {
    +1072            X = g;
    +1073            Y = b;
    +1074        }
    +1075        if(r < X) {
    +1076            W = r;
    +1077        }
    +1078        else {
    +1079            W = X;
    +1080            X = r;
    +1081        }
    +1082        float d = X - Math.min(W, Y);
    +1083        return X * (1f - 0.5f * d / (X + 1e-10f));
    +1084    }
    +1085
    +1086    /**
    +1087     * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    +1088     * to 1f (exclusive, red and approaching purple if decreased).
    +1089     *
    +1090     * @param encoded a color as a packed float that can be obtained by {@link #hsluv(float, float, float, float)}
    +1091     * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    +1092     * eventually to purple before looping back to almost the same red (1.0, exclusive)
    +1093     */
    +1094    public static float hue(final float encoded) {
    +1095        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +1096        float H = ((decoded & 0xff) / 255f);
    +1097        float S = ((decoded >>> 8 & 0xff) / 255f);
    +1098        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    +1099
    +1100        // HSLuv to Lch
    +1101        float C;
    +1102        if (L > 0.99999f) {
    +1103            L = 1;
    +1104            C = 0;
    +1105        } else if (L < 0.00001f) {
    +1106            L = 0;
    +1107            C = 0;
    +1108        } else
    +1109            C = chromaLimit(H, L) * S;
    +1110
    +1111        // Lch to Luv
    +1112        float U = TrigTools.cosTurns(H) * C;
    +1113        float V = MathTools.sin_(H) * C;
    +1114
    +1115        // Luv to XYZ
    +1116        float x, y, z;
    +1117        if (L < 0.00001f) {
    +1118            x = 0;
    +1119            y = 0;
    +1120            z = 0;
    +1121        } else {
    +1122            if (L <= 0.08f)
    +1123                y = L / kappa;
    +1124            else {
    +1125                y = (L + 0.16f) / 1.16f;
    +1126                y *= y * y;
    +1127            }
    +1128            float iL = 1f / (13f * L);
    +1129            float varU = U * iL + refU;
    +1130            float varV = V * iL + refV;
    +1131            x = 9 * varU * y / (4 * varV);
    +1132            z = (3 * y / varV) - x / 3 - 5 * y;
    +1133        }
    +1134        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +1135        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +1136        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +1137        float X, Y, Z, W;
    +1138        if(g < b) {
    +1139            X = b;
    +1140            Y = g;
    +1141            Z = -1f;
    +1142            W = 2f / 3f;
    +1143        }
    +1144        else {
    +1145            X = g;
    +1146            Y = b;
    +1147            Z = 0f;
    +1148            W = -1f / 3f;
    +1149        }
    +1150        if(r < X) {
    +1151            Z = W;
    +1152            W = r;
    +1153        }
    +1154        else {
    +1155            W = X;
    +1156            X = r;
    +1157        }
    +1158        float d = X - Math.min(W, Y);
    +1159        return Math.abs(Z + (W - Y) / (6f * d + 1e-10f));
    +1160    }
    +1161    /**
    +1162     * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    +1163     * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not HSLuv! Takes
    +1164     * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    +1165     * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is likely to be
    +1166     * different from the result of {@code basis} unless hue, saturation, lightness, and opacity are all 0.
    +1167     * This won't allocate any objects.
    +1168     * <br>
    +1169     * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    +1170     * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    +1171     * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    +1172     * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    +1173     * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    +1174     *
    +1175     * @param basis      a packed float color that will be used as the starting point to make the next color
    +1176     * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    +1177     * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    +1178     * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    +1179     * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    +1180     * @return a float encoding a variation of basis with the given changes
    +1181     */
    +1182    public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    +1183        final int decoded = BitConversion.floatToRawIntBits(basis);
    +1184        final float li = Math.min(Math.max(light + reverseLight((decoded >>> 16 & 0xff) / 255f), 0f), 1f);
    +1185        opacity = Math.min(Math.max(opacity + (decoded >>> 25) / 127f, 0f), 1f);
    +1186        if (li <= 0.001f)
    +1187            return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000));
    +1188        float H = ((decoded & 0xff) / 255f);
    +1189        float S = ((decoded >>> 8 & 0xff) / 255f);
    +1190        float L = li;
    +1191//        float L = (1f/1.16f)*(li + 0.16f);
    +1192
    +1193        // HSLuv to Lch
    +1194        float C;
    +1195        if (L > 0.99999f) {
    +1196            L = 1;
    +1197            C = 0;
    +1198        } else
    +1199            C = chromaLimit(H, L) * S;
    +1200
    +1201        // Lch to Luv
    +1202        float U = TrigTools.cosTurns(H) * C;
    +1203        float V = MathTools.sin_(H) * C;
    +1204
    +1205        // Luv to XYZ
    +1206        float x, y, z;
    +1207        if (L <= 0.08f)
    +1208            y = L / kappa;
    +1209        else {
    +1210            y = (L + 0.16f) / 1.16f;
    +1211            y *= y * y;
    +1212        }
    +1213        float iL = 1f / (13f * L);
    +1214        float varU = U * iL + refU;
    +1215        float varV = V * iL + refV;
    +1216        x = 9 * varU * y / (4 * varV);
    +1217        z = (3 * y / varV) - x / 3 - 5 * y;
    +1218        final float r = reverseGamma(Math.min(Math.max(+3.2404542f * x + -1.5371385f * y + -0.4985314f * z, 0f), 1f));
    +1219        final float g = reverseGamma(Math.min(Math.max(-0.9692660f * x + +1.8760108f * y + +0.0415560f * z, 0f), 1f));
    +1220        final float b = reverseGamma(Math.min(Math.max(+0.0556434f * x + -0.2040259f * y + +1.0572252f * z, 0f), 1f));
    +1221        float X, Y, Z, W;
    +1222        if(g < b) {
    +1223            X = b;
    +1224            Y = g;
    +1225            Z = -1f;
    +1226            W = 2f / 3f;
    +1227        }
    +1228        else {
    +1229            X = g;
    +1230            Y = b;
    +1231            Z = 0f;
    +1232            W = -1f / 3f;
    +1233        }
    +1234        if(r < X) {
    +1235            Z = W;
    +1236            W = r;
    +1237        }
    +1238        else {
    +1239            W = X;
    +1240            X = r;
    +1241        }
    +1242        final float d = X - Math.min(W, Y);
    +1243        final float lum = X * (1f - 0.5f * d / (X + 1e-10f));
    +1244        hue += Math.abs(Z + (W - Y) / (6f * d + 1e-10f)) + 1f;
    +1245        saturation += (X - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    +1246        return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    +1247    }
    +1248
    +1249
    +1250    /**
    +1251     * Given a packed float HSLuv color, this edits its H, S, L, and alpha channels by adding the corresponding "add"
    +1252     * parameter and then clamping. This returns a different float value (of course, the given float can't be edited
    +1253     * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. H is wrapped, while S,
    +1254     * L, and alpha are clamped.
    +1255     * @param encoded a packed float HSLuv color
    +1256     * @param addH how much to add to the H channel; typically in the -1 to 1 range
    +1257     * @param addS how much to add to the S channel; typically in the -1 to 1 range
    +1258     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    +1259     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +1260     * @return a packed float HSLuv color with the requested edits applied to {@code encoded}
    +1261     */
    +1262    public static float editHSLuv(float encoded, float addH, float addS, float addL, float addAlpha) {
    +1263        return editHSLuv(encoded, addH, addS, addL, addAlpha, 1f, 1f, 1f, 1f);
    +1264    }
    +1265    /**
    +1266     * Given a packed float HSLuv color, this edits its H, S, L, and alpha channels by first multiplying each channel
    +1267     * by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping (this
    +1268     * wraps H instead of clamping it). This means the lightness value {@code L} is multiplied by {@code mulL}, then has
    +1269     * {@code addL} added, and then is clamped to the normal range for L (0 to 1). This returns a different float value
    +1270     * (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want
    +1271     * to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change. You can multiply S by 0 to make
    +1272     * a grayscale color, or by a large value to make any non-grayscale color more vibrant. Multiplying H generally
    +1273     * isn't very useful, but adding to H can be used to do hue cycling (because H wraps).
    +1274     * @param encoded a packed float HSLuv color
    +1275     * @param addH how much to add to the H channel; typically in the -1 to 1 range
    +1276     * @param addS how much to add to the S channel; typically in the -1 to 1 range
    +1277     * @param addL how much to add to the L channel; typically in the -1 to 1 range
    +1278     * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +1279     * @param mulH how much to multiply the H channel by; should be non-negative (not always)
    +1280     * @param mulS how much to multiply the S channel by; usually non-negative
    +1281     * @param mulL how much to multiply the L channel by; usually non-negative (not always)
    +1282     * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    +1283     * @return a packed float HSLuv color with the requested edits applied to {@code encoded}
    +1284     */
    +1285    public static float editHSLuv(float encoded, float addH, float addS, float addL, float addAlpha,
    +1286                                  float mulH, float mulS, float mulL, float mulAlpha) {
    +1287        final int decoded = BitConversion.floatToRawIntBits(encoded);
    +1288        float H = (decoded & 0xff) / 255f;
    +1289        float S = (decoded >>> 8 & 0xff) / 255f;
    +1290        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    +1291        float alpha = (decoded >>> 25) / 127f;
    +1292
    +1293        H = H * mulH + addH;
    +1294        H -= floor(H);
    +1295        S = Math.min(Math.max(S * mulS + addS, 0f), 1f);
    +1296        L = Math.min(Math.max(L * mulL + addL, 0f), 1f);
    +1297        alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    +1298        return hsluv(H, S, L, alpha);
    +1299    }
    +1300
    +1301    /**
    +1302     * The "H" channel of the given packed float in HSLuv format, which is its hue; ranges from 0.0f to 1.0f .
    +1303     * You can edit the H of a color with {@link #rotateH(float, float)}.
    +1304     *
    +1305     * @param encoded a color encoded as a packed float, as by {@link #hsluv(float, float, float, float)}
    +1306     * @return the H value as a float from 0.0f to 1.0f
    +1307     */
    +1308    public static float channelH(final float encoded)
    +1309    {
    +1310        return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    +1311    }
    +1312
    +1313    /**
    +1314     * The "S" channel of the given packed float in HSLuv format, which is its saturation; ranges from 0.0f to
    +1315     * 1.0f . You can edit the S of a color with {@link #enrich(float, float)} and {@link #dullen(float, float)}.
    +1316     * @param encoded a color encoded as a packed float, as by {@link #hsluv(float, float, float, float)}
    +1317     * @return the S value as a float from 0.0f to 1.0f
    +1318     */
    +1319    public static float channelS(final float encoded)
    +1320    {
    +1321        return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    +1322    }
    +1323
    +1324    /**
    +1325     * The "L" channel of the given packed float in HSLuv format, which is its lightness; ranges from 0.0f to
    +1326     * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
    +1327     *
    +1328     * @param encoded a color encoded as a packed float, as by {@link #hsluv(float, float, float, float)}
    +1329     * @return the L value as a float from 0.0f to 1.0f
    +1330     */
    +1331    public static float channelL(final float encoded)
    +1332    {
    +1333        return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    +1334    }
    +1335
    +1336    /**
    +1337     * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    +1338     * start as-is) and 1f (return white), start should be a packed color, as from
    +1339     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +1340     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +1341     * towards white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha, hue, and
    +1342     * saturation of start as-is.
    +1343     * @see #darken(float, float) the counterpart method that darkens a float color
    +1344     * @param start the starting color as a packed float
    +1345     * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    +1346     * @return a packed float that represents a color between start and white
    +1347     */
    +1348    public static float lighten(final float start, final float change) {
    +1349        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +1350        return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    +1351    }
    +1352
    +1353    /**
    +1354     * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    +1355     * start as-is) and 1f (return black), start should be a packed color, as from
    +1356     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +1357     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +1358     * towards black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha, hue, and
    +1359     * saturation of start as-is.
    +1360     * @see #lighten(float, float) the counterpart method that lightens a float color
    +1361     * @param start the starting color as a packed float
    +1362     * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    +1363     * @return a packed float that represents a color between start and black
    +1364     */
    +1365    public static float darken(final float start, final float change) {
    +1366        final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +1367        return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    +1368    }
    +1369
    +1370    /**
    +1371     * Moves the color of {@code start} away from grayscale by change (saturating the color). While change
    +1372     * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    +1373     * from {@link #hsluv(float, float, float, float)}. This changes only S, and won't change hue, lightness, or alpha.
    +1374     * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    +1375     * @param start the starting color as a packed float
    +1376     * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    +1377     * @return a packed float that represents a color between start and a saturated color
    +1378     */
    +1379    public static float enrich(final float start, final float change) {
    +1380        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +1381        return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    +1382    }
    +1383
    +1384    /**
    +1385     * Brings the color of {@code start} closer to grayscale by {@code change} (desaturating the color). While
    +1386     * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    +1387     * from {@link #hsluv(float, float, float, float)}. This changes only S, and won't change hue, lightness, or alpha.
    +1388     * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    +1389     * @param start the starting color as a packed float
    +1390     * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    +1391     * @return a packed float that represents a color between start and a desaturated color
    +1392     */
    +1393    public static float dullen(final float start, final float change) {
    +1394        final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +1395        return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    +1396    }
    +1397
    +1398    /**
    +1399     * Cycles the hue of the packed float color by change. If change is 0f, this returns start as-is. If change is
    +1400     * positive, this rotates from red to orange to yellow to green, and so on. If change is negative, this instead
    +1401     * rotates from green to yellow to orange to red.  A change value is typically between -1f and 1f; if change is
    +1402     * exactly an integer, then this will wrap around in a perfect circle and produce no change. The start value should
    +1403     * be a packed color, as from {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations
    +1404     * of temporary Colors. This only changes H, and won't change saturation, lightness, or alpha.
    +1405     * @param start the starting color as a packed float
    +1406     * @param change how much to rotate hue by, as a float typically between -1 and 1; further from 0 rotates more
    +1407     * @return a packed float that represents a color like start but with a rotated hue
    +1408     */
    +1409    public static float rotateH(final float start, final float change) {
    +1410        final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    +1411        return BitConversion.intBitsToFloat(((int) (i + (256f * change)) & 0xFF) | other);
    +1412    }
    +1413
    +1414    /**
    +1415     * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    +1416     * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    +1417     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +1418     * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +1419     * towards transparent. This won't change the H, S, or L of the color.
    +1420     * @see #fade(float, float) the counterpart method that makes a float color more translucent
    +1421     * @param start the starting color as a packed float
    +1422     * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    +1423     * @return a packed float that represents a color between start and its opaque version
    +1424     */
    +1425    public static float blot(final float start, final float change) {
    +1426        final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    +1427        return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    +1428    }
    +1429
    +1430    /**
    +1431     * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    +1432     * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    +1433     * {@link #hsluv(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +1434     * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    +1435     * lerp towards transparent. This won't change the H, S, or L of the color.
    +1436     * @see #blot(float, float) the counterpart method that makes a float color more opaque
    +1437     * @param start the starting color as a packed float
    +1438     * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    +1439     * @return a packed float that represents a color between start and transparent
    +1440     */
    +1441    public static float fade(final float start, final float change) {
    +1442        final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    +1443        return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    +1444    }
    +1445
    +1446    /**
    +1447     * Given a packed float HSLuv color {@code mainColor} and another HSLuv color that it should be made to contrast
    +1448     * with, gets a packed float HSLuv color with roughly inverted lightness but the same hue, saturation, and alpha.
    +1449     * This won't ever produce black or other very dark colors, and also has a gap in the range it produces for
    +1450     * lightness values between 0.5 and 0.55. That allows most of the colors this method produces to contrast well as a
    +1451     * foreground when displayed on a background of {@code contrastingColor}, or vice versa. This will leave the
    +1452     * lightness unchanged if the hues of the contrastingColor and those of the mainColor are already very different.
    +1453     * This has nothing to do with the contrast channel of the tweak in ColorfulBatch; where that part of the tweak can
    +1454     * make too-similar lightness values further apart by just a little, this makes a modification on {@code mainColor}
    +1455     * to maximize its lightness difference from {@code contrastingColor} without losing its other qualities.
    +1456     * @param mainColor a packed float color, as produced by {@link #hsluv(float, float, float, float)}; this is the color that will be adjusted
    +1457     * @param contrastingColor a packed float color, as produced by {@link #hsluv(float, float, float, float)}; the adjusted mainColor will contrast with this
    +1458     * @return a different HSLuv packed float color, based on mainColor but with potentially very different lightness
    +1459     */
    +1460    public static float inverseLightness(final float mainColor, final float contrastingColor)
    +1461    {
    +1462        final int bits = BitConversion.floatToRawIntBits(mainColor),
    +1463                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    +1464                H = (bits & 0xff),
    +1465//                S = (bits >>> 8 & 0xff),
    +1466                L = (bits >>> 16 & 0xff),
    +1467                cH = (contrastBits & 0xff),
    +1468//                cS = (contrastBits >>> 8 & 0xff),
    +1469                cL = (contrastBits >>> 16 & 0xff);
    +1470        if(Math.abs(H - cH) >= 90)
    +1471            return mainColor;
    +1472        return BitConversion.intBitsToFloat((bits & 0xFE00FFFF) | (int) (cL < 128 ? L * 0.45f + 128 : 128 - L * 0.45f) << 16);
    +1473    }
    +1474
    +1475    /**
    +1476     * Given a packed float HSLuv color {@code mainColor} and another HSLuv color that it should be made to contrast
    +1477     * with, gets a packed float HSLuv color with L that should be quite different from {@code contrastingColor}'s L,
    +1478     * but the same hue, saturation, and opacity. This allows most of the colors this method produces to contrast well
    +1479     * as a foreground when displayed on a background of {@code contrastingColor}, or vice versa.
    +1480     * <br>
    +1481     * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    +1482     * change the lightness of mainColor when the two given colors have close lightness but distant hues. Because it
    +1483     * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
    +1484     * @param mainColor a packed HSLuv float color; this is the color that will be adjusted
    +1485     * @param contrastingColor a packed HSLuv float color; the adjusted mainColor will contrast with the L of this
    +1486     * @return a different packed HSLuv float color, based on mainColor but typically with different lightness
    +1487     */
    +1488    public static float differentiateLightness(final float mainColor, final float contrastingColor)
    +1489    {
    +1490        final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    +1491        return BitConversion.intBitsToFloat((main & 0xFE00FFFF) | ((contrast >>> 16) + 128 & 0xFF) + (main >>> 16 & 0xFF) >>> 1);
    +1492    }
    +1493
    +1494    /**
    +1495     * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
    +1496     * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
    +1497     * results in the middle-range of possible lightness.
    +1498     * <br>
    +1499     * Calling {@code offsetLightness(mainColor)} is the same as calling
    +1500     * {@code ColorTools.differentiateLightness(mainColor, mainColor)}.
    +1501     * @param mainColor a packed HSLuv float color
    +1502     * @return a different packed HSLuv float color, with its L channel changed.
    +1503     */
    +1504    public static float offsetLightness(final float mainColor) {
    +1505        final int decoded = BitConversion.floatToRawIntBits(mainColor);
    +1506        return BitConversion.intBitsToFloat((decoded & 0xFE00FFFF) | ((decoded >>> 16) + 128 & 0xFF) + (decoded >>> 16 & 0xFF) >>> 1);
    +1507    }
    +1508
    +1509    /**
    +1510     * Makes the additive HSLuv color stored in {@code color} cause less of a change when used as a tint, as if it were
    +1511     * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    +1512     * returns {@code Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    +1513     * meant for things like area of effect abilities that make smaller color changes toward their periphery. This only
    +1514     * affects the saturation and lightness of the color; its hue and alpha are unchanged.
    +1515     * @param color a color that should have its tinting effect potentially weakened
    +1516     * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    +1517     * @return a HSLuv float color between gray and {@code color}
    +1518     */
    +1519    public static float lessenChange(final float color, float fraction) {
    +1520        final int e = BitConversion.floatToRawIntBits(color),
    +1521                sS = 0x80, sL = 0x80,
    +1522                eH = (e & 0xFF), eS = (e >>> 8) & 0xFF, eL = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
    +1523        return BitConversion.intBitsToFloat(eH
    +1524                | (((int) (sS + fraction * (eS - sS)) & 0xFF) << 8)
    +1525                | (((int) (sL + fraction * (eL - sL)) & 0xFF) << 16)
    +1526                | (eAlpha << 24));
    +1527    }
    +1528
    +1529    /**
    +1530     * Returns true always; HSLuv colors are always in-gamut.
    +1531     * @param packed a packed float color as HSLuv
    +1532     * @return true
    +1533     */
    +1534    public static boolean inGamut(final float packed)
    +1535    {
    +1536        return true;
    +1537    }
    +1538
    +1539    /**
    +1540     * Returns true if S and L are each between 0 and 1; if valid, HSLuv colors are always in-gamut.
    +1541     * @param H hue, as an unbounded float
    +1542     * @param S saturation, as a float from 0 to 1
    +1543     * @param L lightness, as a float from 0 to 1
    +1544     * @return true if S and L are both between 0 and 1
    +1545     */
    +1546    public static boolean inGamut(float H, float S, float L)
    +1547    {
    +1548        return (S >= 0f && S <= 1.0f && L >= 0f && L <= 1.0f);
    +1549    }
    +1550
    +1551    /**
    +1552     * Returns its argument unchanged; HSLuv colors are always in-gamut.
    +1553     * @param packed a packed float color in HSLuv format
    +1554     * @return {@code packed}, unchanged
    +1555     */
    +1556    public static float limitToGamut(final float packed) {
    +1557        return packed;
    +1558    }
    +1559
    +1560    /**
    +1561     * Identical to calling {@link #clamp(float, float, float, float)} with 1f as its last parameter.
    +1562     * @param H hue; will be wrapped between 0 and 1
    +1563     * @param S saturation; will be clamped between 0 and 1 if it isn't already
    +1564     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    +1565     * @return an HSLuv color with the specified channel values, wrapped or clamped as appropriate
    +1566     */
    +1567    public static float limitToGamut(float H, float S, float L) {
    +1568        return clamp(H - floor(H), S, L, 1f);
    +1569    }
    +1570    /**
    +1571     * Identical to calling {@link #clamp(float, float, float, float)} with 1f as its last parameter.
    +1572     * @param H hue; will be wrapped between 0 and 1
    +1573     * @param S saturation; will be clamped between 0 and 1 if it isn't already
    +1574     * @param L lightness; will be clamped between 0 and 1 if it isn't already
    +1575     * @param alpha opacity; will be clamped between 0 and 1 if it isn't already
    +1576     * @return an HSLuv color with the specified channel values, wrapped or clamped as appropriate
    +1577     */
    +1578    public static float limitToGamut(float H, float S, float L, float alpha) {
    +1579        return clamp(H, S, L, alpha);
    +1580    }
    +1581
    +1582    /**
    +1583     * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    +1584     * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    +1585     * be different each time this is called, and can be obtained from a random number generator to make the colors more
    +1586     * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    +1587     * produce two similar colors in a row unless variance is very small. The variance affects the H, S, and L of the
    +1588     * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    +1589     * isn't greater than the variance.
    +1590     * @param color a packed float color, as produced by {@link #hsluv(float, float, float, float)}
    +1591     * @param seed a long seed that should be different on each call; should not be 0
    +1592     * @param variance max amount of difference between the given color and the generated color; always less than 1
    +1593     * @return a generated packed float color that should be at least somewhat different from {@code color}
    +1594     */
    +1595    public static float randomEdit(final float color, long seed, final float variance) {
    +1596        final int decoded = BitConversion.floatToRawIntBits(color);
    +1597        float H = (decoded & 0xff) / 255f;
    +1598        float S = (decoded >>> 8 & 0xff) / 255f;
    +1599        float L = reverseLight((decoded >>> 16 & 0xff) / 255f);
    +1600        final float limit = variance * variance;
    +1601        float dist, x, y, z;
    +1602        for (int j = 0; j < 50; j++) {
    +1603            x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +1604            y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +1605            z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +1606            seed += 0x9E3779B97F4A7C15L;
    +1607            dist = x * x + y * y + z * z;
    +1608            if(dist <= limit)
    +1609                return clamp(H + x, S + y, L + z, (decoded >>> 25) / 127f);
    +1610        }
    +1611        return color;
    +1612    }
    +1613
    +1614    /**
    +1615     * Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    +1616     * @param random a Random object (preferably a subclass of Random, like
    +1617     * {@link com.github.tommyettinger.random.LaserRandom})
    +1618     * @return a packed float color that is always in-gamut
    +1619     */
    +1620    public static float randomColor(Random random) {
    +1621        return hsluv(random.nextFloat(), random.nextFloat(), random.nextFloat(), 1f);
    +1622    }
    +1623
    +1624    /**
    +1625     * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    +1626     * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    +1627     * and EnhancedRandom.
    +1628     * @param random any subclass of juniper's EnhancedRandom, such as a
    +1629     * {@link com.github.tommyettinger.random.DistinctRandom} or
    +1630     * {@link com.github.tommyettinger.random.FourWheelRandom}
    +1631     * @return a packed float color that is always in-gamut
    +1632     */
    +1633    public static float randomizedColor(EnhancedRandom random) {
    +1634        return hsluv(random.nextFloat(), random.nextFloat(), random.nextFloat(), 1f);
    +1635    }
    +1636    /**
    +1637     * Interpolates from the packed float color start towards end by change. Both start and end should be packed colors,
    +1638     * as from {@link #hsluv(float, float, float, float)}, and change can be between 0f (keep start) and 1f (only use
    +1639     * end). Both start and end must use HSLuv. This is a good way to reduce allocations of temporary Colors.
    +1640     * @param start the starting color as a packed float
    +1641     * @param end the target color as a packed float
    +1642     * @param change how much to go from start toward end, as a float between 0 and 1; higher means closer to end
    +1643     * @return a packed float that represents a color between start and end
    +1644     */
    +1645    public static float lerpFloatColors(final float start, final float end, float change) {
    +1646        final int s = BitConversion.floatToRawIntBits(start), e = BitConversion.floatToRawIntBits(end),
    +1647                hs = (s & 0xFF), ss = (s >>> 8) & 0xFF, ls = (s >>> 16) & 0xFF, as = s >>> 24 & 0xFE,
    +1648                he = (e & 0xFF), se = (e >>> 8) & 0xFF, le = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
    +1649        float Hs = hs / 255f, Cs, Ls;
    +1650        if (ls == 255) {
    +1651            Ls = 1f;
    +1652            Cs = 0f;
    +1653        } else if (ls == 0) {
    +1654            Ls = 0f;
    +1655            Cs = 0f;
    +1656        } else {
    +1657            Ls = ls / 255f;
    +1658            Cs = chromaLimit(Hs, Ls) * (ss / 255f);
    +1659        }
    +1660        // Lch to Luv
    +1661        float Us = TrigTools.cosTurns(Hs) * Cs;
    +1662        float Vs = MathTools.sin_(Hs) * Cs;
    +1663
    +1664        float He = he / 255f, Ce, Le;
    +1665        if (le == 255) {
    +1666            Le = 1f;
    +1667            Ce = 0f;
    +1668        } else if (le == 0) {
    +1669            Le = 0f;
    +1670            Ce = 0f;
    +1671        } else {
    +1672            Le = le / 255f;
    +1673            Ce = chromaLimit(He, Le) * (se / 255f);
    +1674        }
    +1675        // Lch to Luv
    +1676        float Ue = TrigTools.cosTurns(He) * Ce;
    +1677        float Ve = TrigTools.sinTurns(He) * Ce;
     1678
    -1679        L = (Ls + change * (Le - Ls));
    -1680        U = (Us + change * (Ue - Us));
    -1681        V = (Vs + change * (Ve - Vs));
    -1682
    -1683        // Luv to Lch
    -1684        H = MathTools.atan2_(V, U);
    -1685
    -1686
    -1687        // Lch to HSLuv
    -1688        if (L > 0.99999f) {
    -1689            return Palette.WHITE;
    -1690        } else if (L < 0.00001f) {
    -1691            return Palette.BLACK;
    -1692        } else {
    -1693            S = Math.min((float)Math.sqrt(U * U + V * V) / chromaLimit(H, L), 1);
    -1694        }
    -1695        return BitConversion.intBitsToFloat(
    -1696                          Math.min(Math.max((int)(H * 255.999f), 0), 255)
    -1697                        | Math.min(Math.max((int)(S * 255.999f), 0), 255) << 8
    -1698                        | Math.min(Math.max((int)(L * 255.999f), 0), 255) << 16
    -1699                        | (((int) (as + change * (ae - as)) & 0xFE) << 24));
    -1700    }
    -1701
    -1702    /**
    -1703     * Interpolates from the packed float color start towards end by change, but keeps the alpha of start and uses the
    -1704     * alpha of end as an extra factor that can affect how much to change. Both start and end should be packed colors,
    -1705     * as from {@link #hsluv(float, float, float, float)}, and change can be between 0f (keep start) and 1f (only use
    -1706     * end). Both start and end must use HSLuv. This is a good way to reduce allocations of temporary Colors.
    -1707     * @param start the starting color as a packed float; alpha will be preserved
    -1708     * @param end the target color as a packed float; alpha will not be used directly, and will instead be multiplied with change
    -1709     * @param change how much to go from start toward end, as a float between 0 and 1; higher means closer to end
    -1710     * @return a packed float that represents a color between start and end
    -1711     */
    -1712    public static float lerpFloatColorsBlended(final float start, final float end, float change) {
    -1713        final int s = BitConversion.floatToRawIntBits(start), e = BitConversion.floatToRawIntBits(end),
    -1714                as = s & 0xFE000000;
    -1715        change *= (e >>> 25) / 127f;
    -1716        return lerpFloatColors(start, BitConversion.intBitsToFloat(as | (e & 0xFFFFFF)), change);
    -1717    }
    -1718
    -1719    /**
    -1720     * Returns a 1:1 mix of color0 and color1. All colors should use the same color space.
    -1721     * This is the same as calling {@link #lerpFloatColors(float, float, float)} with a change of 0.5.
    -1722     * @param color0 the first color to mix, as a packed float color
    -1723     * @param color1 the second color to mix, as a packed float color
    -1724     * @return an even mix of all colors given, as a packed float color
    -1725     */
    -1726    public static float mix(float color0, float color1) {
    -1727        return lerpFloatColors(color0, color1, 0.5f);
    -1728    }
    -1729
    -1730    /**
    -1731     * Returns a 1:1:1 mix of color0, color1, and color2. All colors should use the same color space.
    -1732     * @param color0 the first color to mix, as a packed float color
    -1733     * @param color1 the second color to mix, as a packed float color
    -1734     * @param color2 the third color to mix, as a packed float color
    -1735     * @return an even mix of all colors given, as a packed float color
    -1736     */
    -1737    public static float mix(float color0, float color1, float color2) {
    -1738        return lerpFloatColors(lerpFloatColors(color0, color1, 0.5f), color2, 0.33333f);
    -1739    }
    -1740
    -1741    /**
    -1742     * Returns a 1:1:1:1 mix of color0, color1, color2, and color3. All colors should use the same color space.
    -1743     * @param color0 the first color to mix, as a packed float color
    -1744     * @param color1 the second color to mix, as a packed float color
    -1745     * @param color2 the third color to mix, as a packed float color
    -1746     * @param color3 the fourth color to mix, as a packed float color
    -1747     * @return an even mix of all colors given, as a packed float color
    -1748     */
    -1749    public static float mix(float color0, float color1, float color2, float color3) {
    -1750        return lerpFloatColors(lerpFloatColors(lerpFloatColors(color0, color1, 0.5f), color2, 0.33333f), color3, 0.25f);
    -1751    }
    -1752
    -1753    /**
    -1754     * Given several colors, this gets an even mix of all colors in equal measure.
    -1755     * If {@code colors} is null or has no items, this returns 0f (usually transparent in most color spaces).
    -1756     * @param colors an array or varargs of packed float colors; all should use the same color space
    -1757     * @return an even mix of all colors given, as a packed float color
    -1758     */
    -1759    public static float mix(float... colors) {
    -1760        if(colors == null || colors.length == 0)
    -1761            return 0f; // transparent, usually
    -1762        float result = colors[0];
    -1763        for (int i = 1; i < colors.length; i++) {
    -1764            result = lerpFloatColors(result, colors[i], 1f / (i + 1f));
    -1765        }
    -1766        return result;
    -1767    }
    -1768
    -1769    /**
    -1770     * Given several colors, this gets an even mix of all colors in equal measure.
    -1771     * If {@code colors} is null or has no items, this returns 0f (usually transparent in most color spaces).
    -1772     * This is mostly useful in conjunction with {@link com.github.tommyettinger.ds.FloatList}, using its {@code items}
    -1773     * for colors, typically 0 for offset, and its {@code size} for size.
    -1774     * @param colors an array of packed float colors; all should use the same color space
    -1775     * @param offset the index of the first item in {@code colors} to use
    -1776     * @param size how many items from {@code colors} to use
    -1777     * @return an even mix of all colors given, as a packed float color
    -1778     */
    -1779    public static float mix(float[] colors, int offset, int size) {
    -1780        if(colors == null || colors.length < offset + size || offset < 0 || size <= 0)
    -1781            return 0f; // transparent, usually
    -1782        float result = colors[offset];
    -1783        for (int i = offset + 1, o = offset + size, denom = 2; i < o; i++, denom++) {
    -1784            result = lerpFloatColors(result, colors[i], 1f / denom);
    -1785        }
    -1786        return result;
    -1787    }
    -1788
    -1789}
    +1679        float H, S, L, U, V;
    +1680
    +1681        L = (Ls + change * (Le - Ls));
    +1682        U = (Us + change * (Ue - Us));
    +1683        V = (Vs + change * (Ve - Vs));
    +1684
    +1685        // Luv to Lch
    +1686        H = MathTools.atan2_(V, U);
    +1687
    +1688
    +1689        // Lch to HSLuv
    +1690        if (L > 0.99999f) {
    +1691            return Palette.WHITE;
    +1692        } else if (L < 0.00001f) {
    +1693            return Palette.BLACK;
    +1694        } else {
    +1695            S = Math.min((float)Math.sqrt(U * U + V * V) / chromaLimit(H, L), 1);
    +1696        }
    +1697        return BitConversion.intBitsToFloat(
    +1698                          Math.min(Math.max((int)(H * 255.999f), 0), 255)
    +1699                        | Math.min(Math.max((int)(S * 255.999f), 0), 255) << 8
    +1700                        | Math.min(Math.max((int)(L * 255.999f), 0), 255) << 16
    +1701                        | (((int) (as + change * (ae - as)) & 0xFE) << 24));
    +1702    }
    +1703
    +1704    /**
    +1705     * Interpolates from the packed float color start towards end by change, but keeps the alpha of start and uses the
    +1706     * alpha of end as an extra factor that can affect how much to change. Both start and end should be packed colors,
    +1707     * as from {@link #hsluv(float, float, float, float)}, and change can be between 0f (keep start) and 1f (only use
    +1708     * end). Both start and end must use HSLuv. This is a good way to reduce allocations of temporary Colors.
    +1709     * @param start the starting color as a packed float; alpha will be preserved
    +1710     * @param end the target color as a packed float; alpha will not be used directly, and will instead be multiplied with change
    +1711     * @param change how much to go from start toward end, as a float between 0 and 1; higher means closer to end
    +1712     * @return a packed float that represents a color between start and end
    +1713     */
    +1714    public static float lerpFloatColorsBlended(final float start, final float end, float change) {
    +1715        final int s = BitConversion.floatToRawIntBits(start), e = BitConversion.floatToRawIntBits(end),
    +1716                as = s & 0xFE000000;
    +1717        change *= (e >>> 25) / 127f;
    +1718        return lerpFloatColors(start, BitConversion.intBitsToFloat(as | (e & 0xFFFFFF)), change);
    +1719    }
    +1720
    +1721    /**
    +1722     * Returns a 1:1 mix of color0 and color1. All colors should use the same color space.
    +1723     * This is the same as calling {@link #lerpFloatColors(float, float, float)} with a change of 0.5.
    +1724     * @param color0 the first color to mix, as a packed float color
    +1725     * @param color1 the second color to mix, as a packed float color
    +1726     * @return an even mix of all colors given, as a packed float color
    +1727     */
    +1728    public static float mix(float color0, float color1) {
    +1729        return lerpFloatColors(color0, color1, 0.5f);
    +1730    }
    +1731
    +1732    /**
    +1733     * Returns a 1:1:1 mix of color0, color1, and color2. All colors should use the same color space.
    +1734     * @param color0 the first color to mix, as a packed float color
    +1735     * @param color1 the second color to mix, as a packed float color
    +1736     * @param color2 the third color to mix, as a packed float color
    +1737     * @return an even mix of all colors given, as a packed float color
    +1738     */
    +1739    public static float mix(float color0, float color1, float color2) {
    +1740        return lerpFloatColors(lerpFloatColors(color0, color1, 0.5f), color2, 0.33333f);
    +1741    }
    +1742
    +1743    /**
    +1744     * Returns a 1:1:1:1 mix of color0, color1, color2, and color3. All colors should use the same color space.
    +1745     * @param color0 the first color to mix, as a packed float color
    +1746     * @param color1 the second color to mix, as a packed float color
    +1747     * @param color2 the third color to mix, as a packed float color
    +1748     * @param color3 the fourth color to mix, as a packed float color
    +1749     * @return an even mix of all colors given, as a packed float color
    +1750     */
    +1751    public static float mix(float color0, float color1, float color2, float color3) {
    +1752        return lerpFloatColors(lerpFloatColors(lerpFloatColors(color0, color1, 0.5f), color2, 0.33333f), color3, 0.25f);
    +1753    }
    +1754
    +1755    /**
    +1756     * Given several colors, this gets an even mix of all colors in equal measure.
    +1757     * If {@code colors} is null or has no items, this returns 0f (usually transparent in most color spaces).
    +1758     * @param colors an array or varargs of packed float colors; all should use the same color space
    +1759     * @return an even mix of all colors given, as a packed float color
    +1760     */
    +1761    public static float mix(float... colors) {
    +1762        if(colors == null || colors.length == 0)
    +1763            return 0f; // transparent, usually
    +1764        float result = colors[0];
    +1765        for (int i = 1; i < colors.length; i++) {
    +1766            result = lerpFloatColors(result, colors[i], 1f / (i + 1f));
    +1767        }
    +1768        return result;
    +1769    }
    +1770
    +1771    /**
    +1772     * Given several colors, this gets an even mix of all colors in equal measure.
    +1773     * If {@code colors} is null or has no items, this returns 0f (usually transparent in most color spaces).
    +1774     * This is mostly useful in conjunction with {@link com.github.tommyettinger.ds.FloatList}, using its {@code items}
    +1775     * for colors, typically 0 for offset, and its {@code size} for size.
    +1776     * @param colors an array of packed float colors; all should use the same color space
    +1777     * @param offset the index of the first item in {@code colors} to use
    +1778     * @param size how many items from {@code colors} to use
    +1779     * @return an even mix of all colors given, as a packed float color
    +1780     */
    +1781    public static float mix(float[] colors, int offset, int size) {
    +1782        if(colors == null || colors.length < offset + size || offset < 0 || size <= 0)
    +1783            return 0f; // transparent, usually
    +1784        float result = colors[offset];
    +1785        for (int i = offset + 1, o = offset + size, denom = 2; i < o; i++, denom++) {
    +1786            result = lerpFloatColors(result, colors[i], 1f / denom);
    +1787        }
    +1788        return result;
    +1789    }
    +1790
    +1791}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/GradientTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/GradientTools.html
    index 4b43177d..44e37d52 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/GradientTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/hsluv/GradientTools.html
    @@ -13,244 +13,245 @@
     
    001package com.github.tommyettinger.colorful.pure.hsluv;
     002
    -003import com.github.tommyettinger.colorful.pure.Interpolation;
    -004import com.github.tommyettinger.colorful.pure.MathTools;
    -005import com.github.tommyettinger.ds.FloatList;
    -006
    -007/**
    -008 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    -009 * The intent is for the FloatArray to be used as a sequence of packed float HSLuv colors. You can create a new
    -010 * FloatArray gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatArray will work
    -011 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatArray, you can
    -012 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    -013 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    -014 * than two colors. You can also customize each section between colors with
    -015 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    -016 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    -017 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    -018 * <br>
    -019 * This class does some special handling for HSLuv colors.
    -020 */
    -021public class GradientTools {
    -022    /**
    -023     * No need to instantiate.
    -024     */
    -025    private GradientTools(){
    -026    }
    -027
    -028    /**
    -029     * Creates a FloatList gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color
    -030     * {@code end}, taking the specified number of steps and using linear interpolation.
    -031     * @param start the packed float HSLuv color to start with
    -032     * @param end the packed float HSLuv color to end on
    -033     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -034     * @return a new FloatList that contains the requested gradient
    -035     */
    -036    public static FloatList makeGradient(float start, float end, int steps) {
    -037        return makeGradient(start, end, steps, Interpolation.linear);
    -038    }
    -039    /**
    -040     * Creates a FloatList gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color
    -041     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -042     * @param start the packed float HSLuv color to start with
    -043     * @param end the packed float HSLuv color to end on
    -044     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -045     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -046     * @return a new FloatList that contains the requested gradient
    -047     */
    -048    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    -049        FloatList appending = new FloatList(steps);
    -050        if(steps <= 0) {
    -051            return appending;
    -052        }
    -053        if(steps == 1) {
    -054            appending.add(start);
    -055            return appending;
    -056        }
    -057        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -058        return appending;
    -059    }
    -060
    -061    /**
    -062     * Appends a gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color {@code end},
    -063     * taking the specified number of steps and using linear Interpolation for how it transitions.
    -064     * @param appending a FloatList that will be appended to
    -065     * @param start the packed float HSLuv color to start with
    -066     * @param end the packed float HSLuv color to end on
    -067     * @param steps how many steps the gradient should use; usually greater than 2
    -068     * @return {@code appending}, after adding the gradient to the end
    -069     */
    -070    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    -071        return appendGradient(appending, start, end, steps, Interpolation.linear);
    -072    }
    -073    /**
    -074     * Appends a gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color {@code end},
    -075     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    -076     * @param appending a FloatList that will be appended to
    -077     * @param start the packed float HSLuv color to start with
    -078     * @param end the packed float HSLuv color to end on
    -079     * @param steps how many steps the gradient should use; usually greater than 2
    -080     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -081     * @return {@code appending}, after adding the gradient to the end
    -082     */
    -083    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    -084        if(appending == null)
    -085            return null;
    -086        if(steps <= 0) {
    -087            return appending;
    -088        }
    -089        if(steps == 1) {
    -090            appending.add(start);
    -091            return appending;
    -092        }
    -093        appending.ensureCapacity(steps);
    -094        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -095        return appending;
    -096    }
    -097
    -098    /**
    -099     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses linear
    -100     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -101     * {@code steps} colors.
    -102     * @param appending a FloatList that will be appended to
    -103     * @param steps how many steps the gradient should use; usually greater than 2
    -104     * @param chain an array or varargs of packed float HSLuv colors that this will interpolate through in order
    -105     * @return {@code appending}, after adding the gradient to the end
    -106     */
    -107    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    -108        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -109    }
    -110
    -111    /**
    -112     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses linear
    -113     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -114     * {@code steps} colors.
    -115     * @param appending a FloatList that will be appended to
    -116     * @param steps how many steps the gradient should use; usually greater than 2
    -117     * @param chain a FloatList of packed float HSLuv colors that this will interpolate through in order
    -118     * @return {@code appending}, after adding the gradient to the end
    -119     */
    -120    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    -121        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -122    }
    -123
    -124    /**
    -125     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses the specified
    -126     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -127     * end of {@code appending} and produces a total of {@code steps} colors.
    -128     * @param appending a FloatList that will be appended to
    -129     * @param steps how many steps the gradient should use; usually greater than 2
    -130     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -131     * @param chain a FloatList of packed float HSLuv colors that this will interpolate through in order
    -132     * @return {@code appending}, after adding the gradient to the end
    -133     */
    -134    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    -135        if (appending == null)
    -136            return null;
    -137        if(chain == null)
    -138            return appending;
    -139        if (steps <= 0 || chain.size() == 0) {
    -140            return appending;
    -141        }
    -142        if (steps == 1 || chain.size() == 1) {
    -143            appending.add(chain.first());
    -144            return appending;
    -145        }
    -146        appending.ensureCapacity(steps);
    -147        int limit = steps - 1, splits = chain.size() - 1;
    -148        float step = 1f / steps, change = 0f;
    -149        for (int i = 0; i < limit; i++) {
    -150            float interp = interpolation.apply(change);
    -151            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -152            int idx = (int)splint;
    -153            appending.add(ColorTools.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    -154            change += step;
    -155        }
    -156        appending.add(chain.get(splits));
    -157        return appending;
    -158    }
    -159
    -160    /**
    -161     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses the specified
    -162     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -163     * end of {@code appending} and produces a total of {@code steps} colors.
    -164     * @param appending a FloatList that will be appended to
    -165     * @param steps how many steps the gradient should use; usually greater than 2
    -166     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -167     * @param chain an array or varargs of packed float HSLuv colors that this will interpolate through in order
    -168     * @return {@code appending}, after adding the gradient to the end
    -169     */
    -170    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    -171        if (appending == null)
    -172            return null;
    -173        if(chain == null)
    -174            return appending;
    -175        if (steps <= 0 || chain.length == 0) {
    -176            return appending;
    -177        }
    -178        if (steps == 1 || chain.length == 1) {
    -179            appending.add(chain[0]);
    -180            return appending;
    -181        }
    -182        appending.ensureCapacity(steps);
    -183        int limit = steps - 1, splits = chain.length - 1;
    -184        float step = 1f / steps, change = 0f;
    -185        for (int i = 0; i < limit; i++) {
    -186            float interp = interpolation.apply(change);
    -187            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -188            int idx = (int)splint;
    -189            appending.add(ColorTools.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    -190            change += step;
    -191        }
    -192        appending.add(chain[splits]);
    -193        return appending;
    -194    }
    -195
    -196    /**
    -197     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    -198     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -199     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -200     * number of steps, it just doesn't append {@code end} in the last step.
    -201     * @param appending a FloatList that will be appended to
    -202     * @param start the packed float HSLuv color to start with
    -203     * @param end the packed float HSLuv color to end just before
    -204     * @param steps how many steps the gradient should use; usually greater than 2
    -205     * @return {@code appending}, after adding the gradient to its end
    -206     */
    -207    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    -208        return appendPartialGradient(appending, start, end, steps, Interpolation.linear);
    -209    }
    -210    /**
    -211     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    -212     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -213     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -214     * number of steps, it just doesn't append {@code end} in the last step.
    -215     * @param appending a FloatList that will be appended to
    -216     * @param start the packed float HSLuv color to start with
    -217     * @param end the packed float HSLuv color to end just before
    -218     * @param steps how many steps the gradient should use; usually greater than 2
    -219     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    -220     * @return {@code appending}, after adding the gradient to its end
    -221     */
    -222    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    -223        if(appending == null)
    -224            return null;
    -225        if(steps <= 0) {
    -226            return appending;
    -227        }
    -228        if(steps == 1) {
    -229            appending.add(start);
    -230            return appending;
    -231        }
    -232        int limit = steps;
    -233        float step = 1f / steps, change = 0f;
    -234        for (int i = 0; i < limit; i++) {
    -235            appending.add(ColorTools.lerpFloatColors(start, end, interpolation.apply(change)));
    -236            change += step;
    -237        }
    -238        return appending;
    -239    }
    -240}
    +003import com.github.tommyettinger.colorful.pure.Interpolations;
    +004import com.github.tommyettinger.colorful.pure.Interpolations.Interpolation;
    +005import com.github.tommyettinger.colorful.pure.MathTools;
    +006import com.github.tommyettinger.ds.FloatList;
    +007
    +008/**
    +009 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    +010 * The intent is for the FloatArray to be used as a sequence of packed float HSLuv colors. You can create a new
    +011 * FloatArray gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatArray will work
    +012 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatArray, you can
    +013 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    +014 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    +015 * than two colors. You can also customize each section between colors with
    +016 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    +017 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    +018 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    +019 * <br>
    +020 * This class does some special handling for HSLuv colors.
    +021 */
    +022public class GradientTools {
    +023    /**
    +024     * No need to instantiate.
    +025     */
    +026    private GradientTools(){
    +027    }
    +028
    +029    /**
    +030     * Creates a FloatList gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color
    +031     * {@code end}, taking the specified number of steps and using linear interpolation.
    +032     * @param start the packed float HSLuv color to start with
    +033     * @param end the packed float HSLuv color to end on
    +034     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +035     * @return a new FloatList that contains the requested gradient
    +036     */
    +037    public static FloatList makeGradient(float start, float end, int steps) {
    +038        return makeGradient(start, end, steps, Interpolations.linear);
    +039    }
    +040    /**
    +041     * Creates a FloatList gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color
    +042     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    +043     * @param start the packed float HSLuv color to start with
    +044     * @param end the packed float HSLuv color to end on
    +045     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +046     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +047     * @return a new FloatList that contains the requested gradient
    +048     */
    +049    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    +050        FloatList appending = new FloatList(steps);
    +051        if(steps <= 0) {
    +052            return appending;
    +053        }
    +054        if(steps == 1) {
    +055            appending.add(start);
    +056            return appending;
    +057        }
    +058        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +059        return appending;
    +060    }
    +061
    +062    /**
    +063     * Appends a gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color {@code end},
    +064     * taking the specified number of steps and using linear Interpolation for how it transitions.
    +065     * @param appending a FloatList that will be appended to
    +066     * @param start the packed float HSLuv color to start with
    +067     * @param end the packed float HSLuv color to end on
    +068     * @param steps how many steps the gradient should use; usually greater than 2
    +069     * @return {@code appending}, after adding the gradient to the end
    +070     */
    +071    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    +072        return appendGradient(appending, start, end, steps, Interpolations.linear);
    +073    }
    +074    /**
    +075     * Appends a gradient from the packed float HSLuv color {@code start} to the packed float HSLuv color {@code end},
    +076     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    +077     * @param appending a FloatList that will be appended to
    +078     * @param start the packed float HSLuv color to start with
    +079     * @param end the packed float HSLuv color to end on
    +080     * @param steps how many steps the gradient should use; usually greater than 2
    +081     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +082     * @return {@code appending}, after adding the gradient to the end
    +083     */
    +084    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    +085        if(appending == null)
    +086            return null;
    +087        if(steps <= 0) {
    +088            return appending;
    +089        }
    +090        if(steps == 1) {
    +091            appending.add(start);
    +092            return appending;
    +093        }
    +094        appending.ensureCapacity(steps);
    +095        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +096        return appending;
    +097    }
    +098
    +099    /**
    +100     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses linear
    +101     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +102     * {@code steps} colors.
    +103     * @param appending a FloatList that will be appended to
    +104     * @param steps how many steps the gradient should use; usually greater than 2
    +105     * @param chain an array or varargs of packed float HSLuv colors that this will interpolate through in order
    +106     * @return {@code appending}, after adding the gradient to the end
    +107     */
    +108    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    +109        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +110    }
    +111
    +112    /**
    +113     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses linear
    +114     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +115     * {@code steps} colors.
    +116     * @param appending a FloatList that will be appended to
    +117     * @param steps how many steps the gradient should use; usually greater than 2
    +118     * @param chain a FloatList of packed float HSLuv colors that this will interpolate through in order
    +119     * @return {@code appending}, after adding the gradient to the end
    +120     */
    +121    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    +122        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +123    }
    +124
    +125    /**
    +126     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses the specified
    +127     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +128     * end of {@code appending} and produces a total of {@code steps} colors.
    +129     * @param appending a FloatList that will be appended to
    +130     * @param steps how many steps the gradient should use; usually greater than 2
    +131     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +132     * @param chain a FloatList of packed float HSLuv colors that this will interpolate through in order
    +133     * @return {@code appending}, after adding the gradient to the end
    +134     */
    +135    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    +136        if (appending == null)
    +137            return null;
    +138        if(chain == null)
    +139            return appending;
    +140        if (steps <= 0 || chain.size() == 0) {
    +141            return appending;
    +142        }
    +143        if (steps == 1 || chain.size() == 1) {
    +144            appending.add(chain.first());
    +145            return appending;
    +146        }
    +147        appending.ensureCapacity(steps);
    +148        int limit = steps - 1, splits = chain.size() - 1;
    +149        float step = 1f / steps, change = 0f;
    +150        for (int i = 0; i < limit; i++) {
    +151            float interp = interpolation.apply(change);
    +152            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +153            int idx = (int)splint;
    +154            appending.add(ColorTools.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    +155            change += step;
    +156        }
    +157        appending.add(chain.get(splits));
    +158        return appending;
    +159    }
    +160
    +161    /**
    +162     * Appends a gradient between several packed float HSLuv colors provided in {@code chain}. This uses the specified
    +163     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +164     * end of {@code appending} and produces a total of {@code steps} colors.
    +165     * @param appending a FloatList that will be appended to
    +166     * @param steps how many steps the gradient should use; usually greater than 2
    +167     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +168     * @param chain an array or varargs of packed float HSLuv colors that this will interpolate through in order
    +169     * @return {@code appending}, after adding the gradient to the end
    +170     */
    +171    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    +172        if (appending == null)
    +173            return null;
    +174        if(chain == null)
    +175            return appending;
    +176        if (steps <= 0 || chain.length == 0) {
    +177            return appending;
    +178        }
    +179        if (steps == 1 || chain.length == 1) {
    +180            appending.add(chain[0]);
    +181            return appending;
    +182        }
    +183        appending.ensureCapacity(steps);
    +184        int limit = steps - 1, splits = chain.length - 1;
    +185        float step = 1f / steps, change = 0f;
    +186        for (int i = 0; i < limit; i++) {
    +187            float interp = interpolation.apply(change);
    +188            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +189            int idx = (int)splint;
    +190            appending.add(ColorTools.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    +191            change += step;
    +192        }
    +193        appending.add(chain[splits]);
    +194        return appending;
    +195    }
    +196
    +197    /**
    +198     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    +199     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +200     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +201     * number of steps, it just doesn't append {@code end} in the last step.
    +202     * @param appending a FloatList that will be appended to
    +203     * @param start the packed float HSLuv color to start with
    +204     * @param end the packed float HSLuv color to end just before
    +205     * @param steps how many steps the gradient should use; usually greater than 2
    +206     * @return {@code appending}, after adding the gradient to its end
    +207     */
    +208    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    +209        return appendPartialGradient(appending, start, end, steps, Interpolations.linear);
    +210    }
    +211    /**
    +212     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    +213     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +214     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +215     * number of steps, it just doesn't append {@code end} in the last step.
    +216     * @param appending a FloatList that will be appended to
    +217     * @param start the packed float HSLuv color to start with
    +218     * @param end the packed float HSLuv color to end just before
    +219     * @param steps how many steps the gradient should use; usually greater than 2
    +220     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    +221     * @return {@code appending}, after adding the gradient to its end
    +222     */
    +223    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    +224        if(appending == null)
    +225            return null;
    +226        if(steps <= 0) {
    +227            return appending;
    +228        }
    +229        if(steps == 1) {
    +230            appending.add(start);
    +231            return appending;
    +232        }
    +233        int limit = steps;
    +234        float step = 1f / steps, change = 0f;
    +235        for (int i = 0; i < limit; i++) {
    +236            appending.add(ColorTools.lerpFloatColors(start, end, interpolation.apply(change)));
    +237            change += step;
    +238        }
    +239        return appending;
    +240    }
    +241}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html
    index 505fbba5..aa328d71 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/ColorTools.html
    @@ -14,1034 +14,1035 @@
     
    001package com.github.tommyettinger.colorful.pure.ipt;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.MathTools;
    -005import com.github.tommyettinger.digital.BitConversion;
    -006import com.github.tommyettinger.random.EnhancedRandom;
    -007
    -008import java.util.Random;
    -009
    -010/**
    -011 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the IPT color space.
    -012 * IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and even
    -013 * though the version here gives up the complex exponential adjustments to various components that the original IPT
    -014 * paper used, it still is pretty good at preserving perceptual lightness. In most regards, this is a more
    -015 * thoroughly-constructed color space than YCwCm, but YCwCm may still be useful because of how it maps to aesthetic
    -016 * components of color. See {@link #ipt(float, float, float, float)} for docs on the I, P, and T channels.
    -017 */
    -018public class ColorTools {
    -019        /**
    -020         * Gets a packed float representation of a color given as 4 float components, here, I (intensity or lightness), P
    -021         * (protan, a chromatic component ranging from greenish to reddish), T (tritan, a chromatic component ranging from
    -022         * bluish to yellowish), and A (alpha or opacity). Intensity should be between 0 and 1, inclusive, with 0 used for
    -023         * very dark colors (almost only black), and 1 used for very light colors (almost only white). Protan and tritan
    -024         * range from 0.0 to 1.0, with grayscale results when both are about 0.5. There's some aesthetic value in changing
    -025         * just one chroma value. When protan is high and tritan is low, the color is more purple/magenta, when both are low
    -026         * it is more bluish, when tritan is high and protan is low, the color tends to be greenish, and when both are high
    -027         * it tends to be orange. When protan and tritan are both near 0.5f, the color is closer to gray.  Alpha is the
    -028         * multiplicative opacity of the color, and acts like RGBA's alpha.
    -029         * <br>
    -030         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as
    -031         * intensity, protan, and tritan, but they will only be reversible from the returned float color to the original I,
    -032         * P, and T values if the original values were in the range that {@link #intensity(float)}, {@link #protan(float)},
    -033         * and {@link #tritan(float)} return.
    -034         *
    -035         * @param intens     0f to 1f, intensity or I component of IPT, with 0.5f meaning "no change" and 1f brightening
    -036         * @param protan     0f to 1f, protan or P component of IPT, with 1f more orange, red, or magenta
    -037         * @param tritan     0f to 1f, tritan or T component of IPT, with 1f more green, yellow, or red
    -038         * @param alpha      0f to 1f, 0f makes the color transparent and 1f makes it opaque 
    -039         * @return a float encoding a color with the given properties
    -040         */
    -041        public static float ipt(float intens, float protan, float tritan, float alpha) {
    -042                return BitConversion.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (tritan * 255) << 16 & 0xFF0000)
    -043                                | ((int) (protan * 255) << 8 & 0xFF00) | ((int) (intens * 255) & 0xFF));
    -044        }
    -045
    -046        /**
    -047         * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)} to an RGBA8888 int.
    -048         * This format of int can be used with Pixmap and in some other places in libGDX.
    -049         * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)}
    -050         * @return an RGBA8888 int color
    -051         */
    -052        public static int toRGBA8888(final float packed)
    -053        {
    -054                final int decoded = BitConversion.floatToRawIntBits(packed);
    -055                final float i = (decoded & 0xff) / 255f;
    -056                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -057                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -058                final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255);
    -059                final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255);
    -060                final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255);
    -061                return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
    -062        }
    -063
    -064        /**
    -065         * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)}
    -066         * to a packed float in RGBA format.
    -067         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    -068         * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)}
    -069         * @return a packed float color as RGBA
    -070         */
    -071        public static float toRGBA(final float packed)
    -072        {
    -073                final int decoded = BitConversion.floatToRawIntBits(packed);
    -074                final float i = (decoded & 0xff) / 255f;
    -075                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -076                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -077                final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255);
    -078                final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255);
    -079                final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255);
    -080                return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
    -081        }
    -082
    -083        /**
    -084         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses.
    -085         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
    -086         * @return a packed float as IPT, which this class can use
    -087         */
    -088        public static float fromRGBA8888(final int rgba) {
    -089                final float r = (rgba >>> 24) * 0x1.010101010101p-8f;
    -090                final float g = (rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f;
    -091                final float b = (rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f;
    -092                return BitConversion.intBitsToFloat(
    -093                                      Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255)
    -094                                                | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8
    -095                                                | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16
    -096                                                | (rgba & 0xFE) << 24);
    -097        }
    -098
    -099        /**
    -100         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses.
    -101         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
    -102         * @return a packed float as IPT, which this class can use
    -103         */
    -104        public static float fromRGBA(final float packed) {
    -105                final int abgr = BitConversion.floatToRawIntBits(packed);
    -106                final float r = (abgr & 0xFF) * 0x1.010101010101p-8f;
    -107                final float g = (abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f;
    -108                final float b = (abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f;
    -109
    -110                return BitConversion.intBitsToFloat(
    -111                                          Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.999f), 0), 255)
    -112                                                | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8
    -113                                                | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16
    -114                                                | (abgr & 0xFE000000));
    -115        }
    -116
    -117        /**
    -118         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the IPT format this uses.
    -119         * @param r red, from 0.0 to 1.0 (both inclusive)
    -120         * @param g green, from 0.0 to 1.0 (both inclusive)
    -121         * @param b blue, from 0.0 to 1.0 (both inclusive)
    -122         * @param a alpha, from 0.0 to 1.0 (both inclusive)
    -123         * @return a packed float as IPT, which this class can use
    -124         */
    -125        public static float fromRGBA(final float r, final float g, final float b, final float a) {
    -126                return BitConversion.intBitsToFloat(
    -127                                          Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255)
    -128                                                | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8
    -129                                                | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16
    -130                                                | ((int)(a * 255f) << 24 & 0xFE000000));
    -131        }
    -132
    -133        /**
    -134         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -135         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -136         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
    -137         */
    -138        public static int redInt(final float encoded)
    -139        {
    -140                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -141                final float i = (decoded & 0xff) / 255f;
    -142                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -143                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -144                return Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255);
    -145        }
    -146
    -147        /**
    -148         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -149         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -150         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
    -151         */
    -152        public static int greenInt(final float encoded)
    -153        {
    -154                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -155                final float i = (decoded & 0xff) / 255f;
    -156                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -157                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -158                return Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255);
    -159        }
    -160
    -161        /**
    -162         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -163         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -164         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
    -165         */
    -166        public static int blueInt(final float encoded)
    -167        {
    -168                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -169                final float i = (decoded & 0xff) / 255f;
    -170                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -171                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -172                return Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255);
    -173        }
    -174
    -175        /**
    -176         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
    -177         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    -178         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -179         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
    -180         */
    -181        public static int alphaInt(final float encoded)
    -182        {
    -183                return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
    -184        }
    -185
    -186        /**
    -187         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -188         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -189         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
    -190         */
    -191        public static float red(final float encoded)
    -192        {
    -193                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -194                final float i = (decoded & 0xff) / 255f;
    -195                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -196                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -197                return Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    -198        }
    -199
    -200        /**
    -201         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -202         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -203         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
    -204         */
    -205        public static float green(final float encoded)
    -206        {
    -207                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -208                final float i = (decoded & 0xff) / 255f;
    -209                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -210                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -211                return Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    -212        }
    -213
    -214        /**
    -215         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -216         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -217         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
    -218         */
    -219        public static float blue(final float encoded)
    -220        {
    -221                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -222                final float i = (decoded & 0xff) / 255f;
    -223                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -224                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -225                return Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    -226        }
    -227
    -228        /**
    -229         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -230         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -231         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
    -232         */
    -233        public static float alpha(final float encoded)
    -234        {
    -235                return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
    -236        }
    -237
    -238        /**
    -239         * Gets a color as an IPT packed float given floats representing hue, saturation, lightness, and opacity.
    -240         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
    -241         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
    -242         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
    -243         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
    -244         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
    -245         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
    -246         * of high-saturation where lightness is 0.5f.
    -247         *
    -248         * @param hue        0f to 1f, color wheel position
    -249         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
    -250         * @param lightness  0f to 1f, 0f is black and 1f is white
    -251         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
    -252         * @return a float encoding a color with the given properties
    -253         */
    -254        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
    -255                if (lightness <= 0.001f) {
    -256                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    -257                } else {
    -258                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    -259                }
    -260        }
    -261
    -262        /**
    -263         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    -264         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -265         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    -266         */
    -267        public static float saturation(final float encoded) {
    -268                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -269                final float i = (decoded & 0xff) / 255f;
    -270                if(Math.abs(i - 0.5) > 0.495f) return 0f;
    -271                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -272                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -273                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    -274                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    -275                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    -276                float x, y, w;
    -277                if(g < b) {
    -278                        x = b;
    -279                        y = g;
    -280                }
    -281                else {
    -282                        x = g;
    -283                        y = b;
    -284                }
    -285                if(r < x) {
    -286                        w = r;
    -287                }
    -288                else {
    -289                        w = x;
    -290                        x = r;
    -291                }
    -292                return x - Math.min(w, y);
    -293//              float d = x - Math.min(w, y);
    -294//              float li = x * (1f - 0.5f * d / (x + 1e-10f));
    -295//              return (x - li); // (Math.min(li, 1f - li) + 1e-10f);
    -296        }
    -297
    -298        public static float lightness(final float encoded) {
    -299                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -300                final float i = (decoded & 0xff) / 255f;
    -301                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -302                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -303                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    -304                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    -305                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    -306
    -307                float x, y, w;
    -308                if(g < b) {
    -309                        x = b;
    -310                        y = g;
    -311                }
    -312                else {
    -313                        x = g;
    -314                        y = b;
    -315                }
    -316                if(r < x) {
    -317                        w = r;
    -318                }
    -319                else {
    -320                        w = x;
    -321                        x = r;
    -322                }
    -323                float d = x - Math.min(w, y);
    -324                return x * (1f - 0.5f * d / (x + 1e-10f));
    -325        }
    -326
    -327        /**
    -328         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    -329         * to 1f (exclusive, red and approaching purple if decreased).
    -330         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    -331         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    -332         * eventually to purple before looping back to almost the same red (1.0, exclusive)
    -333         */
    -334        public static float hue(final float encoded) {
    -335                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -336                final float i = (decoded & 0xff) / 255f;
    -337                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -338                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -339                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    -340                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    -341                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    -342                float x, y, z, w;
    -343                if(g < b) {
    -344                        x = b;
    -345                        y = g;
    -346                        z = -1f;
    -347                        w = 2f / 3f;
    -348                }
    -349                else {
    -350                        x = g;
    -351                        y = b;
    -352                        z = 0f;
    -353                        w = -1f / 3f;
    -354                }
    -355                if(r < x) {
    -356                        z = w;
    -357                        w = r;
    -358                }
    -359                else {
    -360                        w = x;
    -361                        x = r;
    -362                }
    -363                float d = x - Math.min(w, y);
    -364                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
    -365        }
    -366
    -367        /**
    -368         * The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to
    -369         * 1.0f . You can edit the intensity of a color with {@link #lighten(float, float)} and
    -370         * {@link #darken(float, float)}.
    -371         *
    -372         * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)}
    -373         * @return the intensity value as a float from 0.0f to 1.0f
    -374         */
    -375        public static float intensity(final float encoded)
    -376        {
    -377                return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    -378        }
    -379
    -380        /**
    -381         * The "protan" of the given packed float in IPT format, which when combined with tritan describes the
    -382         * hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or
    -383         * blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with
    -384         * {@link #protanUp(float, float)} and {@link #protanDown(float, float)}.
    -385         * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)}
    -386         * @return the protan value as a float from 0.0f to 1.0f
    -387         */
    -388        public static float protan(final float encoded)
    -389        {
    -390                return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    -391        }
    -392
    -393        /**
    -394         * The "tritan" of the given packed float in IPT format, which when combined with protan describes the
    -395         * hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more
    -396         * blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit
    -397         * the tritan of a color with {@link #tritanUp(float, float)} and {@link #tritanDown(float, float)}.
    -398         * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)}
    -399         * @return the tritan value as a float from 0.0f to 1.0f
    -400         */
    -401        public static float tritan(final float encoded)
    -402        {
    -403                return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    -404        }
    -405
    -406        /**
    -407         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    -408         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not IPT! Takes
    -409         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    -410         * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is
    -411         * likely to be different than the result of {@link #ipt(float, float, float, float)} unless hue, saturation,
    -412         * lightness, and opacity are all 0. This won't allocate any objects.
    -413         * <br>
    -414         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    -415         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    -416         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    -417         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    -418         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    -419         *
    -420         * @param basis      a packed float color that will be used as the starting point to make the next color
    -421         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    -422         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    -423         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    -424         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    -425         * @return a float encoding a variation of basis with the given changes
    -426         */
    -427        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    -428                final int e = BitConversion.floatToRawIntBits(basis);
    -429                final float i = Math.min(Math.max(light + (e & 0xff) / 255f, 0f), 1f);
    -430                opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
    -431                if (i <= 0.001f)
    -432                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
    -433                final float p = ((e >>> 7 & 0x1fe) - 0xff) / 255f;
    -434                final float t = ((e >>> 15 & 0x1fe) - 0xff) / 255f;
    -435                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    -436                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    -437                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    -438                float x, y, z, w;
    -439                if(g < b) {
    -440                        x = b;
    -441                        y = g;
    -442                        z = -1f;
    -443                        w = 2f / 3f;
    -444                }
    -445                else {
    -446                        x = g;
    -447                        y = b;
    -448                        z = 0f;
    -449                        w = -1f / 3f;
    -450                }
    -451                if(r < x) {
    -452                        z = w;
    -453                        w = r;
    -454                }
    -455                else {
    -456                        w = x;
    -457                        x = r;
    -458                }
    -459                final float d = x - Math.min(w, y);
    -460                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
    -461                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
    -462                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    -463                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    -464        }
    -465
    -466        /**
    -467         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    -468         * start as-is) and 1f (return white), start should be a packed color, as from
    -469         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -470         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -471         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    -472         * @see #darken(float, float) the counterpart method that darkens a float color
    -473         * @param start the starting color as a packed float
    -474         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    -475         * @return a packed float that represents a color between start and white
    -476         */
    -477        public static float lighten(final float start, final float change) {
    -478                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    -479                return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
    -480        }
    -481
    -482        /**
    -483         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    -484         * start as-is) and 1f (return black), start should be a packed color, as from
    -485         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -486         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -487         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    -488         * @see #lighten(float, float) the counterpart method that lightens a float color
    -489         * @param start the starting color as a packed float
    -490         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    -491         * @return a packed float that represents a color between start and black
    -492         */
    -493        public static float darken(final float start, final float change) {
    -494                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    -495                return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
    -496        }
    -497
    -498        /**
    -499         * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
    -500         * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
    -501         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -502         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    -503         * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    -504         * alpha and intensity of start as-is.
    -505         * @see #protanDown(float, float) the counterpart method that cools a float color
    -506         * @param start the starting color as a packed float
    -507         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
    -508         * @return a packed float that represents a color between start and a warmer color
    -509         */
    -510        public static float protanUp(final float start, final float change) {
    -511                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -512                return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    -513        }
    -514
    -515        /**
    -516         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
    -517         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
    -518         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -519         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -520         * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
    -521         * intensity of start as-is.
    -522         * @see #protanUp(float, float) the counterpart method that warms a float color
    -523         * @param start the starting color as a packed float
    -524         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
    -525         * @return a packed float that represents a color between start and a cooler color
    -526         */
    -527        public static float protanDown(final float start, final float change) {
    -528                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -529                return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    -530        }
    -531
    -532        /**
    -533         * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    -534         * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as
    -535         * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary
    -536         * Colors, and is a little more efficient and clear than using
    -537         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
    -538         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and intensity of start as-is.
    -539         * @see #tritanDown(float, float) the counterpart method that makes a float color less natural
    -540         * @param start the starting color as a packed float
    -541         * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
    -542         * @return a packed float that represents a color between start and a more natural color
    -543         */
    -544        public static float tritanUp(final float start, final float change) {
    -545                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -546                return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    -547        }
    -548
    -549        /**
    -550         * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    -551         * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as
    -552         * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary
    -553         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -554         * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    -555         * alpha and intensity of start as-is.
    -556         * @see #tritanUp(float, float) the counterpart method that makes a float color less artificial
    -557         * @param start the starting color as a packed float
    -558         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
    -559         * @return a packed float that represents a color between start and a more artificial color
    -560         */
    -561        public static float tritanDown(final float start, final float change) {
    -562                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -563                return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    -564        }
    -565
    -566        /**
    -567         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    -568         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    -569         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -570         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -571         * transparent. This won't change the intensity, protan, or tritan of the color.
    -572         * @see #fade(float, float) the counterpart method that makes a float color more translucent
    -573         * @param start the starting color as a packed float
    -574         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    -575         * @return a packed float that represents a color between start and its opaque version
    -576         */
    -577        public static float blot(final float start, final float change) {
    -578                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    -579                return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    -580        }
    -581
    -582        /**
    -583         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    -584         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    -585         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -586         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -587         * transparent. This won't change the intensity, protan, or tritan of the color.
    -588         * @see #blot(float, float) the counterpart method that makes a float color more opaque
    -589         * @param start the starting color as a packed float
    -590         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    -591         * @return a packed float that represents a color between start and transparent
    -592         */
    -593        public static float fade(final float start, final float change) {
    -594                final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    -595                return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    -596        }
    -597
    -598        /**
    -599         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
    -600         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    -601         * from {@link #ipt(float, float, float, float)}. This only changes protan and tritan; it leaves intensity and alpha
    -602         * alone, unlike {@link #lessenChange(float, float)}, which usually changes intensity.
    -603         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    -604         * @param start the starting color as a packed float
    -605         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    -606         * @return a packed float that represents a color between start and a desaturated color
    -607         */
    -608        public static float dullen(final float start, final float change) {
    -609                final int s = BitConversion.floatToRawIntBits(start);
    -610                return ipt((s & 0xFF) / 255f,
    -611                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    -612                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    -613                                (s >>> 25) / 127f);
    -614        }
    -615
    -616        /**
    -617         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
    -618         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    -619         * from {@link #ipt(float, float, float, float)}. This usually changes only protan and tritan, but higher values for
    -620         * {@code change} can force the color out of the gamut, which this corrects using
    -621         * {@link #limitToGamut(float, float, float, float)} (and that can change intensity somewhat). If the color stays
    -622         * in-gamut, then intensity won't change; alpha never changes.
    -623         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    -624         * @param start the starting color as a packed float
    -625         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    -626         * @return a packed float that represents a color between start and a saturated color
    -627         */
    -628        public static float enrich(final float start, final float change) {
    -629                final int s = BitConversion.floatToRawIntBits(start);
    -630                return limitToGamut((s & 0xFF) / 255f,
    -631                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    -632                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    -633                                (s >>> 25) / 127f);
    -634        }
    -635
    -636        /**
    -637         * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast with,
    -638         * gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T
    -639         * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
    -640         * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows
    -641         * most of the colors this method produces to contrast well as a foreground when displayed on a background of
    -642         * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the
    -643         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
    -644         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
    -645         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
    -646         * {@code contrastingColor} without losing its other qualities.
    -647         * @param mainColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; this is the color that will be adjusted
    -648         * @param contrastingColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; the adjusted mainColor will contrast with this
    -649         * @return a different IPT packed float color, based on mainColor but with potentially very different lightness
    -650         */
    -651        public static float inverseLightness(final float mainColor, final float contrastingColor)
    -652        {
    -653                final int bits = BitConversion.floatToRawIntBits(mainColor),
    -654                                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    -655                                i = (bits & 0xff),
    -656                                p = (bits >>> 8 & 0xff),
    -657                                t = (bits >>> 16 & 0xff),
    -658                                ci = (contrastBits & 0xff),
    -659                                cp = (contrastBits >>> 8 & 0xff),
    -660                                ct = (contrastBits >>> 16 & 0xff);
    -661                if((p - cp) * (p - cp) + (t - ct) * (t - ct) >= 0x10000)
    -662                        return mainColor;
    -663                return ipt(ci < 128 ? i * (0.45f / 255f) + 0.55f : 0.5f - i * (0.45f / 255f), p / 255f, t / 255f, 0x1.0p-8f * (bits >>> 24));
    -664        }
    -665
    -666        /**
    -667         * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast
    -668         * with, gets a packed float IPT color with I that should be quite different from {@code contrastingColor}'s I,
    -669         * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
    -670         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
    -671         * a background of {@code contrastingColor}, or vice versa.
    -672         * <br>
    -673         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    -674         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    -675         * averages the original I of mainColor with the modified one, this tends to not produce harsh color changes.
    -676         * @param mainColor a packed IPT float color; this is the color that will be adjusted
    -677         * @param contrastingColor a packed IPT float color; the adjusted mainColor will contrast with the I of this
    -678         * @return a different packed IPT float color, based on mainColor but typically with different lightness
    -679         */
    -680        public static float differentiateLightness(final float mainColor, final float contrastingColor)
    -681        {
    -682                final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    -683                return limitToGamut(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
    -684        }
    -685
    -686        /**
    -687         * Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that
    -688         * with the original I. This means light colors become darker, and dark colors become lighter, with almost all
    -689         * results in the middle-range of possible lightness.
    -690         * @param mainColor a packed IPT float color
    -691         * @return a different packed IPT float color, with its I channel changed and limited to the correct gamut
    -692         */
    -693        public static float offsetLightness(final float mainColor) {
    -694                final int decoded = BitConversion.floatToRawIntBits(mainColor);
    -695                return limitToGamut(BitConversion.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1));
    -696        }
    -697
    -698        /**
    -699         * Makes the additive IPT color stored in {@code color} cause less of a change when used as a tint, as if it were
    -700         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    -701         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    -702         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    -703         * @param color a color that should have its tinting effect potentially weakened
    -704         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    -705         * @return an IPT float color between gray and {@code color}
    -706         */
    -707        public static float lessenChange(final float color, float fraction) {
    -708                final int e = BitConversion.floatToRawIntBits(color),
    -709                                is = 0x80, ps = 0x80, ts = 0x80,
    -710                                ie = (e & 0xFF), pe = (e >>> 8) & 0xFF, te = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
    -711                return BitConversion.intBitsToFloat(((int) (is + fraction * (ie - is)) & 0xFF)
    -712                                | (((int) (ps + fraction * (pe - ps)) & 0xFF) << 8)
    -713                                | (((int) (ts + fraction * (te - ts)) & 0xFF) << 16)
    -714                                | (ae << 24));
    -715        }
    -716
    -717        /**
    -718         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    -719         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    -720         * be different each time this is called, and can be obtained from a random number generator to make the colors more
    -721         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    -722         * produce two similar colors in a row unless variance is very small. The variance affects the I, P, and T of the
    -723         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    -724         * isn't greater than the variance (this considers P and T extra-wide, going from -1 to 1, while I goes from 0 to 1,
    -725         * but only internally for measuring distance).
    -726         * @param color a packed float color, as produced by {@link #ipt(float, float, float, float)}
    -727         * @param seed a long seed that should be different on each call; should not be 0
    -728         * @param variance max amount of difference between the given color and the generated color; always less than 1
    -729         * @return a generated packed float color that should be at least somewhat different from {@code color}
    -730         */
    -731        public static float randomEdit(final float color, long seed, final float variance) {
    -732                final int decoded = BitConversion.floatToRawIntBits(color);
    -733                final float i = (decoded & 0xff) / 255f;
    -734                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -735                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -736                final float limit = variance * variance;
    -737                float dist, x, y, z;
    -738                for (int j = 0; j < 50; j++) {
    -739                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -740                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -741                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -742                        seed += 0x9E3779B97F4A7C15L;
    -743                        dist = x * x + y * y + z * z;
    -744                        if(dist <= limit && inGamut(x += i, y = (p + y) * 0.5f + 0.5f, z = (t + z) * 0.5f + 0.5f))
    -745                                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000)
    -746                                        | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f));
    -747                }
    -748                return color;
    -749        }
    -750
    -751        /**
    -752         * Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA. 
    -753         * @param packed a packed float color as IPT
    -754         * @return true if the given packed float color can be converted back and forth to RGBA
    -755         */
    -756        public static boolean inGamut(final float packed)
    -757        {
    -758                final int decoded = BitConversion.floatToRawIntBits(packed);
    -759                final float i = (decoded & 0xff) / 255f;
    -760                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -761                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -762                final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t;
    -763                if(r < -0.006f || r > 1.003f) return false;
    -764                final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t;
    -765                if(g < -0.006f || g > 1.003f)
    -766                        return false;
    -767                final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t;
    -768                return (b >= -0.006f && b <= 1.003f);
    -769        }
    -770        /**
    -771         * Returns true if the given IPT values are valid to convert losslessly back to RGBA. 
    -772         * @param i intensity channel, as a float from 0 to 1
    -773         * @param p protan channel, as a float from 0 to 1
    -774         * @param t tritan channel, as a float from 0 to 1
    -775         * @return true if the given packed float color can be converted back and forth to RGBA
    -776         */
    -777        public static boolean inGamut(float i, float p, float t)
    -778        {
    -779                p = (p - 0.5f) * 2f;
    -780                t = (t - 0.5f) * 2f;
    -781                final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t;
    -782                if(r < -0.006f || r > 1.003f) return false;
    -783                final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t;
    -784                if(g < -0.006f || g > 1.003f)
    -785                        return false;
    -786                final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t;
    -787                return (b >= -0.006f && b <= 1.003f);
    -788        }
    -789
    -790        /**
    -791         * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it
    -792         * isn't in-gamut, or returns it as soon as it is in-gamut.
    -793         * @param packed a packed float color in IPT format; often this color is not in-gamut
    -794         * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    -795         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
    -796         */
    -797        public static float limitToGamut(final float packed) {
    -798                final int decoded = BitConversion.floatToRawIntBits(packed);
    -799                final float i = (decoded & 0xff) / 255f;
    -800                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -801                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -802                float i2 = i, p2 = p, t2 = t;
    -803                for (int attempt = 31; attempt >= 0; attempt--) {
    -804                        final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2;
    -805                        final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2;
    -806                        final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2;
    -807                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -808                                break;
    -809                        final float progress = attempt * 0x1p-5f;
    -810                        i2 = MathTools.lerp(0.5f, i, progress);
    -811                        p2 = MathTools.lerp(0, p, progress);
    -812                        t2 = MathTools.lerp(0, t, progress);
    -813                }
    -814                return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    -815        }
    -816
    -817        /**
    -818         * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it
    -819         * isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color.
    -820         * @param i intensity component; will be clamped between 0 and 1 if it isn't already
    -821         * @param p protan component; will be clamped between 0 and 1 if it isn't already
    -822         * @param t tritan component; will be clamped between 0 and 1 if it isn't already
    -823         * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    -824         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    -825         */
    -826        public static float limitToGamut(float i, float p, float t) {
    -827                return limitToGamut(i, p, t, 1f);
    -828        }
    -829        /**
    -830         * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it
    -831         * isn't in-gamut, or returns it as soon as it is in-gamut.
    -832         * @param i intensity component; will be clamped between 0 and 1 if it isn't already
    -833         * @param p protan component; will be clamped between 0 and 1 if it isn't already
    -834         * @param t tritan component; will be clamped between 0 and 1 if it isn't already
    -835         * @param a alpha component; will be clamped between 0 and 1 if it isn't already
    -836         * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    -837         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    -838         */
    -839        public static float limitToGamut(float i, float p, float t, float a) {
    -840                float i2 = i = Math.min(Math.max(i, 0f), 1f);
    -841                float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f);
    -842                float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f);
    -843                a = Math.min(Math.max(a, 0f), 1f);
    -844                for (int attempt = 31; attempt >= 0; attempt--) {
    -845                        final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2;
    -846                        final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2;
    -847                        final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2;
    -848                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -849                                break;
    -850                        final float progress = attempt * 0x1p-5f;
    -851                        i2 = MathTools.lerp(0.5f, i, progress);
    -852                        p2 = MathTools.lerp(0, p, progress);
    -853                        t2 = MathTools.lerp(0, t, progress);
    -854                }
    -855                return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a);
    -856        }
    -857        /**
    -858         * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the
    -859         * corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float
    -860         * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This
    -861         * clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    -862         * @param encoded a packed float IPT color
    -863         * @param addI how much to add to the intensity channel; typically in the -1 to 1 range
    -864         * @param addP how much to add to the protan channel; typically in the -2 to 2 range
    -865         * @param addT how much to add to the tritan channel; typically in the -2 to 2 range
    -866         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -867         * @return a packed float IPT color with the requested edits applied to {@code encoded}
    -868         */
    -869        public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha) {
    -870                return editIPT(encoded, addI, addP, addT, addAlpha, 1f, 1f, 1f, 1f);
    -871        }
    -872        /**
    -873         * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first
    -874         * multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter,
    -875         * before clamping. This means the intensity value is multiplied by {@code mulI}, then has {@code addI} added, and
    -876         * then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the
    -877         * given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay
    -878         * unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and
    -879         * tritan in the -1 to 1 range, so if you multiply by a small number like {@code 0.25f}, then this will produce a
    -880         * less-saturated color, and if you multiply by a larger number like {@code 4f}, then you will get a much
    -881         * more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back
    -882         * to RGBA.
    -883         * @param encoded a packed float IPT color
    -884         * @param addI how much to add to the intensity channel; typically in the -1 to 1 range
    -885         * @param addP how much to add to the protan channel; typically in the -2 to 2 range
    -886         * @param addT how much to add to the tritan channel; typically in the -2 to 2 range
    -887         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -888         * @param mulI how much to multiply the intensity channel by; should be non-negative
    -889         * @param mulP how much to multiply the protan channel by; usually non-negative (not always)
    -890         * @param mulT how much to multiply the tritan channel by; usually non-negative (not always)
    -891         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    -892         * @return a packed float IPT color with the requested edits applied to {@code encoded}
    -893         */
    -894        public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha,
    -895                                                                float mulI, float mulP, float mulT, float mulAlpha) {
    -896                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -897                float i = (decoded & 0xff) / 255f;
    -898                float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -899                float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -900                float alpha = (decoded >>> 25) / 127f;
    -901
    -902                float i2 = Math.min(Math.max(i * mulI + addI, 0f), 1f);
    -903                float p2 = p = Math.min(Math.max(p * mulP + addP, -1f), 1f);
    -904                float t2 = t = Math.min(Math.max(t * mulT + addT, -1f), 1f);
    -905                alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    -906                for (int attempt = 31; attempt >= 0; attempt--) {
    -907                        final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2;
    -908                        final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2;
    -909                        final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2;
    -910                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    -911                                break;
    -912                        final float progress = attempt * 0x1p-5f;
    -913                        p2 = MathTools.lerp(0, p, progress);
    -914                        t2 = MathTools.lerp(0, t, progress);
    -915                }
    -916                return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, alpha);
    -917        }
    -918
    -919        /**
    -920         * Converts from a packed float in HSI format to a packed float in IPT format.
    -921         * @param packed a packed float in HSI format
    -922         * @return a packed float in IPT format
    -923         */
    -924        public static float fromHSI(float packed){
    -925                final int decoded = BitConversion.floatToRawIntBits(packed);
    -926                final float h = (decoded & 0xff) / 255f;
    -927                final float s = (decoded >>> 8 & 0xff) / 255f;
    -928                final float i = (decoded >>> 16 & 0xff) / 255f;
    -929                final float y = MathTools.cos_(h) * s, z = MathTools.sin_(h) * s;
    -930                final float crMid = 0.3481738f * y + 0.104959644f * z;
    -931                final float crScale = (i - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid;
    -932                final float mgMid = 0.122068435f * y + -0.070396f * z;
    -933                final float mgScale = (i + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid;
    -934                final float ybMid = 0.020876605f * y + -0.26078433f * z;
    -935                final float ybScale = (i - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid;
    -936                final float scale = Math.max(crScale, Math.max(mgScale, ybScale));
    -937                final float d = 4f * s * scale / (MathTools.sin(3.14159f * i) + 0.000001f);
    -938
    -939                final float p = y * d;
    -940                final float t = z * d;
    -941                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000)
    -942                                | ((int) (p * 255) << 8 & 0xFF00) | (decoded >>> 16 & 0xFF));
    -943        }
    -944
    -945        /**
    -946         * Converts from hue, saturation, intensity, and alpha components (each ranging from 0 to 1 inclusive) to a packed
    -947         * float color in IPT format.
    -948         * @param hue hue, from 0 to 1 inclusive; 0 is red, 0.25 is yellow, 0.75 is blue
    -949         * @param saturation saturation from 0 (grayscale) to a limit between 0 and 1 depending on intensity (it can be 1 only when intensity is 0.5)
    -950         * @param intensity intensity, or lightness, from 0 (black) to 1 (white)
    -951         * @param alpha alpha transparency/opacity, from 0 (fully transparent) to 1 (fully opaque)
    -952         * @return a packed float in IPT format
    -953         */
    -954        public static float fromHSI(float hue, float saturation, float intensity, float alpha){
    -955                final float y = MathTools.cos_(hue) * saturation, z = MathTools.sin_(hue) * saturation;
    -956                final float crMid = 0.3481738f * y + 0.104959644f * z;
    -957                final float crScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid;
    -958                final float mgMid = 0.122068435f * y + -0.070396f * z;
    -959                final float mgScale = (intensity + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid;
    -960                final float ybMid = 0.020876605f * y + -0.26078433f * z;
    -961                final float ybScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid;
    -962                final float scale = Math.max(crScale, Math.max(mgScale, ybScale));
    -963                final float d = 4f * saturation * scale / (MathTools.sin(3.14159f * intensity) + 0.000001f);
    -964
    -965                final float p = y * d;
    -966                final float t = z * d;
    -967                return BitConversion.intBitsToFloat(((int)(alpha * 255) << 24 & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000)
    -968                                | ((int) (p * 255) << 8 & 0xFF00) | ((int) (intensity * 255) & 0xFF));
    -969        }
    -970
    -971        /**
    -972         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    -973         * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.random.LaserRandom})
    -974         * @return a packed float color that is always in-gamut
    -975         */
    -976        public static float randomColor(Random random) {
    -977                final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f;
    -978                final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f;
    -979                final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f;
    -980                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    -981                return BitConversion.intBitsToFloat(0xFE000000
    -982                                | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000)
    -983                                | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00)
    -984                                | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF));
    -985        }
    -986
    -987        /**
    -988         * Produces a random packed float color that is always opaque and should be uniformly distributed.
    -989         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    -990         * and EnhancedRandom.
    -991         * @param random any subclass of juniper's EnhancedRandom, such as a
    -992         * {@link com.github.tommyettinger.random.DistinctRandom} or
    -993         * {@link com.github.tommyettinger.random.FourWheelRandom}
    -994         * @return a packed float color that is always in-gamut
    -995         */
    -996        public static float randomizedColor(EnhancedRandom random) {
    -997                final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f;
    -998                final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f;
    -999                final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f;
    -1000                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    -1001                return BitConversion.intBitsToFloat(0xFE000000
    -1002                                | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000)
    -1003                                | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00)
    -1004                                | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF));
    -1005        }
    -1006
    -1007        /**
    -1008         * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b)
    -1009         * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence,
    -1010         * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you
    -1011         * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to
    -1012         * avoid generating too many colors with high blue, for instance. This approximately maps the r, g, and b parameters
    -1013         * to distances on the RGB axes of a rectangular prism, which is stretched and rotated to form the IPT gamut.
    -1014         * @param r red value to use; will be clamped between 0 and 1
    -1015         * @param g green value to use; will be clamped between 0 and 1
    -1016         * @param b blue value to use; will be clamped between 0 and 1
    -1017         * @return a packed float color that is always opaque
    -1018         */
    -1019        public static float subrandomColor(float r, float g, float b) {
    -1020                r = Math.min(Math.max(r, 0f), 0.999f);
    -1021                g = Math.min(Math.max(g, 0f), 0.999f);
    -1022                b = Math.min(Math.max(b, 0f), 0.999f);
    -1023                final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f;
    -1024                final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f;
    -1025                final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f;
    -1026                return BitConversion.intBitsToFloat(0xFE000000
    -1027                                | ((int) ((tr * r + tg * g + tb * b) * 127.5f + 127.5f) << 16 & 0xFF0000)
    -1028                                | ((int) ((pr * r + pg * g + pb * b) * 127.5f + 127.5f) << 8 & 0xFF00)
    -1029                                | ((int) ((ir * r + ig * g + ib * b) * 255f) & 0xFF));
    -1030        }
    -1031}
    +004import com.github.tommyettinger.digital.MathTools;
    +005import com.github.tommyettinger.digital.TrigTools;
    +006import com.github.tommyettinger.digital.BitConversion;
    +007import com.github.tommyettinger.random.EnhancedRandom;
    +008
    +009import java.util.Random;
    +010
    +011/**
    +012 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the IPT color space.
    +013 * IPT has more perceptually-uniform handling of hue than some other color spaces, like YCwCm, and even
    +014 * though the version here gives up the complex exponential adjustments to various components that the original IPT
    +015 * paper used, it still is pretty good at preserving perceptual lightness. In most regards, this is a more
    +016 * thoroughly-constructed color space than YCwCm, but YCwCm may still be useful because of how it maps to aesthetic
    +017 * components of color. See {@link #ipt(float, float, float, float)} for docs on the I, P, and T channels.
    +018 */
    +019public class ColorTools {
    +020        /**
    +021         * Gets a packed float representation of a color given as 4 float components, here, I (intensity or lightness), P
    +022         * (protan, a chromatic component ranging from greenish to reddish), T (tritan, a chromatic component ranging from
    +023         * bluish to yellowish), and A (alpha or opacity). Intensity should be between 0 and 1, inclusive, with 0 used for
    +024         * very dark colors (almost only black), and 1 used for very light colors (almost only white). Protan and tritan
    +025         * range from 0.0 to 1.0, with grayscale results when both are about 0.5. There's some aesthetic value in changing
    +026         * just one chroma value. When protan is high and tritan is low, the color is more purple/magenta, when both are low
    +027         * it is more bluish, when tritan is high and protan is low, the color tends to be greenish, and when both are high
    +028         * it tends to be orange. When protan and tritan are both near 0.5f, the color is closer to gray.  Alpha is the
    +029         * multiplicative opacity of the color, and acts like RGBA's alpha.
    +030         * <br>
    +031         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as
    +032         * intensity, protan, and tritan, but they will only be reversible from the returned float color to the original I,
    +033         * P, and T values if the original values were in the range that {@link #intensity(float)}, {@link #protan(float)},
    +034         * and {@link #tritan(float)} return.
    +035         *
    +036         * @param intens     0f to 1f, intensity or I component of IPT, with 0.5f meaning "no change" and 1f brightening
    +037         * @param protan     0f to 1f, protan or P component of IPT, with 1f more orange, red, or magenta
    +038         * @param tritan     0f to 1f, tritan or T component of IPT, with 1f more green, yellow, or red
    +039         * @param alpha      0f to 1f, 0f makes the color transparent and 1f makes it opaque 
    +040         * @return a float encoding a color with the given properties
    +041         */
    +042        public static float ipt(float intens, float protan, float tritan, float alpha) {
    +043                return BitConversion.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (tritan * 255) << 16 & 0xFF0000)
    +044                                | ((int) (protan * 255) << 8 & 0xFF00) | ((int) (intens * 255) & 0xFF));
    +045        }
    +046
    +047        /**
    +048         * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)} to an RGBA8888 int.
    +049         * This format of int can be used with Pixmap and in some other places in libGDX.
    +050         * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)}
    +051         * @return an RGBA8888 int color
    +052         */
    +053        public static int toRGBA8888(final float packed)
    +054        {
    +055                final int decoded = BitConversion.floatToRawIntBits(packed);
    +056                final float i = (decoded & 0xff) / 255f;
    +057                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +058                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +059                final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255);
    +060                final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255);
    +061                final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255);
    +062                return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
    +063        }
    +064
    +065        /**
    +066         * Converts a packed float color in the format produced by {@link ColorTools#ipt(float, float, float, float)}
    +067         * to a packed float in RGBA format.
    +068         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    +069         * @param packed a packed float color, as produced by {@link ColorTools#ipt(float, float, float, float)}
    +070         * @return a packed float color as RGBA
    +071         */
    +072        public static float toRGBA(final float packed)
    +073        {
    +074                final int decoded = BitConversion.floatToRawIntBits(packed);
    +075                final float i = (decoded & 0xff) / 255f;
    +076                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +077                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +078                final int r = Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255);
    +079                final int g = Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255);
    +080                final int b = Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255);
    +081                return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
    +082        }
    +083
    +084        /**
    +085         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the IPT format this uses.
    +086         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
    +087         * @return a packed float as IPT, which this class can use
    +088         */
    +089        public static float fromRGBA8888(final int rgba) {
    +090                final float r = (rgba >>> 24) * 0x1.010101010101p-8f;
    +091                final float g = (rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f;
    +092                final float b = (rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f;
    +093                return BitConversion.intBitsToFloat(
    +094                                      Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255)
    +095                                                | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8
    +096                                                | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16
    +097                                                | (rgba & 0xFE) << 24);
    +098        }
    +099
    +100        /**
    +101         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the IPT format this uses.
    +102         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
    +103         * @return a packed float as IPT, which this class can use
    +104         */
    +105        public static float fromRGBA(final float packed) {
    +106                final int abgr = BitConversion.floatToRawIntBits(packed);
    +107                final float r = (abgr & 0xFF) * 0x1.010101010101p-8f;
    +108                final float g = (abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f;
    +109                final float b = (abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f;
    +110
    +111                return BitConversion.intBitsToFloat(
    +112                                          Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.999f), 0), 255)
    +113                                                | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8
    +114                                                | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16
    +115                                                | (abgr & 0xFE000000));
    +116        }
    +117
    +118        /**
    +119         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the IPT format this uses.
    +120         * @param r red, from 0.0 to 1.0 (both inclusive)
    +121         * @param g green, from 0.0 to 1.0 (both inclusive)
    +122         * @param b blue, from 0.0 to 1.0 (both inclusive)
    +123         * @param a alpha, from 0.0 to 1.0 (both inclusive)
    +124         * @return a packed float as IPT, which this class can use
    +125         */
    +126        public static float fromRGBA(final float r, final float g, final float b, final float a) {
    +127                return BitConversion.intBitsToFloat(
    +128                                          Math.min(Math.max((int)((0.189786f * r + 0.576951f * g + 0.233221f * b) * 255.0f + 0.500f), 0), 255)
    +129                                                | Math.min(Math.max((int)((0.669665f * r - 0.73741f * g + 0.0681367f * b) * 127.5f + 127.5f), 0), 255) << 8
    +130                                                | Math.min(Math.max((int)((0.286498f * r + 0.655205f * g - 0.941748f * b) * 127.5f + 127.5f), 0), 255) << 16
    +131                                                | ((int)(a * 255f) << 24 & 0xFE000000));
    +132        }
    +133
    +134        /**
    +135         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +136         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +137         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
    +138         */
    +139        public static int redInt(final float encoded)
    +140        {
    +141                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +142                final float i = (decoded & 0xff) / 255f;
    +143                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +144                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +145                return Math.min(Math.max((int) ((0.999779f * i + 1.0709400f * p + 0.324891f * t) * 256.0), 0), 255);
    +146        }
    +147
    +148        /**
    +149         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +150         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +151         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
    +152         */
    +153        public static int greenInt(final float encoded)
    +154        {
    +155                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +156                final float i = (decoded & 0xff) / 255f;
    +157                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +158                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +159                return Math.min(Math.max((int) ((1.000150f * i - 0.3777440f * p + 0.220439f * t) * 256.0), 0), 255);
    +160        }
    +161
    +162        /**
    +163         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +164         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +165         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
    +166         */
    +167        public static int blueInt(final float encoded)
    +168        {
    +169                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +170                final float i = (decoded & 0xff) / 255f;
    +171                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +172                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +173                return Math.min(Math.max((int) ((0.999769f * i + 0.0629496f * p - 0.809638f * t) * 256.0), 0), 255);
    +174        }
    +175
    +176        /**
    +177         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
    +178         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    +179         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +180         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
    +181         */
    +182        public static int alphaInt(final float encoded)
    +183        {
    +184                return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
    +185        }
    +186
    +187        /**
    +188         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +189         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +190         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
    +191         */
    +192        public static float red(final float encoded)
    +193        {
    +194                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +195                final float i = (decoded & 0xff) / 255f;
    +196                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +197                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +198                return Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    +199        }
    +200
    +201        /**
    +202         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +203         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +204         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
    +205         */
    +206        public static float green(final float encoded)
    +207        {
    +208                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +209                final float i = (decoded & 0xff) / 255f;
    +210                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +211                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +212                return Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    +213        }
    +214
    +215        /**
    +216         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +217         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +218         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
    +219         */
    +220        public static float blue(final float encoded)
    +221        {
    +222                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +223                final float i = (decoded & 0xff) / 255f;
    +224                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +225                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +226                return Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    +227        }
    +228
    +229        /**
    +230         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +231         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +232         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
    +233         */
    +234        public static float alpha(final float encoded)
    +235        {
    +236                return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
    +237        }
    +238
    +239        /**
    +240         * Gets a color as an IPT packed float given floats representing hue, saturation, lightness, and opacity.
    +241         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
    +242         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
    +243         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
    +244         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
    +245         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
    +246         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
    +247         * of high-saturation where lightness is 0.5f.
    +248         *
    +249         * @param hue        0f to 1f, color wheel position
    +250         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
    +251         * @param lightness  0f to 1f, 0f is black and 1f is white
    +252         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
    +253         * @return a float encoding a color with the given properties
    +254         */
    +255        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
    +256                if (lightness <= 0.001f) {
    +257                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    +258                } else {
    +259                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    +260                }
    +261        }
    +262
    +263        /**
    +264         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    +265         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +266         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    +267         */
    +268        public static float saturation(final float encoded) {
    +269                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +270                final float i = (decoded & 0xff) / 255f;
    +271                if(Math.abs(i - 0.5) > 0.495f) return 0f;
    +272                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +273                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +274                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    +275                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    +276                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    +277                float x, y, w;
    +278                if(g < b) {
    +279                        x = b;
    +280                        y = g;
    +281                }
    +282                else {
    +283                        x = g;
    +284                        y = b;
    +285                }
    +286                if(r < x) {
    +287                        w = r;
    +288                }
    +289                else {
    +290                        w = x;
    +291                        x = r;
    +292                }
    +293                return x - Math.min(w, y);
    +294//              float d = x - Math.min(w, y);
    +295//              float li = x * (1f - 0.5f * d / (x + 1e-10f));
    +296//              return (x - li); // (Math.min(li, 1f - li) + 1e-10f);
    +297        }
    +298
    +299        public static float lightness(final float encoded) {
    +300                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +301                final float i = (decoded & 0xff) / 255f;
    +302                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +303                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +304                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    +305                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    +306                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    +307
    +308                float x, y, w;
    +309                if(g < b) {
    +310                        x = b;
    +311                        y = g;
    +312                }
    +313                else {
    +314                        x = g;
    +315                        y = b;
    +316                }
    +317                if(r < x) {
    +318                        w = r;
    +319                }
    +320                else {
    +321                        w = x;
    +322                        x = r;
    +323                }
    +324                float d = x - Math.min(w, y);
    +325                return x * (1f - 0.5f * d / (x + 1e-10f));
    +326        }
    +327
    +328        /**
    +329         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    +330         * to 1f (exclusive, red and approaching purple if decreased).
    +331         * @param encoded a color as a packed float that can be obtained by {@link #ipt(float, float, float, float)}
    +332         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    +333         * eventually to purple before looping back to almost the same red (1.0, exclusive)
    +334         */
    +335        public static float hue(final float encoded) {
    +336                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +337                final float i = (decoded & 0xff) / 255f;
    +338                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +339                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +340                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    +341                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    +342                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    +343                float x, y, z, w;
    +344                if(g < b) {
    +345                        x = b;
    +346                        y = g;
    +347                        z = -1f;
    +348                        w = 2f / 3f;
    +349                }
    +350                else {
    +351                        x = g;
    +352                        y = b;
    +353                        z = 0f;
    +354                        w = -1f / 3f;
    +355                }
    +356                if(r < x) {
    +357                        z = w;
    +358                        w = r;
    +359                }
    +360                else {
    +361                        w = x;
    +362                        x = r;
    +363                }
    +364                float d = x - Math.min(w, y);
    +365                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
    +366        }
    +367
    +368        /**
    +369         * The "intensity" of the given packed float in IPT format, which is like its lightness; ranges from 0.0f to
    +370         * 1.0f . You can edit the intensity of a color with {@link #lighten(float, float)} and
    +371         * {@link #darken(float, float)}.
    +372         *
    +373         * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)}
    +374         * @return the intensity value as a float from 0.0f to 1.0f
    +375         */
    +376        public static float intensity(final float encoded)
    +377        {
    +378                return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    +379        }
    +380
    +381        /**
    +382         * The "protan" of the given packed float in IPT format, which when combined with tritan describes the
    +383         * hue and saturation of a color; ranges from 0f to 1f . If protan is 0f, the color will be cooler, more green or
    +384         * blue; if protan is 1f, the color will be warmer, from magenta to orange. You can edit the protan of a color with
    +385         * {@link #protanUp(float, float)} and {@link #protanDown(float, float)}.
    +386         * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)}
    +387         * @return the protan value as a float from 0.0f to 1.0f
    +388         */
    +389        public static float protan(final float encoded)
    +390        {
    +391                return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    +392        }
    +393
    +394        /**
    +395         * The "tritan" of the given packed float in IPT format, which when combined with protan describes the
    +396         * hue and saturation of a color; ranges from 0f to 1f . If tritan is 0f, the color will be more "artificial", more
    +397         * blue or purple; if tritan is 1f, the color will be more "natural", from green to yellow to orange. You can edit
    +398         * the tritan of a color with {@link #tritanUp(float, float)} and {@link #tritanDown(float, float)}.
    +399         * @param encoded a color encoded as a packed float, as by {@link #ipt(float, float, float, float)}
    +400         * @return the tritan value as a float from 0.0f to 1.0f
    +401         */
    +402        public static float tritan(final float encoded)
    +403        {
    +404                return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    +405        }
    +406
    +407        /**
    +408         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    +409         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not IPT! Takes
    +410         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    +411         * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is
    +412         * likely to be different than the result of {@link #ipt(float, float, float, float)} unless hue, saturation,
    +413         * lightness, and opacity are all 0. This won't allocate any objects.
    +414         * <br>
    +415         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    +416         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    +417         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    +418         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    +419         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    +420         *
    +421         * @param basis      a packed float color that will be used as the starting point to make the next color
    +422         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    +423         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    +424         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    +425         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    +426         * @return a float encoding a variation of basis with the given changes
    +427         */
    +428        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    +429                final int e = BitConversion.floatToRawIntBits(basis);
    +430                final float i = Math.min(Math.max(light + (e & 0xff) / 255f, 0f), 1f);
    +431                opacity = Math.min(Math.max(opacity + (e >>> 24 & 0xfe) * 0x1.020408p-8f, 0f), 1f);
    +432                if (i <= 0.001f)
    +433                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
    +434                final float p = ((e >>> 7 & 0x1fe) - 0xff) / 255f;
    +435                final float t = ((e >>> 15 & 0x1fe) - 0xff) / 255f;
    +436                final float r = Math.min(Math.max((0.999779f * i + 1.0709400f * p + 0.324891f * t), 0f), 1f);
    +437                final float g = Math.min(Math.max((1.000150f * i - 0.3777440f * p + 0.220439f * t), 0f), 1f);
    +438                final float b = Math.min(Math.max((0.999769f * i + 0.0629496f * p - 0.809638f * t), 0f), 1f);
    +439                float x, y, z, w;
    +440                if(g < b) {
    +441                        x = b;
    +442                        y = g;
    +443                        z = -1f;
    +444                        w = 2f / 3f;
    +445                }
    +446                else {
    +447                        x = g;
    +448                        y = b;
    +449                        z = 0f;
    +450                        w = -1f / 3f;
    +451                }
    +452                if(r < x) {
    +453                        z = w;
    +454                        w = r;
    +455                }
    +456                else {
    +457                        w = x;
    +458                        x = r;
    +459                }
    +460                final float d = x - Math.min(w, y);
    +461                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
    +462                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
    +463                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    +464                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    +465        }
    +466
    +467        /**
    +468         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    +469         * start as-is) and 1f (return white), start should be a packed color, as from
    +470         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +471         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +472         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    +473         * @see #darken(float, float) the counterpart method that darkens a float color
    +474         * @param start the starting color as a packed float
    +475         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    +476         * @return a packed float that represents a color between start and white
    +477         */
    +478        public static float lighten(final float start, final float change) {
    +479                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    +480                return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
    +481        }
    +482
    +483        /**
    +484         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    +485         * start as-is) and 1f (return black), start should be a packed color, as from
    +486         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +487         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +488         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    +489         * @see #lighten(float, float) the counterpart method that lightens a float color
    +490         * @param start the starting color as a packed float
    +491         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    +492         * @return a packed float that represents a color between start and black
    +493         */
    +494        public static float darken(final float start, final float change) {
    +495                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    +496                return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
    +497        }
    +498
    +499        /**
    +500         * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
    +501         * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
    +502         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +503         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    +504         * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    +505         * alpha and intensity of start as-is.
    +506         * @see #protanDown(float, float) the counterpart method that cools a float color
    +507         * @param start the starting color as a packed float
    +508         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
    +509         * @return a packed float that represents a color between start and a warmer color
    +510         */
    +511        public static float protanUp(final float start, final float change) {
    +512                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +513                return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    +514        }
    +515
    +516        /**
    +517         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
    +518         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
    +519         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +520         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +521         * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
    +522         * intensity of start as-is.
    +523         * @see #protanUp(float, float) the counterpart method that warms a float color
    +524         * @param start the starting color as a packed float
    +525         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
    +526         * @return a packed float that represents a color between start and a cooler color
    +527         */
    +528        public static float protanDown(final float start, final float change) {
    +529                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +530                return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    +531        }
    +532
    +533        /**
    +534         * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    +535         * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as
    +536         * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +537         * Colors, and is a little more efficient and clear than using
    +538         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
    +539         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and intensity of start as-is.
    +540         * @see #tritanDown(float, float) the counterpart method that makes a float color less natural
    +541         * @param start the starting color as a packed float
    +542         * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
    +543         * @return a packed float that represents a color between start and a more natural color
    +544         */
    +545        public static float tritanUp(final float start, final float change) {
    +546                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +547                return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    +548        }
    +549
    +550        /**
    +551         * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    +552         * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as
    +553         * from {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +554         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +555         * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    +556         * alpha and intensity of start as-is.
    +557         * @see #tritanUp(float, float) the counterpart method that makes a float color less artificial
    +558         * @param start the starting color as a packed float
    +559         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
    +560         * @return a packed float that represents a color between start and a more artificial color
    +561         */
    +562        public static float tritanDown(final float start, final float change) {
    +563                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +564                return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    +565        }
    +566
    +567        /**
    +568         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    +569         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    +570         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +571         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +572         * transparent. This won't change the intensity, protan, or tritan of the color.
    +573         * @see #fade(float, float) the counterpart method that makes a float color more translucent
    +574         * @param start the starting color as a packed float
    +575         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    +576         * @return a packed float that represents a color between start and its opaque version
    +577         */
    +578        public static float blot(final float start, final float change) {
    +579                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    +580                return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    +581        }
    +582
    +583        /**
    +584         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    +585         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    +586         * {@link #ipt(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +587         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +588         * transparent. This won't change the intensity, protan, or tritan of the color.
    +589         * @see #blot(float, float) the counterpart method that makes a float color more opaque
    +590         * @param start the starting color as a packed float
    +591         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    +592         * @return a packed float that represents a color between start and transparent
    +593         */
    +594        public static float fade(final float start, final float change) {
    +595                final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    +596                return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    +597        }
    +598
    +599        /**
    +600         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
    +601         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    +602         * from {@link #ipt(float, float, float, float)}. This only changes protan and tritan; it leaves intensity and alpha
    +603         * alone, unlike {@link #lessenChange(float, float)}, which usually changes intensity.
    +604         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    +605         * @param start the starting color as a packed float
    +606         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    +607         * @return a packed float that represents a color between start and a desaturated color
    +608         */
    +609        public static float dullen(final float start, final float change) {
    +610                final int s = BitConversion.floatToRawIntBits(start);
    +611                return ipt((s & 0xFF) / 255f,
    +612                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    +613                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    +614                                (s >>> 25) / 127f);
    +615        }
    +616
    +617        /**
    +618         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
    +619         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    +620         * from {@link #ipt(float, float, float, float)}. This usually changes only protan and tritan, but higher values for
    +621         * {@code change} can force the color out of the gamut, which this corrects using
    +622         * {@link #limitToGamut(float, float, float, float)} (and that can change intensity somewhat). If the color stays
    +623         * in-gamut, then intensity won't change; alpha never changes.
    +624         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    +625         * @param start the starting color as a packed float
    +626         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    +627         * @return a packed float that represents a color between start and a saturated color
    +628         */
    +629        public static float enrich(final float start, final float change) {
    +630                final int s = BitConversion.floatToRawIntBits(start);
    +631                return limitToGamut((s & 0xFF) / 255f,
    +632                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    +633                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    +634                                (s >>> 25) / 127f);
    +635        }
    +636
    +637        /**
    +638         * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast with,
    +639         * gets a packed float IPT color with roughly inverted intnsity but the same chromatic channels and opacity (P and T
    +640         * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
    +641         * dark colors, and also has a gap in the range it produces for intensity values between 0.5 and 0.55. That allows
    +642         * most of the colors this method produces to contrast well as a foreground when displayed on a background of
    +643         * {@code contrastingColor}, or vice versa. This will leave the intensity unchanged if the chromatic channels of the
    +644         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
    +645         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
    +646         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
    +647         * {@code contrastingColor} without losing its other qualities.
    +648         * @param mainColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; this is the color that will be adjusted
    +649         * @param contrastingColor a packed float color, as produced by {@link #ipt(float, float, float, float)}; the adjusted mainColor will contrast with this
    +650         * @return a different IPT packed float color, based on mainColor but with potentially very different lightness
    +651         */
    +652        public static float inverseLightness(final float mainColor, final float contrastingColor)
    +653        {
    +654                final int bits = BitConversion.floatToRawIntBits(mainColor),
    +655                                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    +656                                i = (bits & 0xff),
    +657                                p = (bits >>> 8 & 0xff),
    +658                                t = (bits >>> 16 & 0xff),
    +659                                ci = (contrastBits & 0xff),
    +660                                cp = (contrastBits >>> 8 & 0xff),
    +661                                ct = (contrastBits >>> 16 & 0xff);
    +662                if((p - cp) * (p - cp) + (t - ct) * (t - ct) >= 0x10000)
    +663                        return mainColor;
    +664                return ipt(ci < 128 ? i * (0.45f / 255f) + 0.55f : 0.5f - i * (0.45f / 255f), p / 255f, t / 255f, 0x1.0p-8f * (bits >>> 24));
    +665        }
    +666
    +667        /**
    +668         * Given a packed float IPT color {@code mainColor} and another IPT color that it should be made to contrast
    +669         * with, gets a packed float IPT color with I that should be quite different from {@code contrastingColor}'s I,
    +670         * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
    +671         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
    +672         * a background of {@code contrastingColor}, or vice versa.
    +673         * <br>
    +674         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    +675         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    +676         * averages the original I of mainColor with the modified one, this tends to not produce harsh color changes.
    +677         * @param mainColor a packed IPT float color; this is the color that will be adjusted
    +678         * @param contrastingColor a packed IPT float color; the adjusted mainColor will contrast with the I of this
    +679         * @return a different packed IPT float color, based on mainColor but typically with different lightness
    +680         */
    +681        public static float differentiateLightness(final float mainColor, final float contrastingColor)
    +682        {
    +683                final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    +684                return limitToGamut(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
    +685        }
    +686
    +687        /**
    +688         * Pretty simple; adds 0.5 to the given color's I and wraps it around if it would go above 1.0, then averages that
    +689         * with the original I. This means light colors become darker, and dark colors become lighter, with almost all
    +690         * results in the middle-range of possible lightness.
    +691         * @param mainColor a packed IPT float color
    +692         * @return a different packed IPT float color, with its I channel changed and limited to the correct gamut
    +693         */
    +694        public static float offsetLightness(final float mainColor) {
    +695                final int decoded = BitConversion.floatToRawIntBits(mainColor);
    +696                return limitToGamut(BitConversion.intBitsToFloat((decoded & 0xFEFFFF00) | (decoded + 128 & 0xFF) + (decoded & 0xFF) >>> 1));
    +697        }
    +698
    +699        /**
    +700         * Makes the additive IPT color stored in {@code color} cause less of a change when used as a tint, as if it were
    +701         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    +702         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    +703         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    +704         * @param color a color that should have its tinting effect potentially weakened
    +705         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    +706         * @return an IPT float color between gray and {@code color}
    +707         */
    +708        public static float lessenChange(final float color, float fraction) {
    +709                final int e = BitConversion.floatToRawIntBits(color),
    +710                                is = 0x80, ps = 0x80, ts = 0x80,
    +711                                ie = (e & 0xFF), pe = (e >>> 8) & 0xFF, te = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
    +712                return BitConversion.intBitsToFloat(((int) (is + fraction * (ie - is)) & 0xFF)
    +713                                | (((int) (ps + fraction * (pe - ps)) & 0xFF) << 8)
    +714                                | (((int) (ts + fraction * (te - ts)) & 0xFF) << 16)
    +715                                | (ae << 24));
    +716        }
    +717
    +718        /**
    +719         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    +720         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    +721         * be different each time this is called, and can be obtained from a random number generator to make the colors more
    +722         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    +723         * produce two similar colors in a row unless variance is very small. The variance affects the I, P, and T of the
    +724         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    +725         * isn't greater than the variance (this considers P and T extra-wide, going from -1 to 1, while I goes from 0 to 1,
    +726         * but only internally for measuring distance).
    +727         * @param color a packed float color, as produced by {@link #ipt(float, float, float, float)}
    +728         * @param seed a long seed that should be different on each call; should not be 0
    +729         * @param variance max amount of difference between the given color and the generated color; always less than 1
    +730         * @return a generated packed float color that should be at least somewhat different from {@code color}
    +731         */
    +732        public static float randomEdit(final float color, long seed, final float variance) {
    +733                final int decoded = BitConversion.floatToRawIntBits(color);
    +734                final float i = (decoded & 0xff) / 255f;
    +735                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +736                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +737                final float limit = variance * variance;
    +738                float dist, x, y, z;
    +739                for (int j = 0; j < 50; j++) {
    +740                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +741                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +742                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +743                        seed += 0x9E3779B97F4A7C15L;
    +744                        dist = x * x + y * y + z * z;
    +745                        if(dist <= limit && inGamut(x += i, y = (p + y) * 0.5f + 0.5f, z = (t + z) * 0.5f + 0.5f))
    +746                                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000)
    +747                                        | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f));
    +748                }
    +749                return color;
    +750        }
    +751
    +752        /**
    +753         * Returns true if the given packed float color, as IPT, is valid to convert losslessly back to RGBA. 
    +754         * @param packed a packed float color as IPT
    +755         * @return true if the given packed float color can be converted back and forth to RGBA
    +756         */
    +757        public static boolean inGamut(final float packed)
    +758        {
    +759                final int decoded = BitConversion.floatToRawIntBits(packed);
    +760                final float i = (decoded & 0xff) / 255f;
    +761                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +762                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +763                final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t;
    +764                if(r < -0.006f || r > 1.003f) return false;
    +765                final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t;
    +766                if(g < -0.006f || g > 1.003f)
    +767                        return false;
    +768                final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t;
    +769                return (b >= -0.006f && b <= 1.003f);
    +770        }
    +771        /**
    +772         * Returns true if the given IPT values are valid to convert losslessly back to RGBA. 
    +773         * @param i intensity channel, as a float from 0 to 1
    +774         * @param p protan channel, as a float from 0 to 1
    +775         * @param t tritan channel, as a float from 0 to 1
    +776         * @return true if the given packed float color can be converted back and forth to RGBA
    +777         */
    +778        public static boolean inGamut(float i, float p, float t)
    +779        {
    +780                p = (p - 0.5f) * 2f;
    +781                t = (t - 0.5f) * 2f;
    +782                final float r = 0.999779f * i + 1.0709400f * p + 0.324891f * t;
    +783                if(r < -0.006f || r > 1.003f) return false;
    +784                final float g = 1.000150f * i - 0.3777440f * p + 0.220439f * t;
    +785                if(g < -0.006f || g > 1.003f)
    +786                        return false;
    +787                final float b = 0.999769f * i + 0.0629496f * p - 0.809638f * t;
    +788                return (b >= -0.006f && b <= 1.003f);
    +789        }
    +790
    +791        /**
    +792         * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it
    +793         * isn't in-gamut, or returns it as soon as it is in-gamut.
    +794         * @param packed a packed float color in IPT format; often this color is not in-gamut
    +795         * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +796         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
    +797         */
    +798        public static float limitToGamut(final float packed) {
    +799                final int decoded = BitConversion.floatToRawIntBits(packed);
    +800                final float i = (decoded & 0xff) / 255f;
    +801                final float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +802                final float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +803                float i2 = i, p2 = p, t2 = t;
    +804                for (int attempt = 31; attempt >= 0; attempt--) {
    +805                        final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2;
    +806                        final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2;
    +807                        final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2;
    +808                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +809                                break;
    +810                        final float progress = attempt * 0x1p-5f;
    +811                        i2 = MathTools.lerp(0.5f, i, progress);
    +812                        p2 = MathTools.lerp(0, p, progress);
    +813                        t2 = MathTools.lerp(0, t, progress);
    +814                }
    +815                return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, (decoded >>> 25) / 127f);
    +816        }
    +817
    +818        /**
    +819         * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it
    +820         * isn't in-gamut, or returns it as soon as it is in-gamut. This always produces an opaque color.
    +821         * @param i intensity component; will be clamped between 0 and 1 if it isn't already
    +822         * @param p protan component; will be clamped between 0 and 1 if it isn't already
    +823         * @param t tritan component; will be clamped between 0 and 1 if it isn't already
    +824         * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +825         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    +826         */
    +827        public static float limitToGamut(float i, float p, float t) {
    +828                return limitToGamut(i, p, t, 1f);
    +829        }
    +830        /**
    +831         * Iteratively checks whether the given IPT color is in-gamut, and either brings the color closer to 50% gray if it
    +832         * isn't in-gamut, or returns it as soon as it is in-gamut.
    +833         * @param i intensity component; will be clamped between 0 and 1 if it isn't already
    +834         * @param p protan component; will be clamped between 0 and 1 if it isn't already
    +835         * @param t tritan component; will be clamped between 0 and 1 if it isn't already
    +836         * @param a alpha component; will be clamped between 0 and 1 if it isn't already
    +837         * @return the first color this finds that is between the given IPT color and 50% gray, and is in-gamut
    +838         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    +839         */
    +840        public static float limitToGamut(float i, float p, float t, float a) {
    +841                float i2 = i = Math.min(Math.max(i, 0f), 1f);
    +842                float p2 = p = Math.min(Math.max((p - 0.5f) * 2f, -1f), 1f);
    +843                float t2 = t = Math.min(Math.max((t - 0.5f) * 2f, -1f), 1f);
    +844                a = Math.min(Math.max(a, 0f), 1f);
    +845                for (int attempt = 31; attempt >= 0; attempt--) {
    +846                        final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2;
    +847                        final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2;
    +848                        final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2;
    +849                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +850                                break;
    +851                        final float progress = attempt * 0x1p-5f;
    +852                        i2 = MathTools.lerp(0.5f, i, progress);
    +853                        p2 = MathTools.lerp(0, p, progress);
    +854                        t2 = MathTools.lerp(0, t, progress);
    +855                }
    +856                return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, a);
    +857        }
    +858        /**
    +859         * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by adding the
    +860         * corresponding "add" parameter and then clamping. This returns a different float value (of course, the given float
    +861         * can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This
    +862         * clamps the resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +863         * @param encoded a packed float IPT color
    +864         * @param addI how much to add to the intensity channel; typically in the -1 to 1 range
    +865         * @param addP how much to add to the protan channel; typically in the -2 to 2 range
    +866         * @param addT how much to add to the tritan channel; typically in the -2 to 2 range
    +867         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +868         * @return a packed float IPT color with the requested edits applied to {@code encoded}
    +869         */
    +870        public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha) {
    +871                return editIPT(encoded, addI, addP, addT, addAlpha, 1f, 1f, 1f, 1f);
    +872        }
    +873        /**
    +874         * Given a packed float IPT color, this edits its intensity, protan, tritan, and alpha channels by first
    +875         * multiplying each channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter,
    +876         * before clamping. This means the intensity value is multiplied by {@code mulI}, then has {@code addI} added, and
    +877         * then is clamped to the normal range for intensity (0 to 1). This returns a different float value (of course, the
    +878         * given float can't be edited in-place). You can give a value of 0 for any "add" parameter you want to stay
    +879         * unchanged, or a value of 1 for any "mul" parameter that shouldn't change. Note that this manipulates protan and
    +880         * tritan in the -1 to 1 range, so if you multiply by a small number like {@code 0.25f}, then this will produce a
    +881         * less-saturated color, and if you multiply by a larger number like {@code 4f}, then you will get a much
    +882         * more-saturated color. This clamps the resulting color to remain in-gamut, so it should be safe to convert it back
    +883         * to RGBA.
    +884         * @param encoded a packed float IPT color
    +885         * @param addI how much to add to the intensity channel; typically in the -1 to 1 range
    +886         * @param addP how much to add to the protan channel; typically in the -2 to 2 range
    +887         * @param addT how much to add to the tritan channel; typically in the -2 to 2 range
    +888         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +889         * @param mulI how much to multiply the intensity channel by; should be non-negative
    +890         * @param mulP how much to multiply the protan channel by; usually non-negative (not always)
    +891         * @param mulT how much to multiply the tritan channel by; usually non-negative (not always)
    +892         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    +893         * @return a packed float IPT color with the requested edits applied to {@code encoded}
    +894         */
    +895        public static float editIPT(float encoded, float addI, float addP, float addT, float addAlpha,
    +896                                                                float mulI, float mulP, float mulT, float mulAlpha) {
    +897                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +898                float i = (decoded & 0xff) / 255f;
    +899                float p = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    +900                float t = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    +901                float alpha = (decoded >>> 25) / 127f;
    +902
    +903                float i2 = Math.min(Math.max(i * mulI + addI, 0f), 1f);
    +904                float p2 = p = Math.min(Math.max(p * mulP + addP, -1f), 1f);
    +905                float t2 = t = Math.min(Math.max(t * mulT + addT, -1f), 1f);
    +906                alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    +907                for (int attempt = 31; attempt >= 0; attempt--) {
    +908                        final float r = 0.999779f * i2 + 1.0709400f * p2 + 0.324891f * t2;
    +909                        final float g = 1.000150f * i2 - 0.3777440f * p2 + 0.220439f * t2;
    +910                        final float b = 0.999769f * i2 + 0.0629496f * p2 - 0.809638f * t2;
    +911                        if(r >= 0f && r <= 1f && g >= 0f && g <= 1f && b >= 0f && b <= 1f)
    +912                                break;
    +913                        final float progress = attempt * 0x1p-5f;
    +914                        p2 = MathTools.lerp(0, p, progress);
    +915                        t2 = MathTools.lerp(0, t, progress);
    +916                }
    +917                return ipt(i2, p2 * 0.5f + 0.5f, t2 * 0.5f + 0.5f, alpha);
    +918        }
    +919
    +920        /**
    +921         * Converts from a packed float in HSI format to a packed float in IPT format.
    +922         * @param packed a packed float in HSI format
    +923         * @return a packed float in IPT format
    +924         */
    +925        public static float fromHSI(float packed){
    +926                final int decoded = BitConversion.floatToRawIntBits(packed);
    +927                final float h = (decoded & 0xff) / 255f;
    +928                final float s = (decoded >>> 8 & 0xff) / 255f;
    +929                final float i = (decoded >>> 16 & 0xff) / 255f;
    +930                final float y = TrigTools.cosTurns(h) * s, z = TrigTools.sinTurns(h) * s;
    +931                final float crMid = 0.3481738f * y + 0.104959644f * z;
    +932                final float crScale = (i - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid;
    +933                final float mgMid = 0.122068435f * y + -0.070396f * z;
    +934                final float mgScale = (i + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid;
    +935                final float ybMid = 0.020876605f * y + -0.26078433f * z;
    +936                final float ybScale = (i - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid;
    +937                final float scale = Math.max(crScale, Math.max(mgScale, ybScale));
    +938                final float d = 4f * s * scale / (TrigTools.sin(3.14159f * i) + 0.000001f);
    +939
    +940                final float p = y * d;
    +941                final float t = z * d;
    +942                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000)
    +943                                | ((int) (p * 255) << 8 & 0xFF00) | (decoded >>> 16 & 0xFF));
    +944        }
    +945
    +946        /**
    +947         * Converts from hue, saturation, intensity, and alpha components (each ranging from 0 to 1 inclusive) to a packed
    +948         * float color in IPT format.
    +949         * @param hue hue, from 0 to 1 inclusive; 0 is red, 0.25 is yellow, 0.75 is blue
    +950         * @param saturation saturation from 0 (grayscale) to a limit between 0 and 1 depending on intensity (it can be 1 only when intensity is 0.5)
    +951         * @param intensity intensity, or lightness, from 0 (black) to 1 (white)
    +952         * @param alpha alpha transparency/opacity, from 0 (fully transparent) to 1 (fully opaque)
    +953         * @return a packed float in IPT format
    +954         */
    +955        public static float fromHSI(float hue, float saturation, float intensity, float alpha){
    +956                final float y = TrigTools.cosTurns(hue) * saturation, z = TrigTools.sinTurns(hue) * saturation;
    +957                final float crMid = 0.3481738f * y + 0.104959644f * z;
    +958                final float crScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(crMid) >>> 31)) * 0.16420607f / -crMid;
    +959                final float mgMid = 0.122068435f * y + -0.070396f * z;
    +960                final float mgScale = (intensity + 0.5f - (BitConversion.floatToRawIntBits(mgMid) >>> 31)) * -0.16136102f / -mgMid;
    +961                final float ybMid = 0.020876605f * y + -0.26078433f * z;
    +962                final float ybScale = (intensity - 0.5f + (BitConversion.floatToRawIntBits(ybMid) >>> 31)) * 0.16155326f / -ybMid;
    +963                final float scale = Math.max(crScale, Math.max(mgScale, ybScale));
    +964                final float d = 4f * saturation * scale / (TrigTools.sin(3.14159f * intensity) + 0.000001f);
    +965
    +966                final float p = y * d;
    +967                final float t = z * d;
    +968                return BitConversion.intBitsToFloat(((int)(alpha * 255) << 24 & 0xFE000000) | ((int) (t * 255) << 16 & 0xFF0000)
    +969                                | ((int) (p * 255) << 8 & 0xFF00) | ((int) (intensity * 255) & 0xFF));
    +970        }
    +971
    +972        /**
    +973         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    +974         * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.random.LaserRandom})
    +975         * @return a packed float color that is always in-gamut
    +976         */
    +977        public static float randomColor(Random random) {
    +978                final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f;
    +979                final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f;
    +980                final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f;
    +981                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    +982                return BitConversion.intBitsToFloat(0xFE000000
    +983                                | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000)
    +984                                | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00)
    +985                                | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF));
    +986        }
    +987
    +988        /**
    +989         * Produces a random packed float color that is always opaque and should be uniformly distributed.
    +990         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    +991         * and EnhancedRandom.
    +992         * @param random any subclass of juniper's EnhancedRandom, such as a
    +993         * {@link com.github.tommyettinger.random.DistinctRandom} or
    +994         * {@link com.github.tommyettinger.random.FourWheelRandom}
    +995         * @return a packed float color that is always in-gamut
    +996         */
    +997        public static float randomizedColor(EnhancedRandom random) {
    +998                final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f;
    +999                final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f;
    +1000                final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f;
    +1001                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    +1002                return BitConversion.intBitsToFloat(0xFE000000
    +1003                                | ((int) ((tr * r + tg * g + tb * b) * 128f + 128f) << 16 & 0xFF0000)
    +1004                                | ((int) ((pr * r + pg * g + pb * b) * 128f + 128f) << 8 & 0xFF00)
    +1005                                | ((int) ((ir * r + ig * g + ib * b) * 256f) & 0xFF));
    +1006        }
    +1007
    +1008        /**
    +1009         * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b)
    +1010         * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence,
    +1011         * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you
    +1012         * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to
    +1013         * avoid generating too many colors with high blue, for instance. This approximately maps the r, g, and b parameters
    +1014         * to distances on the RGB axes of a rectangular prism, which is stretched and rotated to form the IPT gamut.
    +1015         * @param r red value to use; will be clamped between 0 and 1
    +1016         * @param g green value to use; will be clamped between 0 and 1
    +1017         * @param b blue value to use; will be clamped between 0 and 1
    +1018         * @return a packed float color that is always opaque
    +1019         */
    +1020        public static float subrandomColor(float r, float g, float b) {
    +1021                r = Math.min(Math.max(r, 0f), 0.999f);
    +1022                g = Math.min(Math.max(g, 0f), 0.999f);
    +1023                b = Math.min(Math.max(b, 0f), 0.999f);
    +1024                final float ir = 0.1882353f, pr = 0.83137256f - 0.5f, tr = 0.6431373f - 0.5f;
    +1025                final float ig = 0.5764706f, pg = 0.12941177f - 0.5f, tg = 0.827451f - 0.5f;
    +1026                final float ib = 0.23137255f, pb = 0.53333336f - 0.5f, tb = 0.02745098f - 0.5f;
    +1027                return BitConversion.intBitsToFloat(0xFE000000
    +1028                                | ((int) ((tr * r + tg * g + tb * b) * 127.5f + 127.5f) << 16 & 0xFF0000)
    +1029                                | ((int) ((pr * r + pg * g + pb * b) * 127.5f + 127.5f) << 8 & 0xFF00)
    +1030                                | ((int) ((ir * r + ig * g + ib * b) * 255f) & 0xFF));
    +1031        }
    +1032}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/GradientTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/GradientTools.html
    index 892c6253..fbfe0675 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/GradientTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt/GradientTools.html
    @@ -14,242 +14,243 @@
     
    001package com.github.tommyettinger.colorful.pure.ipt;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.Interpolation;
    -005import com.github.tommyettinger.colorful.pure.MathTools;
    -006import com.github.tommyettinger.ds.FloatList;
    -007
    -008/**
    -009 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    -010 * The intent is for the FloatList to be used as a sequence of packed float IPT colors. You can create a new
    -011 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    -012 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    -013 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    -014 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    -015 * than two colors. You can also customize each section between colors with
    -016 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    -017 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    -018 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    -019 */
    -020public class GradientTools {
    -021    /**
    -022     * No need to instantiate.
    -023     */
    -024    private GradientTools(){
    -025    }
    -026
    -027    /**
    -028     * Creates a FloatList gradient from the packed float IPT color {@code start} to the packed float IPT color
    -029     * {@code end}, taking the specified number of steps and using linear interpolation.
    -030     * @param start the packed float IPT color to start with
    -031     * @param end the packed float IPT color to end on
    -032     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -033     * @return a new FloatList that contains the requested gradient
    -034     */
    -035    public static FloatList makeGradient(float start, float end, int steps) {
    -036        return makeGradient(start, end, steps, Interpolation.linear);
    -037    }
    -038    /**
    -039     * Creates a FloatList gradient from the packed float IPT color {@code start} to the packed float IPT color
    -040     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -041     * @param start the packed float IPT color to start with
    -042     * @param end the packed float IPT color to end on
    -043     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -044     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -045     * @return a new FloatList that contains the requested gradient
    -046     */
    -047    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    -048        FloatList appending = new FloatList(steps);
    -049        if(steps <= 0) {
    -050            return appending;
    -051        }
    -052        if(steps == 1) {
    -053            appending.add(start);
    -054            return appending;
    -055        }
    -056        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -057        return appending;
    -058    }
    -059
    -060    /**
    -061     * Appends a gradient from the packed float IPT color {@code start} to the packed float IPT color {@code end},
    -062     * taking the specified number of steps and using linear Interpolation for how it transitions.
    -063     * @param appending a FloatList that will be appended to
    -064     * @param start the packed float IPT color to start with
    -065     * @param end the packed float IPT color to end on
    -066     * @param steps how many steps the gradient should use; usually greater than 2
    -067     * @return {@code appending}, after adding the gradient to the end
    -068     */
    -069    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    -070        return appendGradient(appending, start, end, steps, Interpolation.linear);
    -071    }
    -072    /**
    -073     * Appends a gradient from the packed float IPT color {@code start} to the packed float IPT color {@code end},
    -074     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    -075     * @param appending a FloatList that will be appended to
    -076     * @param start the packed float IPT color to start with
    -077     * @param end the packed float IPT color to end on
    -078     * @param steps how many steps the gradient should use; usually greater than 2
    -079     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -080     * @return {@code appending}, after adding the gradient to the end
    -081     */
    -082    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    -083        if(appending == null)
    -084            return null;
    -085        if(steps <= 0) {
    -086            return appending;
    -087        }
    -088        if(steps == 1) {
    -089            appending.add(start);
    -090            return appending;
    -091        }
    -092        appending.ensureCapacity(steps);
    -093        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -094        return appending;
    -095    }
    -096
    -097    /**
    -098     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses linear
    -099     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -100     * {@code steps} colors.
    -101     * @param appending a FloatList that will be appended to
    -102     * @param steps how many steps the gradient should use; usually greater than 2
    -103     * @param chain an array or varargs of packed float IPT colors that this will interpolate through in order
    -104     * @return {@code appending}, after adding the gradient to the end
    -105     */
    -106    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    -107        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -108    }
    -109
    -110    /**
    -111     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses linear
    -112     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -113     * {@code steps} colors.
    -114     * @param appending a FloatList that will be appended to
    -115     * @param steps how many steps the gradient should use; usually greater than 2
    -116     * @param chain a FloatList of packed float IPT colors that this will interpolate through in order
    -117     * @return {@code appending}, after adding the gradient to the end
    -118     */
    -119    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    -120        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -121    }
    -122
    -123    /**
    -124     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses the specified
    -125     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -126     * end of {@code appending} and produces a total of {@code steps} colors.
    -127     * @param appending a FloatList that will be appended to
    -128     * @param steps how many steps the gradient should use; usually greater than 2
    -129     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -130     * @param chain a FloatList of packed float IPT colors that this will interpolate through in order
    -131     * @return {@code appending}, after adding the gradient to the end
    -132     */
    -133    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    -134        if (appending == null)
    -135            return null;
    -136        if(chain == null)
    -137            return appending;
    -138        if (steps <= 0 || chain.size() == 0) {
    -139            return appending;
    -140        }
    -141        if (steps == 1 || chain.size() == 1) {
    -142            appending.add(chain.first());
    -143            return appending;
    -144        }
    -145        appending.ensureCapacity(steps);
    -146        int limit = steps - 1, splits = chain.size() - 1;
    -147        float step = 1f / steps, change = 0f;
    -148        for (int i = 0; i < limit; i++) {
    -149            float interp = interpolation.apply(change);
    -150            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -151            int idx = (int)splint;
    -152            appending.add(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    -153            change += step;
    -154        }
    -155        appending.add(chain.get(splits));
    -156        return appending;
    -157    }
    -158
    -159    /**
    -160     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses the specified
    -161     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -162     * end of {@code appending} and produces a total of {@code steps} colors.
    -163     * @param appending a FloatList that will be appended to
    -164     * @param steps how many steps the gradient should use; usually greater than 2
    -165     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -166     * @param chain an array or varargs of packed float IPT colors that this will interpolate through in order
    -167     * @return {@code appending}, after adding the gradient to the end
    -168     */
    -169    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    -170        if (appending == null)
    -171            return null;
    -172        if(chain == null)
    -173            return appending;
    -174        if (steps <= 0 || chain.length == 0) {
    -175            return appending;
    -176        }
    -177        if (steps == 1 || chain.length == 1) {
    -178            appending.add(chain[0]);
    -179            return appending;
    -180        }
    -181        appending.ensureCapacity(steps);
    -182        int limit = steps - 1, splits = chain.length - 1;
    -183        float step = 1f / steps, change = 0f;
    -184        for (int i = 0; i < limit; i++) {
    -185            float interp = interpolation.apply(change);
    -186            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -187            int idx = (int)splint;
    -188            appending.add(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    -189            change += step;
    -190        }
    -191        appending.add(chain[splits]);
    -192        return appending;
    -193    }
    -194
    -195    /**
    -196     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    -197     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -198     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -199     * number of steps, it just doesn't append {@code end} in the last step.
    -200     * @param appending a FloatList that will be appended to
    -201     * @param start the packed float IPT color to start with
    -202     * @param end the packed float IPT color to end just before
    -203     * @param steps how many steps the gradient should use; usually greater than 2
    -204     * @return {@code appending}, after adding the gradient to its end
    -205     */
    -206    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    -207        return appendPartialGradient(appending, start, end, steps, Interpolation.linear);
    -208    }
    -209    /**
    -210     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    -211     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -212     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -213     * number of steps, it just doesn't append {@code end} in the last step.
    -214     * @param appending a FloatList that will be appended to
    -215     * @param start the packed float IPT color to start with
    -216     * @param end the packed float IPT color to end just before
    -217     * @param steps how many steps the gradient should use; usually greater than 2
    -218     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    -219     * @return {@code appending}, after adding the gradient to its end
    -220     */
    -221    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    -222        if(appending == null)
    -223            return null;
    -224        if(steps <= 0) {
    -225            return appending;
    -226        }
    -227        if(steps == 1) {
    -228            appending.add(start);
    -229            return appending;
    -230        }
    -231        int limit = steps;
    -232        float step = 1f / steps, change = 0f;
    -233        for (int i = 0; i < limit; i++) {
    -234            appending.add(FloatColors.lerpFloatColors(start, end, interpolation.apply(change)));
    -235            change += step;
    -236        }
    -237        return appending;
    -238    }
    -239}
    +004import com.github.tommyettinger.colorful.pure.Interpolations;
    +005import com.github.tommyettinger.colorful.pure.Interpolations.Interpolation;
    +006import com.github.tommyettinger.colorful.pure.MathTools;
    +007import com.github.tommyettinger.ds.FloatList;
    +008
    +009/**
    +010 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    +011 * The intent is for the FloatList to be used as a sequence of packed float IPT colors. You can create a new
    +012 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    +013 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    +014 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    +015 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    +016 * than two colors. You can also customize each section between colors with
    +017 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    +018 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    +019 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    +020 */
    +021public class GradientTools {
    +022    /**
    +023     * No need to instantiate.
    +024     */
    +025    private GradientTools(){
    +026    }
    +027
    +028    /**
    +029     * Creates a FloatList gradient from the packed float IPT color {@code start} to the packed float IPT color
    +030     * {@code end}, taking the specified number of steps and using linear interpolation.
    +031     * @param start the packed float IPT color to start with
    +032     * @param end the packed float IPT color to end on
    +033     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +034     * @return a new FloatList that contains the requested gradient
    +035     */
    +036    public static FloatList makeGradient(float start, float end, int steps) {
    +037        return makeGradient(start, end, steps, Interpolations.linear);
    +038    }
    +039    /**
    +040     * Creates a FloatList gradient from the packed float IPT color {@code start} to the packed float IPT color
    +041     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    +042     * @param start the packed float IPT color to start with
    +043     * @param end the packed float IPT color to end on
    +044     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +045     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +046     * @return a new FloatList that contains the requested gradient
    +047     */
    +048    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    +049        FloatList appending = new FloatList(steps);
    +050        if(steps <= 0) {
    +051            return appending;
    +052        }
    +053        if(steps == 1) {
    +054            appending.add(start);
    +055            return appending;
    +056        }
    +057        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +058        return appending;
    +059    }
    +060
    +061    /**
    +062     * Appends a gradient from the packed float IPT color {@code start} to the packed float IPT color {@code end},
    +063     * taking the specified number of steps and using linear Interpolation for how it transitions.
    +064     * @param appending a FloatList that will be appended to
    +065     * @param start the packed float IPT color to start with
    +066     * @param end the packed float IPT color to end on
    +067     * @param steps how many steps the gradient should use; usually greater than 2
    +068     * @return {@code appending}, after adding the gradient to the end
    +069     */
    +070    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    +071        return appendGradient(appending, start, end, steps, Interpolations.linear);
    +072    }
    +073    /**
    +074     * Appends a gradient from the packed float IPT color {@code start} to the packed float IPT color {@code end},
    +075     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    +076     * @param appending a FloatList that will be appended to
    +077     * @param start the packed float IPT color to start with
    +078     * @param end the packed float IPT color to end on
    +079     * @param steps how many steps the gradient should use; usually greater than 2
    +080     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +081     * @return {@code appending}, after adding the gradient to the end
    +082     */
    +083    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    +084        if(appending == null)
    +085            return null;
    +086        if(steps <= 0) {
    +087            return appending;
    +088        }
    +089        if(steps == 1) {
    +090            appending.add(start);
    +091            return appending;
    +092        }
    +093        appending.ensureCapacity(steps);
    +094        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +095        return appending;
    +096    }
    +097
    +098    /**
    +099     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses linear
    +100     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +101     * {@code steps} colors.
    +102     * @param appending a FloatList that will be appended to
    +103     * @param steps how many steps the gradient should use; usually greater than 2
    +104     * @param chain an array or varargs of packed float IPT colors that this will interpolate through in order
    +105     * @return {@code appending}, after adding the gradient to the end
    +106     */
    +107    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    +108        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +109    }
    +110
    +111    /**
    +112     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses linear
    +113     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +114     * {@code steps} colors.
    +115     * @param appending a FloatList that will be appended to
    +116     * @param steps how many steps the gradient should use; usually greater than 2
    +117     * @param chain a FloatList of packed float IPT colors that this will interpolate through in order
    +118     * @return {@code appending}, after adding the gradient to the end
    +119     */
    +120    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    +121        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +122    }
    +123
    +124    /**
    +125     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses the specified
    +126     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +127     * end of {@code appending} and produces a total of {@code steps} colors.
    +128     * @param appending a FloatList that will be appended to
    +129     * @param steps how many steps the gradient should use; usually greater than 2
    +130     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +131     * @param chain a FloatList of packed float IPT colors that this will interpolate through in order
    +132     * @return {@code appending}, after adding the gradient to the end
    +133     */
    +134    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    +135        if (appending == null)
    +136            return null;
    +137        if(chain == null)
    +138            return appending;
    +139        if (steps <= 0 || chain.size() == 0) {
    +140            return appending;
    +141        }
    +142        if (steps == 1 || chain.size() == 1) {
    +143            appending.add(chain.first());
    +144            return appending;
    +145        }
    +146        appending.ensureCapacity(steps);
    +147        int limit = steps - 1, splits = chain.size() - 1;
    +148        float step = 1f / steps, change = 0f;
    +149        for (int i = 0; i < limit; i++) {
    +150            float interp = interpolation.apply(change);
    +151            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +152            int idx = (int)splint;
    +153            appending.add(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    +154            change += step;
    +155        }
    +156        appending.add(chain.get(splits));
    +157        return appending;
    +158    }
    +159
    +160    /**
    +161     * Appends a gradient between several packed float IPT colors provided in {@code chain}. This uses the specified
    +162     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +163     * end of {@code appending} and produces a total of {@code steps} colors.
    +164     * @param appending a FloatList that will be appended to
    +165     * @param steps how many steps the gradient should use; usually greater than 2
    +166     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +167     * @param chain an array or varargs of packed float IPT colors that this will interpolate through in order
    +168     * @return {@code appending}, after adding the gradient to the end
    +169     */
    +170    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    +171        if (appending == null)
    +172            return null;
    +173        if(chain == null)
    +174            return appending;
    +175        if (steps <= 0 || chain.length == 0) {
    +176            return appending;
    +177        }
    +178        if (steps == 1 || chain.length == 1) {
    +179            appending.add(chain[0]);
    +180            return appending;
    +181        }
    +182        appending.ensureCapacity(steps);
    +183        int limit = steps - 1, splits = chain.length - 1;
    +184        float step = 1f / steps, change = 0f;
    +185        for (int i = 0; i < limit; i++) {
    +186            float interp = interpolation.apply(change);
    +187            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +188            int idx = (int)splint;
    +189            appending.add(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    +190            change += step;
    +191        }
    +192        appending.add(chain[splits]);
    +193        return appending;
    +194    }
    +195
    +196    /**
    +197     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    +198     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +199     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +200     * number of steps, it just doesn't append {@code end} in the last step.
    +201     * @param appending a FloatList that will be appended to
    +202     * @param start the packed float IPT color to start with
    +203     * @param end the packed float IPT color to end just before
    +204     * @param steps how many steps the gradient should use; usually greater than 2
    +205     * @return {@code appending}, after adding the gradient to its end
    +206     */
    +207    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    +208        return appendPartialGradient(appending, start, end, steps, Interpolations.linear);
    +209    }
    +210    /**
    +211     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    +212     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +213     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +214     * number of steps, it just doesn't append {@code end} in the last step.
    +215     * @param appending a FloatList that will be appended to
    +216     * @param start the packed float IPT color to start with
    +217     * @param end the packed float IPT color to end just before
    +218     * @param steps how many steps the gradient should use; usually greater than 2
    +219     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    +220     * @return {@code appending}, after adding the gradient to its end
    +221     */
    +222    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    +223        if(appending == null)
    +224            return null;
    +225        if(steps <= 0) {
    +226            return appending;
    +227        }
    +228        if(steps == 1) {
    +229            appending.add(start);
    +230            return appending;
    +231        }
    +232        int limit = steps;
    +233        float step = 1f / steps, change = 0f;
    +234        for (int i = 0; i < limit; i++) {
    +235            appending.add(FloatColors.lerpFloatColors(start, end, interpolation.apply(change)));
    +236            change += step;
    +237        }
    +238        return appending;
    +239    }
    +240}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/GradientTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/GradientTools.html
    index 6f64c105..69d0bfe7 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/GradientTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ipt_hq/GradientTools.html
    @@ -14,252 +14,253 @@
     
    001package com.github.tommyettinger.colorful.pure.ipt_hq;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.Interpolation;
    -005import com.github.tommyettinger.colorful.pure.MathTools;
    -006import com.github.tommyettinger.ds.FloatList;
    -007
    -008/**
    -009 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    -010 * The intent is for the FloatList to be used as a sequence of packed float IPT_HQ colors. You can create a new
    -011 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    -012 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    -013 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    -014 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    -015 * than two colors. You can also customize each section between colors with
    -016 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    -017 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    -018 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    -019 * <br>
    -020 * This class does some special handling for IPT_HQ colors.
    -021 */
    -022public class GradientTools {
    -023    /**
    -024     * No need to instantiate.
    -025     */
    -026    private GradientTools(){
    -027    }
    -028
    -029    /**
    -030     * Creates a FloatList gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color
    -031     * {@code end}, taking the specified number of steps and using linear interpolation.
    -032     * This limits individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at
    -033     * extreme points in the color space will stay in-gamut.
    -034     * @param start the packed float IPT_HQ color to start with
    -035     * @param end the packed float IPT_HQ color to end on
    -036     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -037     * @return a new FloatList that contains the requested gradient
    -038     */
    -039    public static FloatList makeGradient(float start, float end, int steps) {
    -040        return makeGradient(start, end, steps, Interpolation.linear);
    -041    }
    -042    /**
    -043     * Creates a FloatList gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color
    -044     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -045     * This limits individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at
    -046     * extreme points in the color space will stay in-gamut.
    -047     * @param start the packed float IPT_HQ color to start with
    -048     * @param end the packed float IPT_HQ color to end on
    -049     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -050     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -051     * @return a new FloatList that contains the requested gradient
    -052     */
    -053    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    -054        FloatList appending = new FloatList(steps);
    -055        if(steps <= 0) {
    -056            return appending;
    -057        }
    -058        if(steps == 1) {
    -059            appending.add(start);
    -060            return appending;
    -061        }
    -062        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -063        return appending;
    -064    }
    -065
    -066    /**
    -067     * Appends a gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color {@code end},
    -068     * taking the specified number of steps and using linear Interpolation for how it transitions. This limits
    -069     * individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at extreme points in
    -070     * the color space will stay in-gamut.
    -071     * @param appending a FloatList that will be appended to
    -072     * @param start the packed float IPT_HQ color to start with
    -073     * @param end the packed float IPT_HQ color to end on
    -074     * @param steps how many steps the gradient should use; usually greater than 2
    -075     * @return {@code appending}, after adding the gradient to the end
    -076     */
    -077    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    -078        return appendGradient(appending, start, end, steps, Interpolation.linear);
    -079    }
    -080    /**
    -081     * Appends a gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color {@code end},
    -082     * taking the specified number of steps and using the specified Interpolation for how it transitions. This limits
    -083     * individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at extreme points in
    -084     * the color space will stay in-gamut.
    -085     * @param appending a FloatList that will be appended to
    -086     * @param start the packed float IPT_HQ color to start with
    -087     * @param end the packed float IPT_HQ color to end on
    -088     * @param steps how many steps the gradient should use; usually greater than 2
    -089     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -090     * @return {@code appending}, after adding the gradient to the end
    -091     */
    -092    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    -093        if(appending == null)
    -094            return null;
    -095        if(steps <= 0) {
    -096            return appending;
    -097        }
    -098        if(steps == 1) {
    -099            appending.add(start);
    -100            return appending;
    -101        }
    -102        appending.ensureCapacity(steps);
    -103        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -104        return appending;
    -105    }
    -106
    -107    /**
    -108     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses linear
    -109     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -110     * {@code steps} colors.
    -111     * @param appending a FloatList that will be appended to
    -112     * @param steps how many steps the gradient should use; usually greater than 2
    -113     * @param chain an array or varargs of packed float IPT_HQ colors that this will interpolate through in order
    -114     * @return {@code appending}, after adding the gradient to the end
    -115     */
    -116    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    -117        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -118    }
    -119
    -120    /**
    -121     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses linear
    -122     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -123     * {@code steps} colors.
    -124     * @param appending a FloatList that will be appended to
    -125     * @param steps how many steps the gradient should use; usually greater than 2
    -126     * @param chain a FloatList of packed float IPT_HQ colors that this will interpolate through in order
    -127     * @return {@code appending}, after adding the gradient to the end
    -128     */
    -129    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    -130        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -131    }
    -132
    -133    /**
    -134     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses the specified
    -135     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -136     * end of {@code appending} and produces a total of {@code steps} colors.
    -137     * @param appending a FloatList that will be appended to
    -138     * @param steps how many steps the gradient should use; usually greater than 2
    -139     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -140     * @param chain a FloatList of packed float IPT_HQ colors that this will interpolate through in order
    -141     * @return {@code appending}, after adding the gradient to the end
    -142     */
    -143    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    -144        if (appending == null)
    -145            return null;
    -146        if(chain == null)
    -147            return appending;
    -148        if (steps <= 0 || chain.size() == 0) {
    -149            return appending;
    -150        }
    -151        if (steps == 1 || chain.size() == 1) {
    -152            appending.add(chain.first());
    -153            return appending;
    -154        }
    -155        appending.ensureCapacity(steps);
    -156        int limit = steps - 1, splits = chain.size() - 1;
    -157        float step = 1f / steps, change = 0f;
    -158        for (int i = 0; i < limit; i++) {
    -159            float interp = interpolation.apply(change);
    -160            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -161            int idx = (int)splint;
    -162            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint))));
    -163            change += step;
    -164        }
    -165        appending.add(chain.get(splits));
    -166        return appending;
    -167    }
    -168
    -169    /**
    -170     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses the specified
    -171     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -172     * end of {@code appending} and produces a total of {@code steps} colors.
    -173     * @param appending a FloatList that will be appended to
    -174     * @param steps how many steps the gradient should use; usually greater than 2
    -175     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -176     * @param chain an array or varargs of packed float IPT_HQ colors that this will interpolate through in order
    -177     * @return {@code appending}, after adding the gradient to the end
    -178     */
    -179    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    -180        if (appending == null)
    -181            return null;
    -182        if(chain == null)
    -183            return appending;
    -184        if (steps <= 0 || chain.length == 0) {
    -185            return appending;
    -186        }
    -187        if (steps == 1 || chain.length == 1) {
    -188            appending.add(chain[0]);
    -189            return appending;
    -190        }
    -191        appending.ensureCapacity(steps);
    -192        int limit = steps - 1, splits = chain.length - 1;
    -193        float step = 1f / steps, change = 0f;
    -194        for (int i = 0; i < limit; i++) {
    -195            float interp = interpolation.apply(change);
    -196            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -197            int idx = (int)splint;
    -198            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint))));
    -199            change += step;
    -200        }
    -201        appending.add(chain[splits]);
    -202        return appending;
    -203    }
    -204
    -205    /**
    -206     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    -207     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -208     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -209     * number of steps, it just doesn't append {@code end} in the last step.
    -210     * @param appending a FloatList that will be appended to
    -211     * @param start the packed float IPT_HQ color to start with
    -212     * @param end the packed float IPT_HQ color to end just before
    -213     * @param steps how many steps the gradient should use; usually greater than 2
    -214     * @return {@code appending}, after adding the gradient to its end
    -215     */
    -216    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    -217        return appendPartialGradient(appending, start, end, steps, Interpolation.linear);
    -218    }
    -219    /**
    -220     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    -221     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -222     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -223     * number of steps, it just doesn't append {@code end} in the last step.
    -224     * @param appending a FloatList that will be appended to
    -225     * @param start the packed float IPT_HQ color to start with
    -226     * @param end the packed float IPT_HQ color to end just before
    -227     * @param steps how many steps the gradient should use; usually greater than 2
    -228     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    -229     * @return {@code appending}, after adding the gradient to its end
    -230     */
    -231    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    -232        if(appending == null)
    -233            return null;
    -234        if(steps <= 0) {
    -235            return appending;
    -236        }
    -237        if(steps == 1) {
    -238            appending.add(start);
    -239            return appending;
    -240        }
    -241        int limit = steps;
    -242        float step = 1f / steps, change = 0f;
    -243        for (int i = 0; i < limit; i++) {
    -244            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(start, end, interpolation.apply(change))));
    -245            change += step;
    -246        }
    -247        return appending;
    -248    }
    -249}
    +004import com.github.tommyettinger.colorful.pure.Interpolations;
    +005import com.github.tommyettinger.colorful.pure.Interpolations.Interpolation;
    +006import com.github.tommyettinger.colorful.pure.MathTools;
    +007import com.github.tommyettinger.ds.FloatList;
    +008
    +009/**
    +010 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    +011 * The intent is for the FloatList to be used as a sequence of packed float IPT_HQ colors. You can create a new
    +012 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    +013 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    +014 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    +015 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    +016 * than two colors. You can also customize each section between colors with
    +017 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    +018 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    +019 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    +020 * <br>
    +021 * This class does some special handling for IPT_HQ colors.
    +022 */
    +023public class GradientTools {
    +024    /**
    +025     * No need to instantiate.
    +026     */
    +027    private GradientTools(){
    +028    }
    +029
    +030    /**
    +031     * Creates a FloatList gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color
    +032     * {@code end}, taking the specified number of steps and using linear interpolation.
    +033     * This limits individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at
    +034     * extreme points in the color space will stay in-gamut.
    +035     * @param start the packed float IPT_HQ color to start with
    +036     * @param end the packed float IPT_HQ color to end on
    +037     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +038     * @return a new FloatList that contains the requested gradient
    +039     */
    +040    public static FloatList makeGradient(float start, float end, int steps) {
    +041        return makeGradient(start, end, steps, Interpolations.linear);
    +042    }
    +043    /**
    +044     * Creates a FloatList gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color
    +045     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    +046     * This limits individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at
    +047     * extreme points in the color space will stay in-gamut.
    +048     * @param start the packed float IPT_HQ color to start with
    +049     * @param end the packed float IPT_HQ color to end on
    +050     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +051     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +052     * @return a new FloatList that contains the requested gradient
    +053     */
    +054    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    +055        FloatList appending = new FloatList(steps);
    +056        if(steps <= 0) {
    +057            return appending;
    +058        }
    +059        if(steps == 1) {
    +060            appending.add(start);
    +061            return appending;
    +062        }
    +063        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +064        return appending;
    +065    }
    +066
    +067    /**
    +068     * Appends a gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color {@code end},
    +069     * taking the specified number of steps and using linear Interpolation for how it transitions. This limits
    +070     * individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at extreme points in
    +071     * the color space will stay in-gamut.
    +072     * @param appending a FloatList that will be appended to
    +073     * @param start the packed float IPT_HQ color to start with
    +074     * @param end the packed float IPT_HQ color to end on
    +075     * @param steps how many steps the gradient should use; usually greater than 2
    +076     * @return {@code appending}, after adding the gradient to the end
    +077     */
    +078    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    +079        return appendGradient(appending, start, end, steps, Interpolations.linear);
    +080    }
    +081    /**
    +082     * Appends a gradient from the packed float IPT_HQ color {@code start} to the packed float IPT_HQ color {@code end},
    +083     * taking the specified number of steps and using the specified Interpolation for how it transitions. This limits
    +084     * individual steps of color to the correct IPT_HQ gamut, so even interpolations between colors at extreme points in
    +085     * the color space will stay in-gamut.
    +086     * @param appending a FloatList that will be appended to
    +087     * @param start the packed float IPT_HQ color to start with
    +088     * @param end the packed float IPT_HQ color to end on
    +089     * @param steps how many steps the gradient should use; usually greater than 2
    +090     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +091     * @return {@code appending}, after adding the gradient to the end
    +092     */
    +093    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    +094        if(appending == null)
    +095            return null;
    +096        if(steps <= 0) {
    +097            return appending;
    +098        }
    +099        if(steps == 1) {
    +100            appending.add(start);
    +101            return appending;
    +102        }
    +103        appending.ensureCapacity(steps);
    +104        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +105        return appending;
    +106    }
    +107
    +108    /**
    +109     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses linear
    +110     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +111     * {@code steps} colors.
    +112     * @param appending a FloatList that will be appended to
    +113     * @param steps how many steps the gradient should use; usually greater than 2
    +114     * @param chain an array or varargs of packed float IPT_HQ colors that this will interpolate through in order
    +115     * @return {@code appending}, after adding the gradient to the end
    +116     */
    +117    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    +118        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +119    }
    +120
    +121    /**
    +122     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses linear
    +123     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +124     * {@code steps} colors.
    +125     * @param appending a FloatList that will be appended to
    +126     * @param steps how many steps the gradient should use; usually greater than 2
    +127     * @param chain a FloatList of packed float IPT_HQ colors that this will interpolate through in order
    +128     * @return {@code appending}, after adding the gradient to the end
    +129     */
    +130    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    +131        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +132    }
    +133
    +134    /**
    +135     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses the specified
    +136     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +137     * end of {@code appending} and produces a total of {@code steps} colors.
    +138     * @param appending a FloatList that will be appended to
    +139     * @param steps how many steps the gradient should use; usually greater than 2
    +140     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +141     * @param chain a FloatList of packed float IPT_HQ colors that this will interpolate through in order
    +142     * @return {@code appending}, after adding the gradient to the end
    +143     */
    +144    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    +145        if (appending == null)
    +146            return null;
    +147        if(chain == null)
    +148            return appending;
    +149        if (steps <= 0 || chain.size() == 0) {
    +150            return appending;
    +151        }
    +152        if (steps == 1 || chain.size() == 1) {
    +153            appending.add(chain.first());
    +154            return appending;
    +155        }
    +156        appending.ensureCapacity(steps);
    +157        int limit = steps - 1, splits = chain.size() - 1;
    +158        float step = 1f / steps, change = 0f;
    +159        for (int i = 0; i < limit; i++) {
    +160            float interp = interpolation.apply(change);
    +161            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +162            int idx = (int)splint;
    +163            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint))));
    +164            change += step;
    +165        }
    +166        appending.add(chain.get(splits));
    +167        return appending;
    +168    }
    +169
    +170    /**
    +171     * Appends a gradient between several packed float IPT_HQ colors provided in {@code chain}. This uses the specified
    +172     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +173     * end of {@code appending} and produces a total of {@code steps} colors.
    +174     * @param appending a FloatList that will be appended to
    +175     * @param steps how many steps the gradient should use; usually greater than 2
    +176     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +177     * @param chain an array or varargs of packed float IPT_HQ colors that this will interpolate through in order
    +178     * @return {@code appending}, after adding the gradient to the end
    +179     */
    +180    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    +181        if (appending == null)
    +182            return null;
    +183        if(chain == null)
    +184            return appending;
    +185        if (steps <= 0 || chain.length == 0) {
    +186            return appending;
    +187        }
    +188        if (steps == 1 || chain.length == 1) {
    +189            appending.add(chain[0]);
    +190            return appending;
    +191        }
    +192        appending.ensureCapacity(steps);
    +193        int limit = steps - 1, splits = chain.length - 1;
    +194        float step = 1f / steps, change = 0f;
    +195        for (int i = 0; i < limit; i++) {
    +196            float interp = interpolation.apply(change);
    +197            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +198            int idx = (int)splint;
    +199            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint))));
    +200            change += step;
    +201        }
    +202        appending.add(chain[splits]);
    +203        return appending;
    +204    }
    +205
    +206    /**
    +207     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    +208     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +209     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +210     * number of steps, it just doesn't append {@code end} in the last step.
    +211     * @param appending a FloatList that will be appended to
    +212     * @param start the packed float IPT_HQ color to start with
    +213     * @param end the packed float IPT_HQ color to end just before
    +214     * @param steps how many steps the gradient should use; usually greater than 2
    +215     * @return {@code appending}, after adding the gradient to its end
    +216     */
    +217    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    +218        return appendPartialGradient(appending, start, end, steps, Interpolations.linear);
    +219    }
    +220    /**
    +221     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    +222     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +223     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +224     * number of steps, it just doesn't append {@code end} in the last step.
    +225     * @param appending a FloatList that will be appended to
    +226     * @param start the packed float IPT_HQ color to start with
    +227     * @param end the packed float IPT_HQ color to end just before
    +228     * @param steps how many steps the gradient should use; usually greater than 2
    +229     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    +230     * @return {@code appending}, after adding the gradient to its end
    +231     */
    +232    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    +233        if(appending == null)
    +234            return null;
    +235        if(steps <= 0) {
    +236            return appending;
    +237        }
    +238        if(steps == 1) {
    +239            appending.add(start);
    +240            return appending;
    +241        }
    +242        int limit = steps;
    +243        float step = 1f / steps, change = 0f;
    +244        for (int i = 0; i < limit; i++) {
    +245            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(start, end, interpolation.apply(change))));
    +246            change += step;
    +247        }
    +248        return appending;
    +249    }
    +250}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html
    index b041af4a..94af139d 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/ColorTools.html
    @@ -16,1383 +16,1429 @@
     003import com.github.tommyettinger.colorful.pure.FloatColors;
     004import com.github.tommyettinger.colorful.pure.MathTools;
     005import com.github.tommyettinger.digital.BitConversion;
    -006import com.github.tommyettinger.random.EnhancedRandom;
    -007
    -008import java.util.Random;
    -009
    -010import static com.github.tommyettinger.colorful.pure.oklab.Gamut.GAMUT_DATA;
    -011
    -012/**
    -013 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the Oklab color space.
    -014 * Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for
    -015 * uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab
    -016 * has a noticeably smaller range in chromatic channels (IPT's protan and tritan can range past 0.8 or as low as 0.35,
    -017 * but the similar A and B channels in Oklab don't stray past about 0.65 at the upper end, if that), but it does this so
    -018 * the difference between two Oklab colors is just the Euclidean distance between their components. A slight difference
    -019 * between Oklab and IPT here is that IPT shrinks the chromatic channels to store their -1 to 1 range in a color float's
    -020 * 0 to 1 range, then offsets the shrunken range from -0.5 to 0.5, to 0 to 1; Oklab does not need to shrink the range,
    -021 * and only offsets it in the same way (both just add 0.5).
    -022 * <br>
    -023 * Here's <a href="https://bottosson.github.io/posts/oklab/">Björn Ottosson's original post introducing Oklab</a>.
    -024 * So far, <a href="https://raphlinus.github.io/color/2021/01/18/oklab-critique.html">it stood up to analysis by Raph
    -025 * Levien</a>, and seems to be gaining fans quickly.
    -026 */
    -027public class ColorTools {
    -028        /**
    -029         * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A
    -030         * (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging
    -031         * from bluish to yellowish, called tritan in IPT), and alpha (or opacity). L should be
    -032         * between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for very light
    -033         * colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when both are about 0.5.
    -034         * There's some aesthetic value in changing just one chroma value. When A is high and B is low, the color is more
    -035         * purple/magenta, when both are low it is more bluish, when B is high and A is low, the color tends to be greenish,
    -036         * and when both are high it tends to be orange. When A and B are both near 0.5f, the color is closer to gray.
    -037         * Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha.
    -038         * <br>
    -039         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as
    -040         * L, A, and B, but they will only be reversible from the returned float color to the original L,
    -041         * A, and B values if the original values were in the range that {@link #channelL(float)}, {@link #channelA(float)},
    -042         * and {@link #channelB(float)} return. You can use {@link #inGamut(float, float, float)} to check if a given set of
    -043         * L, A, and B values is in-gamut, that is, it can be converted to and from an RGB color without going out of the
    -044         * valid range. If you just want to enforce that a color is in-gamut, you can use
    -045         * {@link #limitToGamut(float, float, float, float)}, which takes the same parameters this method does, or
    -046         * {@link #limitToGamut(float)} if you already have a packed float color that could be out-of-gamut.
    -047         *
    -048         * @param l     0f to 1f, lightness or L component of Oklab, with 0.5f meaning "no change" and 1f brightening
    -049         * @param a     0f to 1f, protan or A component of Oklab, with 1f more orange, red, or magenta
    -050         * @param b     0f to 1f, tritan or B component of Oklab, with 1f more green, yellow, or red
    -051         * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
    -052         * @return a float encoding a color with the given properties
    -053         */
    -054        public static float oklab(float l, float a, float b, float alpha) {
    -055                return BitConversion.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (b * 255) << 16 & 0xFF0000)
    -056                                | ((int) (a * 255) << 8 & 0xFF00) | ((int) (l * 255) & 0xFF));
    -057        }
    -058
    -059        /**
    -060         * An approximation of the cube-root function for float inputs and outputs.
    -061         * This can be about twice as fast as {@link Math#cbrt(double)}. This
    -062         * version does not tolerate negative inputs, because in the narrow use
    -063         * case it has in this class, it never is given negative inputs.
    -064         * <br>
    -065         * Has very low relative error (less than 1E-9) when inputs are uniformly
    -066         * distributed between 0 and 512, and absolute mean error of less than
    -067         * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one
    -068         * presented in Hacker's Delight and also used in early 3D graphics (see
    -069         * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but
    -070         * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code
    -071         * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk"
    -072         * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 .
    -073         * It's worth noting that while hardware instructions for finding the
    -074         * square root of a float have gotten extremely fast, the same is not
    -075         * true for the cube root (which has to allow negative inputs), so while
    -076         * the bit-twiddling inverse square root is no longer a beneficial
    -077         * optimization on current hardware, this does seem to help.
    -078         * <br>
    -079         * This is used when converting from RGB to Oklab, as an intermediate step.
    -080         * @param x any non-negative finite float to find the cube root of
    -081         * @return the cube root of x, approximated
    -082         */
    -083        private static float cbrtPositive(float x) {
    -084                int ix = BitConversion.floatToRawIntBits(x);
    -085                final float x0 = x;
    -086                ix = (ix>>>2) + (ix>>>4);
    -087                ix += (ix>>>4);
    -088                ix += (ix>>>8) + 0x2A5137A0;
    -089                x  = BitConversion.intBitsToFloat(ix);
    -090                x  = 0.33333334f*(2f * x + x0/(x*x));
    +006import com.github.tommyettinger.digital.TrigTools;
    +007import com.github.tommyettinger.random.EnhancedRandom;
    +008
    +009import java.util.Random;
    +010
    +011import static com.github.tommyettinger.colorful.pure.oklab.Gamut.GAMUT_DATA;
    +012
    +013/**
    +014 * Contains code for manipulating colors as {@code int} and packed {@code float} values in the Oklab color space.
    +015 * Oklab is a very new color space that builds on the same foundation as IPT, but seems to be better-calibrated for
    +016 * uniform lightness and colorfulness, instead of just the emphasis on uniform hue that IPT has. Relative to IPT, Oklab
    +017 * has a noticeably smaller range in chromatic channels (IPT's protan and tritan can range past 0.8 or as low as 0.35,
    +018 * but the similar A and B channels in Oklab don't stray past about 0.65 at the upper end, if that), but it does this so
    +019 * the difference between two Oklab colors is just the Euclidean distance between their components. A slight difference
    +020 * between Oklab and IPT here is that IPT shrinks the chromatic channels to store their -1 to 1 range in a color float's
    +021 * 0 to 1 range, then offsets the shrunken range from -0.5 to 0.5, to 0 to 1; Oklab does not need to shrink the range,
    +022 * and only offsets it in the same way (both just add 0.5).
    +023 * <br>
    +024 * Here's <a href="https://bottosson.github.io/posts/oklab/">Björn Ottosson's original post introducing Oklab</a>.
    +025 * So far, <a href="https://raphlinus.github.io/color/2021/01/18/oklab-critique.html">it stood up to analysis by Raph
    +026 * Levien</a>, and seems to be gaining fans quickly.
    +027 */
    +028public class ColorTools {
    +029        /**
    +030         * Gets a packed float representation of a color given as 4 float components, here, L (luminance or lightness), A
    +031         * (a chromatic component ranging from greenish to reddish, called protan in IPT), B (a chromatic component ranging
    +032         * from bluish to yellowish, called tritan in IPT), and alpha (or opacity). L should be
    +033         * between 0 and 1, inclusive, with 0 used for very dark colors (almost only black), and 1 used for very light
    +034         * colors (almost only white). A and B range from 0.0 to 1.0, with grayscale results when both are about 0.5.
    +035         * There's some aesthetic value in changing just one chroma value. When A is high and B is low, the color is more
    +036         * purple/magenta, when both are low it is more bluish, when B is high and A is low, the color tends to be greenish,
    +037         * and when both are high it tends to be orange. When A and B are both near 0.5f, the color is closer to gray.
    +038         * Alpha is the multiplicative opacity of the color, and acts like RGBA's alpha.
    +039         * <br>
    +040         * This method bit-masks the resulting color's byte values, so any values can technically be given to this as
    +041         * L, A, and B, but they will only be reversible from the returned float color to the original L,
    +042         * A, and B values if the original values were in the range that {@link #channelL(float)}, {@link #channelA(float)},
    +043         * and {@link #channelB(float)} return. You can use {@link #inGamut(float, float, float)} to check if a given set of
    +044         * L, A, and B values is in-gamut, that is, it can be converted to and from an RGB color without going out of the
    +045         * valid range. If you just want to enforce that a color is in-gamut, you can use
    +046         * {@link #limitToGamut(float, float, float, float)}, which takes the same parameters this method does, or
    +047         * {@link #limitToGamut(float)} if you already have a packed float color that could be out-of-gamut.
    +048         *
    +049         * @param l     0f to 1f, lightness or L component of Oklab, with 0.5f meaning "no change" and 1f brightening
    +050         * @param a     0f to 1f, protan or A component of Oklab, with 1f more orange, red, or magenta
    +051         * @param b     0f to 1f, tritan or B component of Oklab, with 1f more green, yellow, or red
    +052         * @param alpha 0f to 1f, 0f makes the color transparent and 1f makes it opaque
    +053         * @return a float encoding a color with the given properties
    +054         */
    +055        public static float oklab(float l, float a, float b, float alpha) {
    +056                return BitConversion.intBitsToFloat(((int) (alpha * 255) << 24 & 0xFE000000) | ((int) (b * 255) << 16 & 0xFF0000)
    +057                                | ((int) (a * 255) << 8 & 0xFF00) | ((int) (l * 255) & 0xFF));
    +058        }
    +059
    +060        /**
    +061         * An approximation of the cube-root function for float inputs and outputs.
    +062         * This can be about twice as fast as {@link Math#cbrt(double)}. This
    +063         * version does not tolerate negative inputs, because in the narrow use
    +064         * case it has in this class, it is never given negative inputs.
    +065         * <br>
    +066         * Has very low relative error (less than 1E-9) when inputs are uniformly
    +067         * distributed between 0 and 512, and absolute mean error of less than
    +068         * 1E-6 in the same scenario. Uses a bit-twiddling method similar to one
    +069         * presented in Hacker's Delight and also used in early 3D graphics (see
    +070         * https://en.wikipedia.org/wiki/Fast_inverse_square_root for more, but
    +071         * this code approximates cbrt(x) and not 1/sqrt(x)). This specific code
    +072         * was originally by Marc B. Reynolds, posted in his "Stand-alone-junk"
    +073         * repo: https://github.com/Marc-B-Reynolds/Stand-alone-junk/blob/master/src/Posts/ballcube.c#L182-L197 .
    +074         * It's worth noting that while hardware instructions for finding the
    +075         * square root of a float have gotten extremely fast, the same is not
    +076         * true for the cube root (which has to allow negative inputs), so while
    +077         * the bit-twiddling inverse square root is no longer a beneficial
    +078         * optimization on current hardware, this does seem to help.
    +079         * <br>
    +080         * This is used when converting from RGB to Oklab, as an intermediate step.
    +081         * @param x any non-negative finite float to find the cube root of
    +082         * @return the cube root of x, approximated
    +083         */
    +084        private static float cbrtPositive(float x) {
    +085                int ix = BitConversion.floatToRawIntBits(x);
    +086                final float x0 = x;
    +087                ix = (ix>>>2) + (ix>>>4);
    +088                ix += (ix>>>4);
    +089                ix += (ix>>>8) + 0x2A5137A0;
    +090                x  = BitConversion.intBitsToFloat(ix);
     091                x  = 0.33333334f*(2f * x + x0/(x*x));
    -092                return x;
    -093        }
    -094
    -095        /**
    -096         * Used when converting from Oklab to RGB, as an intermediate step.
    -097         * Really just {@code x * x * x}.
    -098         * @param x one of the LMS Prime channels to be converted to LMS
    -099         * @return an LMS channel value, which can be converted to RGB
    -100         */
    -101        private static float cube(final float x) {
    -102                return x * x * x;
    -103        }
    -104
    -105        /**
    -106         * The same as floor() from libGDX's MathUtils class, this gets the int floor of a float between -16384 and 16384.
    -107         * @param f a float between -16384 and 16384
    -108         * @return the floor of f, as an int
    -109         */
    -110        private static int floor(final float f) {
    -111                return (int)(f + 0x1p14) - 0x4000;
    -112        }
    -113        /**
    -114         * Used when given non-linear sRGB inputs to make them linear, approximating with gamma 2.0.
    -115         * Really just {@code component * component}.
    -116         * @param component any non-linear channel of a color, to be made linear
    -117         * @return a linear version of component
    -118         */
    -119        private static float forwardGamma(final float component) {
    -120                return component * component;
    -121        }
    -122
    -123        /**
    -124         * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using gamma 2.0.
    -125         * Really just gets the square root of component, as a float.
    -126         * @param component a linear channel of a color, to be made non-linear
    -127         * @return a non-linear version of component
    -128         */
    -129        private static float reverseGamma(final float component) {
    -130                return (float)Math.sqrt(component);
    -131        }
    -132
    -133        /**
    -134         * Changes the curve of a requested L value so that it matches the internally-used curve. This takes a curve with a
    -135         * very-dark area similar to sRGB (a very small one), and makes it significantly larger. This is typically used on
    -136         * "to Oklab" conversions.
    -137         * @param L lightness, from 0 to 1 inclusive
    -138         * @return an adjusted L value that can be used internally
    -139         */
    -140        public static float forwardLight(final float L) {
    -141                final float shape = 0.64516133f, turning = 0.95f;
    -142                final float d = turning - L;
    -143                float r;
    -144                if(d < 0)
    -145                        r = ((1f - turning) * (L - 1f)) / (1f - (L + shape * d)) + 1f;
    -146                else
    -147                        r = (turning * L) / (1e-20f + (L + shape * d));
    -148                return r * r;
    -149        }
    -150
    -151//      public static float forwardLight(final float L) {
    -152//              return (L - 1.004f) / (1f - L * 0.4285714f) + 1.004f;
    -153//      }
    -154
    -155        /**
    -156         * Changes the curve of the internally-used lightness when it is output to another format. This makes the very-dark
    -157         * area smaller, matching (kind-of) the curve that the standard sRGB lightness uses. This is typically used on "from
    -158         * Oklab" conversions.
    -159         * @param L lightness, from 0 to 1 inclusive
    -160         * @return an adjusted L value that can be fed into a conversion to RGBA or something similar
    -161         */
    -162        public static float reverseLight(float L) {
    -163                L = (float) Math.sqrt(L);
    -164                final float shape = 1.55f, turning = 0.95f;
    -165                final float d = turning - L;
    -166                float r;
    -167                if(d < 0)
    -168                        r = ((1f - turning) * (L - 1f)) / (1f - (L + shape * d)) + 1f;
    -169                else
    -170                        r = (turning * L) / (1e-20f + (L + shape * d));
    -171                return r;
    -172        }
    -173
    -174//      public static float reverseLight(final float L) {
    -175//              return (L - 0.993f) / (1f + L * 0.75f) + 0.993f;
    -176//      }
    -177
    -178        /**
    -179         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} to an RGBA8888 int.
    -180         * This format of int can be used with Pixmap and in some other places in libGDX.
    -181         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
    -182         * @return an RGBA8888 int color
    -183         */
    -184        public static int toRGBA8888(final float packed)
    -185        {
    -186                final int decoded = BitConversion.floatToRawIntBits(packed);
    -187                final float L = reverseLight((decoded & 0xff) / 255f);
    -188                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -189                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -190                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -191                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -192                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -193                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
    -194                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
    -195                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
    -196                return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
    -197        }
    -198
    -199        /**
    -200         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)}
    -201         * to a packed float in RGBA format.
    -202         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    -203         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
    -204         * @return a packed float color as RGBA
    -205         */
    -206        public static float toRGBA(final float packed)
    -207        {
    -208                final int decoded = BitConversion.floatToRawIntBits(packed);
    -209                final float L = reverseLight((decoded & 0xff) / 255f);
    -210                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -211                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -212                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -213                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -214                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -215                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
    -216                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
    -217                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
    -218                return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
    -219        }
    -220
    -221        /**
    -222         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
    -223         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
    -224         * @return a packed float as Oklab, which this class can use
    -225         */
    -226        public static float fromRGBA8888(final int rgba) {
    -227                final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f);
    -228                final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    -229                final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    -230
    -231                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
    -232                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
    -233                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
    -234
    -235                return BitConversion.intBitsToFloat(
    -236                                Math.min(Math.max((int)(forwardLight
    -237                                                (0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
    -238                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
    -239                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
    -240                                                | (rgba & 0xFE) << 24);
    -241        }
    -242
    -243        /**
    -244         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
    -245         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
    -246         * @return a packed float as Oklab, which this class can use
    -247         */
    -248        public static float fromRGBA(final float packed) {
    -249                final int abgr = BitConversion.floatToRawIntBits(packed);
    -250                final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f);
    -251                final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    -252                final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    -253                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
    -254                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
    -255                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
    -256                return BitConversion.intBitsToFloat(
    -257                                Math.min(Math.max((int)(forwardLight
    -258                                                (0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
    -259                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
    -260                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
    -261                                                | (abgr & 0xFE000000));
    -262        }
    -263
    -264        /**
    -265         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses.
    -266         * @param r red, from 0.0 to 1.0 (both inclusive)
    -267         * @param g green, from 0.0 to 1.0 (both inclusive)
    -268         * @param b blue, from 0.0 to 1.0 (both inclusive)
    -269         * @param a alpha, from 0.0 to 1.0 (both inclusive)
    -270         * @return a packed float as Oklab, which this class can use
    -271         */
    -272        public static float fromRGBA(float r, float g, float b, final float a) {
    -273                r = forwardGamma(r);
    -274                g = forwardGamma(g);
    -275                b = forwardGamma(b);
    -276                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
    -277                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
    -278                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
    -279                return BitConversion.intBitsToFloat(
    -280                                Math.min(Math.max((int)(forwardLight
    -281                                                (0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
    -282                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.999f + 127.5f), 0), 255) << 8
    -283                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.999f + 127.5f), 0), 255) << 16
    -284                                                | ((int)(a * 255f) << 24 & 0xFE000000));
    -285        }
    -286
    -287        /**
    -288         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -289         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -290         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
    -291         */
    -292        public static int redInt(final float encoded)
    -293        {
    -294                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -295                final float L = reverseLight((decoded & 0xff) / 255f);
    -296                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -297                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -298                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -299                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -300                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -301                return (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
    -302        }
    -303
    -304        /**
    -305         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -306         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -307         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
    -308         */
    -309        public static int greenInt(final float encoded)
    -310        {
    -311                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -312                final float L = reverseLight((decoded & 0xff) / 255f);
    -313                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -314                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -315                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -316                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -317                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -318                return (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
    -319        }
    -320
    -321        /**
    -322         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    -323         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -324         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
    -325         */
    -326        public static int blueInt(final float encoded)
    -327        {
    -328                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -329                final float L = reverseLight((decoded & 0xff) / 255f);
    -330                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -331                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -332                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -333                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -334                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -335                return (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
    -336        }
    -337
    -338        /**
    -339         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
    -340         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    -341         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -342         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
    -343         */
    -344        public static int alphaInt(final float encoded)
    -345        {
    -346                return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
    -347        }
    -348
    -349        /**
    -350         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -351         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -352         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
    -353         */
    -354        public static float red(final float encoded)
    -355        {
    -356                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -357                final float L = reverseLight((decoded & 0xff) / 255f);
    -358                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -359                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -360                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -361                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -362                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -363                return reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    -364        }
    -365
    -366        /**
    -367         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -368         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -369         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
    -370         */
    -371        public static float green(final float encoded)
    -372        {
    -373                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -374                final float L = reverseLight((decoded & 0xff) / 255f);
    -375                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -376                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -377                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -378                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -379                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -380                return reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    -381        }
    -382
    -383        /**
    -384         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -385         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -386         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
    -387         */
    -388        public static float blue(final float encoded)
    -389        {
    -390                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -391                final float L = reverseLight((decoded & 0xff) / 255f);
    -392                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -393                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -394                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -395                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -396                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -397                return reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    -398        }
    -399
    -400        /**
    -401         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    -402         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -403         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
    -404         */
    -405        public static float alpha(final float encoded)
    -406        {
    -407                return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
    -408        }
    -409
    -410        /**
    -411         * Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale
    -412         * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is
    -413         * that colors that are perceptually more-colorful have higher chroma than colors that are perceptually
    -414         * less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That
    -415         * is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color
    -416         * isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that
    -417         * is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to
    -418         * 0 chroma, and the most colorful values (close to cyan) should have 0.334f chroma.
    -419         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -420         * @return a float between 0.0f and 0.334f that represents how colorful the given value is
    -421         */
    -422        public static float chroma(final float encoded) {
    -423                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -424                final float a = ((decoded >>> 7 & 0x1FE) - 0xFF)  * 0x1p-8f;
    -425                final float b = ((decoded >>> 15 & 0x1FE) - 0xFF) * 0x1p-8f;
    -426                return (float) Math.sqrt(a * a + b * b);
    -427        }
    -428
    -429        /**
    -430         * Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness
    -431         * combination. This is useful to know the bounds of {@link #chroma(float)}. This should be no greater
    -432         * than 0.334f .
    -433         * @param hue the hue, typically between 0.0f and 1.0f, to look up
    -434         * @param lightness the lightness, clamped between 0.0f and 1.0f, to look up
    -435         * @return the maximum possible chroma for the given hue and lightness, between 0.0f and 0.334f
    -436         */
    -437        public static float chromaLimit(final float hue, final float lightness){
    -438                final int idx = (int) (Math.min(Math.max(lightness, 0f), 1f) * 255.999f) << 8
    -439                                | (int) (256f * (hue - floor(hue)));
    -440                return (GAMUT_DATA[idx] + 1.5f) * 0x1p-8f;
    -441        }
    -442
    -443        /**
    -444         * Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity.
    -445         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
    -446         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
    -447         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
    -448         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
    -449         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
    -450         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
    -451         * of high-saturation where lightness is 0.5f.
    -452         * <br>
    -453         * This method considers its hue, saturation, and lightness parameters as the HSL color space does. You may instead
    -454         * want the method {@link #oklabByHSL(float, float, float, float)}, which treats lightness exactly as Oklab does,
    -455         * and handles hue and saturation with the Oklab color solid (which is shaped oddly) instead of the HSL color solid
    -456         * (which is a bicone, with a wide cone pointing up attached at the base to another wide cone pointing down).
    -457         * Using oklabByHSL() should be faster in many cases, and the lightness handling alone may be a reason to use it.
    -458         * There is also {@link #oklabByHCL(float, float, float, float)}, which may be preferable if you want a specific
    -459         * amount of chroma (colorful-ness) and no greater.
    -460         *
    -461         * @param hue        0f to 1f, color wheel position
    -462         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
    -463         * @param lightness  0f to 1f, 0f is black and 1f is white
    -464         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
    -465         * @return a float encoding a color with the given properties
    -466         */
    -467        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
    -468                if (lightness <= 0.001f) {
    -469                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    -470                } else {
    -471                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    -472                }
    -473        }
    -474
    -475        /**
    -476         * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
    -477         * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details. It is also
    -478         * different from {@link #oklabSaturation(float)}, which gets the saturation as Oklab understands it rather than how
    -479         * HSL understands it.
    -480         *
    -481         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -482         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    -483         */
    -484        public static float saturation(final float encoded) {
    -485                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -486                final float L = reverseLight((decoded & 0xff) / 255f);
    -487                if(Math.abs(L - 0.5) > 0.495f) return 0f;
    -488                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -489                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -490                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -491                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -492                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -493                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    -494                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    -495                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    -496                float x, y, w;
    -497                if(g < b) {
    -498                        x = b;
    -499                        y = g;
    -500                }
    -501                else {
    -502                        x = g;
    -503                        y = b;
    -504                }
    -505                if(r < x) {
    -506                        w = r;
    -507                }
    -508                else {
    -509                        w = x;
    -510                        x = r;
    -511                }
    -512                return x - Math.min(w, y);
    -513        }
    -514
    -515        /**
    -516         * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for Oklab. You can
    -517         * also use {@link #oklabLightness(float)}, which is an alias for channelL(). This ranges from 0.0f (black) to 1.0f
    -518         * (white).
    -519         *
    -520         * @param encoded a packed float Oklab color
    -521         * @return the lightness of the given color as HSL would calculate it
    -522         */
    -523        public static float lightness(final float encoded) {
    -524                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -525                final float L = reverseLight((decoded & 0xff) / 255f);
    -526                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -527                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -528                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -529                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -530                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -531                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    -532                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    -533                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    -534                float x, y, w;
    -535                if(g < b) {
    -536                        x = b;
    -537                        y = g;
    -538                }
    -539                else {
    -540                        x = g;
    -541                        y = b;
    -542                }
    -543                if(r < x) {
    -544                        w = r;
    -545                }
    -546                else {
    -547                        w = x;
    -548                        x = r;
    -549                }
    -550                float d = x - Math.min(w, y);
    -551                return x * (1f - 0.5f * d / (x + 1e-10f));
    -552        }
    -553
    -554        /**
    -555         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    -556         * to 1f (exclusive, red and approaching purple if decreased). You can also use {@link #oklabHue(float)}, which
    -557         * positions the different hues at different values, somewhat, from this, but is more accurate to how Oklab handles
    -558         * hues.
    -559         *
    -560         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    -561         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    -562         * eventually to purple before looping back to almost the same red (1.0, exclusive)
    -563         */
    -564        public static float hue(final float encoded) {
    -565                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -566                final float L = reverseLight((decoded & 0xff) / 255f);
    -567                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -568                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -569                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -570                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -571                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -572                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    -573                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    -574                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    -575                float x, y, z, w;
    -576                if(g < b) {
    -577                        x = b;
    -578                        y = g;
    -579                        z = -1f;
    -580                        w = 2f / 3f;
    -581                }
    -582                else {
    -583                        x = g;
    -584                        y = b;
    -585                        z = 0f;
    -586                        w = -1f / 3f;
    -587                }
    -588                if(r < x) {
    -589                        z = w;
    -590                        w = r;
    -591                }
    -592                else {
    -593                        w = x;
    -594                        x = r;
    -595                }
    -596                float d = x - Math.min(w, y);
    -597                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
    -598        }
    -599
    -600        /**
    -601         * The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to
    -602         * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
    -603         *
    -604         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
    -605         * @return the L value as a float from 0.0f to 1.0f
    -606         */
    -607        public static float channelL(final float encoded)
    -608        {
    -609                return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    -610        }
    -611
    -612        /**
    -613         * The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the
    -614         * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or
    -615         * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with
    -616         * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}.
    -617         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
    -618         * @return the A value as a float from 0.0f to 1.0f
    -619         */
    -620        public static float channelA(final float encoded)
    -621        {
    -622                return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    -623        }
    -624
    -625        /**
    -626         * The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the
    -627         * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more
    -628         * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit
    -629         * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}.
    -630         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
    -631         * @return the B value as a float from 0.0f to 1.0f
    -632         */
    -633        public static float channelB(final float encoded)
    -634        {
    -635                return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    -636        }
    -637
    -638        /**
    -639         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    -640         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not Oklab! Takes
    -641         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    -642         * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is
    -643         * likely to be different than the result of {@link #oklab(float, float, float, float)} unless hue, saturation,
    -644         * lightness, and opacity are all 0. This won't allocate any objects.
    -645         * <br>
    -646         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    -647         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    -648         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    -649         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    -650         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    -651         * <br>
    -652         * You may want {@link #editOklab(float, float, float, float, float, float, float, float, float)} instead, which
    -653         * adjusts the L, A, B, and alpha channels directly instead of converting to HSL and back.
    -654         *
    -655         * @param basis      a packed float color that will be used as the starting point to make the next color
    -656         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    -657         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    -658         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    -659         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    -660         * @return a float encoding a variation of basis with the given changes
    -661         */
    -662        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    -663                final int decoded = BitConversion.floatToRawIntBits(basis);
    -664                final float L = Math.min(Math.max(light + reverseLight((decoded & 0xff) / 255f), 0f), 1f);
    -665                opacity = Math.min(Math.max(opacity + (decoded >>> 25) * (1f / 127f), 0f), 1f);
    -666                if (L <= 0.001f)
    -667                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
    -668                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -669                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -670                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    -671                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    -672                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    -673                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    -674                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    -675                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    -676                float x, y, z, w;
    -677                if(g < b) {
    -678                        x = b;
    -679                        y = g;
    -680                        z = -1f;
    -681                        w = 2f / 3f;
    -682                }
    -683                else {
    -684                        x = g;
    -685                        y = b;
    -686                        z = 0f;
    -687                        w = -1f / 3f;
    -688                }
    -689                if(r < x) {
    -690                        z = w;
    -691                        w = r;
    -692                }
    -693                else {
    -694                        w = x;
    -695                        x = r;
    -696                }
    -697                final float d = x - Math.min(w, y);
    -698                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
    -699                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
    -700                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    -701                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    -702        }
    -703
    -704        /**
    -705         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    -706         * start as-is) and 1f (return white), start should be a packed color, as from
    -707         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -708         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -709         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    -710         * @see #darken(float, float) the counterpart method that darkens a float color
    -711         * @param start the starting color as a packed float
    -712         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    -713         * @return a packed float that represents a color between start and white
    -714         */
    -715        public static float lighten(final float start, final float change) {
    -716                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    -717                return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
    -718        }
    -719
    -720        /**
    -721         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    -722         * start as-is) and 1f (return black), start should be a packed color, as from
    -723         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -724         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -725         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    -726         * @see #lighten(float, float) the counterpart method that lightens a float color
    -727         * @param start the starting color as a packed float
    -728         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    -729         * @return a packed float that represents a color between start and black
    -730         */
    -731        public static float darken(final float start, final float change) {
    -732                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    -733                return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
    -734        }
    -735
    -736        /**
    -737         * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
    -738         * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
    -739         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -740         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    -741         * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    -742         * alpha and L of start as-is.
    -743         * @see #lowerA(float, float) the counterpart method that cools a float color
    -744         * @param start the starting color as a packed float
    -745         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
    -746         * @return a packed float that represents a color between start and a warmer color
    -747         */
    -748        public static float raiseA(final float start, final float change) {
    -749                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -750                return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    -751        }
    -752
    -753        /**
    -754         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
    -755         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
    -756         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -757         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -758         * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
    -759         * L of start as-is.
    -760         * @see #raiseA(float, float) the counterpart method that warms a float color
    -761         * @param start the starting color as a packed float
    -762         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
    -763         * @return a packed float that represents a color between start and a cooler color
    -764         */
    -765        public static float lowerA(final float start, final float change) {
    -766                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    -767                return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    -768        }
    -769
    -770        /**
    -771         * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    -772         * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as
    -773         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    -774         * Colors, and is a little more efficient and clear than using
    -775         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
    -776         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
    -777         * @see #lowerB(float, float) the counterpart method that makes a float color less natural
    -778         * @param start the starting color as a packed float
    -779         * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
    -780         * @return a packed float that represents a color between start and a more natural color
    -781         */
    -782        public static float raiseB(final float start, final float change) {
    -783                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -784                return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    -785        }
    -786
    -787        /**
    -788         * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    -789         * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as
    -790         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    -791         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    -792         * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    -793         * alpha and L of start as-is.
    -794         * @see #raiseB(float, float) the counterpart method that makes a float color less artificial
    -795         * @param start the starting color as a packed float
    -796         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
    -797         * @return a packed float that represents a color between start and a more artificial color
    -798         */
    -799        public static float lowerB(final float start, final float change) {
    -800                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    -801                return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    -802        }
    -803
    -804        /**
    -805         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    -806         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    -807         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -808         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -809         * transparent. This won't change the L, A, or B of the color.
    -810         * @see #fade(float, float) the counterpart method that makes a float color more translucent
    -811         * @param start the starting color as a packed float
    -812         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    -813         * @return a packed float that represents a color between start and its opaque version
    -814         */
    -815        public static float blot(final float start, final float change) {
    -816                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    -817                return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    -818        }
    -819
    -820        /**
    -821         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    -822         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    -823         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -824         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -825         * transparent. This won't change the L, A, or B of the color.
    -826         * @see #blot(float, float) the counterpart method that makes a float color more opaque
    -827         * @param start the starting color as a packed float
    -828         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    -829         * @return a packed float that represents a color between start and transparent
    -830         */
    -831        public static float fade(final float start, final float change) {
    -832                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    -833                return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    -834        }
    -835
    -836        /**
    -837         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
    -838         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    -839         * from {@link #oklab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone, unlike
    -840         * {@link #lessenChange(float, float)}, which usually changes L.
    -841         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    -842         * @param start the starting color as a packed float
    -843         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    -844         * @return a packed float that represents a color between start and a desaturated color
    -845         */
    -846        public static float dullen(final float start, final float change) {
    -847                final int s = BitConversion.floatToRawIntBits(start);
    -848                return oklab((s & 0xFF) / 255f,
    -849                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    -850                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    -851                                (s >>> 25) / 127f);
    -852        }
    -853
    -854        /**
    -855         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
    -856         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    -857         * from {@link #oklab(float, float, float, float)}. This changes only A and B. Higher values for {@code change} can
    -858         * force the color out of the gamut, which this corrects using {@link #limitToGamut(float, float, float, float)}.
    -859         * The alpha never changes.
    -860         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    -861         * @param start the starting color as a packed float
    -862         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    -863         * @return a packed float that represents a color between start and a saturated color
    -864         */
    -865        public static float enrich(final float start, final float change) {
    -866                final int s = BitConversion.floatToRawIntBits(start);
    -867                return limitToGamut((s & 0xFF) / 255f,
    -868                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    -869                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    -870                                (s >>> 25) / 127f);
    -871        }
    -872
    -873        /**
    -874         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast with,
    -875         * gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B
    -876         * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
    -877         * dark colors, and also has a gap in the range it produces for L values between 0.5 and 0.55. That allows
    -878         * most of the colors this method produces to contrast well as a foreground when displayed on a background of
    -879         * {@code contrastingColor}, or vice versa. This will leave the L unchanged if the chromatic channels of the
    -880         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
    -881         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
    -882         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
    -883         * {@code contrastingColor} without losing its other qualities.
    -884         * @param mainColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
    -885         *                     this is the color that will be adjusted
    -886         * @param contrastingColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
    -887         *                            the adjusted mainColor will contrast with this
    -888         * @return a different Oklab packed float color, based on mainColor but with potentially very different lightness
    -889         */
    -890        public static float inverseLightness(final float mainColor, final float contrastingColor)
    -891        {
    -892                final int bits = BitConversion.floatToRawIntBits(mainColor),
    -893                                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    -894                                L = (bits & 0xff),
    -895                                A = (bits >>> 8 & 0xff),
    -896                                B = (bits >>> 16 & 0xff),
    -897                                cL = (contrastBits & 0xff),
    -898                                cA = (contrastBits >>> 8 & 0xff),
    -899                                cB = (contrastBits >>> 16 & 0xff);
    -900                if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000)
    -901                        return mainColor;
    -902                return BitConversion.intBitsToFloat((bits & 0xFEFFFF00) | (int) (cL < 128 ? L * 0.45f + 140 : 127 - L * 0.45f));
    -903        }
    -904
    -905        /**
    -906         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast
    -907         * with, gets a packed float Oklab color with L that should be quite different from {@code contrastingColor}'s L,
    -908         * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
    -909         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
    -910         * a background of {@code contrastingColor}, or vice versa.
    -911         * <br>
    -912         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    -913         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    -914         * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
    -915         * @param mainColor a packed Oklab float color; this is the color that will be adjusted
    -916         * @param contrastingColor a packed Oklab float color; the adjusted mainColor will contrast with the L of this
    -917         * @return a different packed Oklab float color, based on mainColor but typically with different lightness
    -918         */
    -919        public static float differentiateLightness(final float mainColor, final float contrastingColor)
    -920        {
    -921                final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    -922                return limitToGamut(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
    -923        }
    -924
    -925        /**
    -926         * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
    -927         * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
    -928         * results in the middle-range of possible lightness.
    -929         * @param mainColor a packed Oklab float color
    -930         * @return a different packed Oklab float color, with its L channel changed and limited to the correct gamut
    -931         */
    -932        public static float offsetLightness(final float mainColor) {
    -933                final int oklab = BitConversion.floatToRawIntBits(mainColor);
    -934                return limitToGamut(BitConversion.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
    -935        }
    -936
    -937        /**
    -938         * Makes the additive Oklab color stored in {@code color} cause less of a change when used as a tint, as if it were
    -939         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    -940         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    -941         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    -942         * @param color a color that should have its tinting effect potentially weakened
    -943         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    -944         * @return an Oklab float color between gray and {@code color}
    -945         */
    -946        public static float lessenChange(final float color, float fraction) {
    -947                final int e = BitConversion.floatToRawIntBits(color),
    -948                                sL = 0x80, sA = 0x80, sB = 0x80,
    -949                                eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
    -950                return BitConversion.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF)
    -951                                | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8)
    -952                                | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16)
    -953                                | (eAlpha << 24));
    -954        }
    -955
    -956        /**
    -957         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    -958         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    -959         * be different each time this is called, and can be obtained from a random number generator to make the colors more
    -960         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    -961         * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the
    -962         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    -963         * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1,
    -964         * but only internally for measuring distance).
    -965         * @param color a packed float color, as produced by {@link #oklab(float, float, float, float)}
    -966         * @param seed a long seed that should be different on each call; should not be 0
    -967         * @param variance max amount of difference between the given color and the generated color; always less than 1
    -968         * @return a generated packed float color that should be at least somewhat different from {@code color}
    -969         */
    -970        public static float randomEdit(final float color, long seed, final float variance) {
    -971                final int decoded = BitConversion.floatToRawIntBits(color);
    -972                final float L = reverseLight((decoded & 0xff) / 255f);
    -973                final float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -974                final float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -975                final float limit = variance * variance;
    -976                float dist, x, y, z;
    -977                for (int j = 0; j < 50; j++) {
    -978                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -979                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -980                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -981                        seed += 0x9E3779B97F4A7C15L;
    -982                        dist = x * x + y * y + z * z;
    -983                        if(dist <= limit && inGamut(x += L, y = (A + y) * 0.5f + 0.5f, z = (B + z) * 0.5f + 0.5f))
    -984                                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000)
    -985                                                | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f));
    -986                }
    -987                return color;
    -988        }
    -989
    -990        /**
    -991         * Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and
    -992         * hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness
    -993         * and hue. The index can be constructed from a lightness value {@code L} from 0 to 255, and a hue value {@code H}
    -994         * from 0 to 255 with: {@code (L << 8 | H)} or the simpler equivalent {@code (L * 256 + H)}. These assume L and H
    -995         * have been limited to the 0 to 255 range already. This does not bounds-check index. Because hue is not typically
    -996         * measured between 0 and 255, getting that value is a bit different; you can use
    -997         * {@link MathTools#atan2_(float, float)} (with an Oklab color's B for y, then its A for x) and multiply it by 256
    -998         * to get H.
    -999         * <br>
    -1000         * The distance this returns is a byte between 0 and 84 (both inclusive), as the Euclidean distance from the center
    -1001         * grayscale value at the lightness in the index, to the edge of the gamut at the same lightness, along the hue in
    -1002         * the index. This is measured in a space from -1 to 1 for both A and B, with the 0 in the center meaning grayscale,
    -1003         * and multiplied by 256 to get a meaningful byte value. To return to the A and B values Oklab uses here, you would
    -1004         * need to use some trigonometry on the hue (if it's in the 0 to 1 range, you can call
    -1005         * {@link MathTools#cos_(float)} on the hue to almost get A, and {@link MathTools#sin_(float)} to almost get B),
    -1006         * then multiply each of those by the distance, divide each by 256.0, and add 0.5.
    -1007         * <br>
    -1008         * Only intended for the narrow cases where external code needs read-only access to the internal Oklab gamut data.
    -1009         * The gamut data is quite large (it is in a 71 KB source file containing only the gamut, while the entire IPT_HQ
    -1010         * ColorTools file is 56 KB, and includes everything else except a gamut table), so it's better to have
    -1011         * direct read access to it without being able to accidentally rewrite it.
    -1012         * @param index must be between 0 and 65535; the upper 8 bits are lightness and the lower 8 are hue angle.
    -1013         * @return a byte (always between 0 and 84, inclusive) representing the Euclidean distance between a grayscale value and the most saturated value possible, using the above measurements
    -1014         */
    -1015        public static byte getRawGamutValue(int index){
    -1016                return GAMUT_DATA[index];
    -1017        }
    -1018
    -1019        /**
    -1020         * Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
    -1021         * @param packed a packed float color as Oklab
    -1022         * @return true if the given packed float color can be converted back and forth to RGBA
    -1023         */
    -1024        public static boolean inGamut(final float packed)
    -1025        {
    -1026                final int decoded = BitConversion.floatToRawIntBits(packed);
    -1027                final float A = ((decoded >>> 8 & 0xff) - 127f) / 255f;
    -1028                final float B = ((decoded >>> 16 & 0xff) - 127f) / 255f;
    -1029                final float g = GAMUT_DATA[(decoded & 0xff) << 8 | (int)(256f * MathTools.atan2_(B, A))];
    -1030                return g * g * 0x1p-18 + 0x1p-14 >= (A * A + B * B);
    -1031        }
    -1032
    -1033        /**
    -1034         * Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
    -1035         * @param L lightness channel, as a float from 0 to 1
    -1036         * @param A green-to-red chromatic channel, as a float from 0 to 1
    -1037         * @param B blue-to-yellow chromatic channel, as a float from 0 to 1
    -1038         * @return true if the given Oklab channels can be converted back and forth to RGBA
    -1039         */
    -1040        public static boolean inGamut(float L, float A, float B)
    -1041        {
    -1042                A = ((int) (A * 255) - 127f) / 255f;
    -1043                B = ((int) (B * 255) - 127f) / 255f;
    -1044                final float g = GAMUT_DATA[((int) (L * 255) & 0xFF) << 8 | (int)(256f * MathTools.atan2_(B, A))];
    -1045                return g * g * 0x1p-18 + 0x1p-14 >= (A * A + B * B);
    -1046
    -1047                ////This was the old code for this inGamut(), which was subtly different from the other inGamut() when called
    -1048                /// on a packed float. The packed floats can go ever-so-slightly towards or away from the edge.
    -1049//              A = (A - 0.5f);
    -1050//              B = (B - 0.5f);
    -1051//              final byte g = GAMUT_DATA[((int)(L * 255.999f) << 8) | (int)(256f * MathTools.atan2_(B, A))];
    -1052//              return g * g * 0x1p-16 >= (A * A + B * B);
    -1053
    -1054        }
    +092                x  = 0.33333334f*(2f * x + x0/(x*x));
    +093                return x;
    +094        }
    +095
    +096        /**
    +097         * Used when converting from Oklab to RGB, as an intermediate step.
    +098         * Really just {@code x * x * x}.
    +099         * @param x one of the LMS Prime channels to be converted to LMS
    +100         * @return an LMS channel value, which can be converted to RGB
    +101         */
    +102        private static float cube(final float x) {
    +103                return x * x * x;
    +104        }
    +105
    +106        /**
    +107         * The same as floor() from libGDX's MathUtils class, this gets the int floor of a float between -16384 and 16384.
    +108         * @param f a float between -16384 and 16384
    +109         * @return the floor of f, as an int
    +110         */
    +111        private static int floor(final float f) {
    +112                return (int)(f + 0x1p14) - 0x4000;
    +113        }
    +114        /**
    +115         * Used when given non-linear sRGB inputs to make them linear, approximating with gamma 2.0.
    +116         * Really just {@code component * component}.
    +117         * @param component any non-linear channel of a color, to be made linear
    +118         * @return a linear version of component
    +119         */
    +120        private static float forwardGamma(final float component) {
    +121                return component * component;
    +122        }
    +123
    +124        /**
    +125         * Used to return from a linear, gamma-corrected input to an sRGB, non-linear output, using gamma 2.0.
    +126         * Really just gets the square root of component, as a float.
    +127         * @param component a linear channel of a color, to be made non-linear
    +128         * @return a non-linear version of component
    +129         */
    +130        private static float reverseGamma(final float component) {
    +131                return (float)Math.sqrt(component);
    +132        }
    +133
    +134        /**
    +135         * Changes the curve of a requested L value so that it matches the internally-used curve. This takes a curve with a
    +136         * very-dark area similar to sRGB (a very small one), and makes it significantly larger. This is typically used on
    +137         * "to Oklab" conversions.
    +138         * @param L lightness, from 0 to 1 inclusive
    +139         * @return an adjusted L value that can be used internally
    +140         */
    +141        public static float forwardLight(final float L) {
    +142                final float shape = 0.6578947368421053f, turning = 0.963f;
    +143                final float d = turning - L;
    +144                float r;
    +145                if (d < 0)
    +146                        r = ((1f - turning) * (L - 1f)) / (1f - (L + shape * d)) + 1f;
    +147                else
    +148                        r = (turning * L) / (1e-20f + (L + shape * d));
    +149                return r * r * (256f / 255f);
    +150        }
    +151
    +152//      public static float forwardLight(final float L) {
    +153//              return (L - 1.004f) / (1f - L * 0.4285714f) + 1.004f;
    +154//      }
    +155
    +156        /**
    +157         * Changes the curve of the internally-used lightness when it is output to another format. This makes the very-dark
    +158         * area smaller, matching (kind-of) the curve that the standard sRGB lightness uses. This is typically used on "from
    +159         * Oklab" conversions.
    +160         * @param L lightness, from 0 to 1 inclusive
    +161         * @return an adjusted L value that can be fed into a conversion to RGBA or something similar
    +162         */
    +163        public static float reverseLight(float L) {
    +164                L = (float) Math.sqrt(L * 0x0.ffp0f);
    +165                final float shape = 1.52f, turning = 0.963f;
    +166                final float d = turning - L;
    +167                float r;
    +168                if (d < 0)
    +169                        r = ((1f - turning) * (L - 1f)) / (1f - (L + shape * d)) + 1f;
    +170                else
    +171                        r = (turning * L) / (1e-20f + (L + shape * d));
    +172                return r;
    +173        }
    +174
    +175//      public static float reverseLight(final float L) {
    +176//              return (L - 0.993f) / (1f + L * 0.75f) + 0.993f;
    +177//      }
    +178
    +179        /**
    +180         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)} to an RGBA8888 int.
    +181         * This format of int can be used with Pixmap and in some other places in libGDX.
    +182         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
    +183         * @return an RGBA8888 int color
    +184         */
    +185        public static int toRGBA8888(final float packed)
    +186        {
    +187                final int decoded = BitConversion.floatToRawIntBits(packed);
    +188                final float L = reverseLight((decoded & 0xff) / 255f);
    +189                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +190                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +191                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +192                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +193                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +194                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
    +195                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
    +196                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
    +197                return r << 24 | g << 16 | b << 8 | (decoded & 0xfe000000) >>> 24 | decoded >>> 31;
    +198        }
    +199
    +200        /**
    +201         * Converts a packed float color in the format produced by {@link ColorTools#oklab(float, float, float, float)}
    +202         * to a packed float in RGBA format.
    +203         * This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    +204         * @param packed a packed float color, as produced by {@link ColorTools#oklab(float, float, float, float)}
    +205         * @return a packed float color as RGBA
    +206         */
    +207        public static float toRGBA(final float packed)
    +208        {
    +209                final int decoded = BitConversion.floatToRawIntBits(packed);
    +210                final float L = reverseLight((decoded & 0xff) / 255f);
    +211                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +212                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +213                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +214                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +215                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +216                final int r = (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
    +217                final int g = (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
    +218                final int b = (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
    +219                return BitConversion.intBitsToFloat(r | g << 8 | b << 16 | (decoded & 0xfe000000));
    +220        }
    +221
    +222        /**
    +223         * Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
    +224         * @param rgba an int with the channels (in order) red, green, blue, alpha; should have 8 bits per channel
    +225         * @return a packed float as Oklab, which this class can use
    +226         */
    +227        public static float fromRGBA8888(final int rgba) {
    +228                final float r = forwardGamma((rgba >>> 24) * 0x1.010101010101p-8f);
    +229                final float g = forwardGamma((rgba >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    +230                final float b = forwardGamma((rgba >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    +231
    +232                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
    +233                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
    +234                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
    +235
    +236                return BitConversion.intBitsToFloat(
    +237                                Math.min(Math.max((int)(forwardLight
    +238                                                (0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
    +239                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.5f + 127.5f), 0), 255) << 8
    +240                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.5f + 127.5f), 0), 255) << 16
    +241                                                | (rgba & 0xFE) << 24);
    +242        }
    +243
    +244        /**
    +245         * Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
    +246         * @param packed a packed float in RGBA8888 format, with A in the MSB and R in the LSB
    +247         * @return a packed float as Oklab, which this class can use
    +248         */
    +249        public static float fromRGBA(final float packed) {
    +250                final int abgr = BitConversion.floatToRawIntBits(packed);
    +251                final float r = forwardGamma((abgr & 0xFF) * 0x1.010101010101p-8f);
    +252                final float g = forwardGamma((abgr >>> 8 & 0xFF) * 0x1.010101010101p-8f);
    +253                final float b = forwardGamma((abgr >>> 16 & 0xFF) * 0x1.010101010101p-8f);
    +254                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
    +255                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
    +256                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
    +257                return BitConversion.intBitsToFloat(
    +258                                Math.min(Math.max((int)(forwardLight
    +259                                                (0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
    +260                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.5f + 127.5f), 0), 255) << 8
    +261                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.5f + 127.5f), 0), 255) << 16
    +262                                                | (abgr & 0xFE000000));
    +263        }
    +264
    +265
    +266        /**
    +267         * Takes RGBA components from 0.0 to 1.0 each and converts to a packed float in the Oklab format this uses.
    +268         * @param r red, from 0.0 to 1.0 (both inclusive)
    +269         * @param g green, from 0.0 to 1.0 (both inclusive)
    +270         * @param b blue, from 0.0 to 1.0 (both inclusive)
    +271         * @param a alpha, from 0.0 to 1.0 (both inclusive)
    +272         * @return a packed float as Oklab, which this class can use
    +273         */
    +274        public static float fromRGBA(float r, float g, float b, final float a) {
    +275                r = forwardGamma(r);
    +276                g = forwardGamma(g);
    +277                b = forwardGamma(b);
    +278                final float l = cbrtPositive(0.4121656120f * r + 0.5362752080f * g + 0.0514575653f * b);
    +279                final float m = cbrtPositive(0.2118591070f * r + 0.6807189584f * g + 0.1074065790f * b);
    +280                final float s = cbrtPositive(0.0883097947f * r + 0.2818474174f * g + 0.6302613616f * b);
    +281                return BitConversion.intBitsToFloat(
    +282                                Math.min(Math.max((int)(forwardLight
    +283                                                (0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s) * 255.999f         ), 0), 255)
    +284                                                | Math.min(Math.max((int)((1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s) * 127.5f + 127.5f), 0), 255) << 8
    +285                                                | Math.min(Math.max((int)((0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s) * 127.5f + 127.5f), 0), 255) << 16
    +286                                                | ((int)(a * 255f) << 24 & 0xFE000000));
    +287        }
    +288
    +289        /**
    +290         * Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +291         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +292         * @return an int from 0 to 255, inclusive, representing the red channel value of the given encoded color
    +293         */
    +294        public static int redInt(final float encoded)
    +295        {
    +296                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +297                final float L = reverseLight((decoded & 0xff) / 255f);
    +298                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +299                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +300                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +301                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +302                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +303                return (int)(reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f)) * 255.999f);
    +304        }
    +305
    +306        /**
    +307         * Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +308         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +309         * @return an int from 0 to 255, inclusive, representing the green channel value of the given encoded color
    +310         */
    +311        public static int greenInt(final float encoded)
    +312        {
    +313                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +314                final float L = reverseLight((decoded & 0xff) / 255f);
    +315                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +316                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +317                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +318                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +319                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +320                return (int)(reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f)) * 255.999f);
    +321        }
    +322
    +323        /**
    +324         * Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    +325         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +326         * @return an int from 0 to 255, inclusive, representing the blue channel value of the given encoded color
    +327         */
    +328        public static int blueInt(final float encoded)
    +329        {
    +330                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +331                final float L = reverseLight((decoded & 0xff) / 255f);
    +332                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +333                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +334                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +335                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +336                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +337                return (int)(reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f)) * 255.999f);
    +338        }
    +339
    +340        /**
    +341         * Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because
    +342         * of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    +343         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +344         * @return an even int from 0 to 254, inclusive, representing the alpha channel value of the given encoded color
    +345         */
    +346        public static int alphaInt(final float encoded)
    +347        {
    +348                return (BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24;
    +349        }
    +350
    +351        /**
    +352         * Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +353         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +354         * @return a float from 0.0f to 1.0f, inclusive, representing the red channel value of the given encoded color
    +355         */
    +356        public static float red(final float encoded)
    +357        {
    +358                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +359                final float L = reverseLight((decoded & 0xff) / 255f);
    +360                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +361                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +362                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +363                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +364                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +365                return reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    +366        }
    +367
    +368        /**
    +369         * Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +370         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +371         * @return a float from 0.0f to 1.0f, inclusive, representing the green channel value of the given encoded color
    +372         */
    +373        public static float green(final float encoded)
    +374        {
    +375                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +376                final float L = reverseLight((decoded & 0xff) / 255f);
    +377                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +378                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +379                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +380                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +381                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +382                return reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    +383        }
    +384
    +385        /**
    +386         * Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +387         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +388         * @return a float from 0.0f to 1.0f, inclusive, representing the blue channel value of the given encoded color
    +389         */
    +390        public static float blue(final float encoded)
    +391        {
    +392                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +393                final float L = reverseLight((decoded & 0xff) / 255f);
    +394                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +395                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +396                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +397                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +398                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +399                return reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    +400        }
    +401
    +402        /**
    +403         * Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    +404         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +405         * @return a float from 0.0f to 1.0f, inclusive, representing the alpha channel value of the given encoded color
    +406         */
    +407        public static float alpha(final float encoded)
    +408        {
    +409                return ((BitConversion.floatToRawIntBits(encoded) & 0xfe000000) >>> 24) * 0x1.020408p-8f;
    +410        }
    +411
    +412        /**
    +413         * Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale
    +414         * values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is
    +415         * that colors that are perceptually more-colorful have higher chroma than colors that are perceptually
    +416         * less-colorful, regardless of hue, whereas saturation changes its meaning depending on the hue and lightness. That
    +417         * is, the most saturated color for a given hue and lightness always has a saturation of 1, but if that color
    +418         * isn't perceptually very colorful (as is the case for very dark and very light colors), it will have a chroma that
    +419         * is much lower than the maximum. The result of this method can't be negative, grayscale values have very close to
    +420         * 0 chroma, and the most colorful values (close to cyan) should have 0.334f chroma.
    +421         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +422         * @return a float between 0.0f and 0.334f that represents how colorful the given value is
    +423         */
    +424        public static float chroma(final float encoded) {
    +425                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +426                final float a = ((decoded >>> 7 & 0x1FE) - 0xFF)  * 0x1p-8f;
    +427                final float b = ((decoded >>> 15 & 0x1FE) - 0xFF) * 0x1p-8f;
    +428                return (float) Math.sqrt(a * a + b * b);
    +429        }
    +430
    +431        /**
    +432         * Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness
    +433         * combination. This is useful to know the bounds of {@link #chroma(float)}. This should be no greater
    +434         * than 0.334f .
    +435         * @param hue the hue, typically between 0.0f and 1.0f, to look up
    +436         * @param lightness the lightness, clamped between 0.0f and 1.0f, to look up
    +437         * @return the maximum possible chroma for the given hue and lightness, between 0.0f and 0.334f
    +438         */
    +439        public static float chromaLimit(final float hue, final float lightness){
    +440                final int idx = (int) (Math.min(Math.max(lightness, 0f), 1f) * 255.999f) << 8
    +441                                | (int) (256f * (hue - floor(hue)));
    +442                return (GAMUT_DATA[idx]) * 0x1p-8f;
    +443        }
    +444
    +445        /**
    +446         * Gets a color as an Oklab packed float given floats representing hue, saturation, lightness, and opacity.
    +447         * All parameters should normally be between 0 and 1 inclusive, though any hue is tolerated (precision loss may
    +448         * affect the color if the hue is too large). A hue of 0 is red, progressively higher hue values go to orange,
    +449         * yellow, green, blue, and purple before wrapping around to red as it approaches 1. A saturation of 0 is grayscale,
    +450         * a saturation of 1 is brightly colored, and values close to 1 will usually appear more distinct than values close
    +451         * to 0, especially if the hue is different. A lightness of 0.001f or less is always black (also using a shortcut if
    +452         * this is the case, respecting opacity), while a lightness of 1f is white. Very bright colors are mostly in a band
    +453         * of high-saturation where lightness is 0.5f.
    +454         * <br>
    +455         * This method considers its hue, saturation, and lightness parameters as the HSL color space does. You may instead
    +456         * want the method {@link #oklabByHSL(float, float, float, float)}, which treats lightness exactly as Oklab does,
    +457         * and handles hue and saturation with the Oklab color solid (which is shaped oddly) instead of the HSL color solid
    +458         * (which is a bicone, with a wide cone pointing up attached at the base to another wide cone pointing down).
    +459         * Using oklabByHSL() should be faster in many cases, and the lightness handling alone may be a reason to use it.
    +460         * There is also {@link #oklabByHCL(float, float, float, float)}, which may be preferable if you want a specific
    +461         * amount of chroma (colorful-ness) and no greater.
    +462         *
    +463         * @param hue        0f to 1f, color wheel position
    +464         * @param saturation 0f to 1f, 0f is grayscale and 1f is brightly colored
    +465         * @param lightness  0f to 1f, 0f is black and 1f is white
    +466         * @param opacity    0f to 1f, 0f is fully transparent and 1f is opaque
    +467         * @return a float encoding a color with the given properties
    +468         */
    +469        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
    +470                if (lightness <= 0.001f) {
    +471                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    +472                } else {
    +473                        return fromRGBA(FloatColors.hsl2rgb(hue, saturation, lightness, opacity));
    +474                }
    +475        }
    +476
    +477        /**
    +478         * Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f,
    +479         * inclusive. This is different from {@link #chroma(float)}; see that method's documentation for details. It is also
    +480         * different from {@link #oklabSaturation(float)}, which gets the saturation as Oklab understands it rather than how
    +481         * HSL understands it.
    +482         *
    +483         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +484         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    +485         */
    +486        public static float saturation(final float encoded) {
    +487                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +488                final float L = reverseLight((decoded & 0xff) / 255f);
    +489                if(Math.abs(L - 0.5) > 0.495f) return 0f;
    +490                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +491                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +492                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +493                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +494                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +495                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    +496                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    +497                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    +498                float x, y, w;
    +499                if(g < b) {
    +500                        x = b;
    +501                        y = g;
    +502                }
    +503                else {
    +504                        x = g;
    +505                        y = b;
    +506                }
    +507                if(r < x) {
    +508                        w = r;
    +509                }
    +510                else {
    +511                        w = x;
    +512                        x = r;
    +513                }
    +514                return x - Math.min(w, y);
    +515        }
    +516
    +517        /**
    +518         * Defined as per HSL; normally you only need {@link #channelL(float)} to get accurate lightness for Oklab. You can
    +519         * also use {@link #oklabLightness(float)}, which is an alias for channelL(). This ranges from 0.0f (black) to 1.0f
    +520         * (white).
    +521         *
    +522         * @param encoded a packed float Oklab color
    +523         * @return the lightness of the given color as HSL would calculate it
    +524         */
    +525        public static float lightness(final float encoded) {
    +526                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +527                final float L = reverseLight((decoded & 0xff) / 255f);
    +528                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +529                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +530                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +531                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +532                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +533                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    +534                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    +535                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    +536                float x, y, w;
    +537                if(g < b) {
    +538                        x = b;
    +539                        y = g;
    +540                }
    +541                else {
    +542                        x = g;
    +543                        y = b;
    +544                }
    +545                if(r < x) {
    +546                        w = r;
    +547                }
    +548                else {
    +549                        w = x;
    +550                        x = r;
    +551                }
    +552                float d = x - Math.min(w, y);
    +553                return x * (1f - 0.5f * d / (x + 1e-10f));
    +554        }
    +555
    +556        /**
    +557         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    +558         * to 1f (exclusive, red and approaching purple if decreased). You can also use {@link #oklabHue(float)}, which
    +559         * positions the different hues at different values, somewhat, from this, but is more accurate to how Oklab handles
    +560         * hues.
    +561         *
    +562         * @param encoded a color as a packed float that can be obtained by {@link #oklab(float, float, float, float)}
    +563         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    +564         * eventually to purple before looping back to almost the same red (1.0, exclusive)
    +565         */
    +566        public static float hue(final float encoded) {
    +567                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +568                final float L = reverseLight((decoded & 0xff) / 255f);
    +569                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +570                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +571                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +572                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +573                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +574                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    +575                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    +576                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    +577                float x, y, z, w;
    +578                if(g < b) {
    +579                        x = b;
    +580                        y = g;
    +581                        z = -1f;
    +582                        w = 2f / 3f;
    +583                }
    +584                else {
    +585                        x = g;
    +586                        y = b;
    +587                        z = 0f;
    +588                        w = -1f / 3f;
    +589                }
    +590                if(r < x) {
    +591                        z = w;
    +592                        w = r;
    +593                }
    +594                else {
    +595                        w = x;
    +596                        x = r;
    +597                }
    +598                float d = x - Math.min(w, y);
    +599                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
    +600        }
    +601
    +602        /**
    +603         * The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to
    +604         * 1.0f . You can edit the L of a color with {@link #lighten(float, float)} and {@link #darken(float, float)}.
    +605         *
    +606         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
    +607         * @return the L value as a float from 0.0f to 1.0f
    +608         */
    +609        public static float channelL(final float encoded)
    +610        {
    +611                return (BitConversion.floatToRawIntBits(encoded) & 0xff) / 255f;
    +612        }
    +613
    +614        /**
    +615         * The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the
    +616         * hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or
    +617         * blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with
    +618         * {@link #raiseA(float, float)} and {@link #lowerA(float, float)}.
    +619         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
    +620         * @return the A value as a float from 0.0f to 1.0f
    +621         */
    +622        public static float channelA(final float encoded)
    +623        {
    +624                return ((BitConversion.floatToRawIntBits(encoded) >>> 8 & 0xff)) / 255f;
    +625        }
    +626
    +627        /**
    +628         * The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the
    +629         * hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more
    +630         * blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit
    +631         * the B of a color with {@link #raiseB(float, float)} and {@link #lowerB(float, float)}.
    +632         * @param encoded a color encoded as a packed float, as by {@link #oklab(float, float, float, float)}
    +633         * @return the B value as a float from 0.0f to 1.0f
    +634         */
    +635        public static float channelB(final float encoded)
    +636        {
    +637                return ((BitConversion.floatToRawIntBits(encoded) >>> 16 & 0xff)) / 255f;
    +638        }
    +639
    +640        /**
    +641         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    +642         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not Oklab! Takes
    +643         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    +644         * between -1f and 1f. Returns a packed float color. The float is likely to be different from the
    +645         * result of {@link #oklab(float, float, float, float)} unless hue, saturation, lightness, and opacity are all 0.
    +646         * This won't allocate any objects.
    +647         * <br>
    +648         * The parameters this takes all specify additive changes for a color component, clamping the final values so that
    +649         * they can't go above 1 or below 0, except for hue, which can rotate around if lower or higher hues would be
    +650         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    +651         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    +652         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    +653         * <br>
    +654         * You may want {@link #editOklab(float, float, float, float, float, float, float, float, float)} instead, which
    +655         * adjusts the L, A, B, and alpha channels directly instead of converting to HSL and back.
    +656         *
    +657         * @param basis      a packed float color that will be used as the starting point to make the next color
    +658         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    +659         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    +660         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    +661         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    +662         * @return a float encoding a variation of basis with the given changes
    +663         */
    +664        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    +665                final int decoded = BitConversion.floatToRawIntBits(basis);
    +666                final float L = Math.min(Math.max(light + reverseLight((decoded & 0xff) / 255f), 0f), 1f);
    +667                opacity = Math.min(Math.max(opacity + (decoded >>> 25) * (1f / 127f), 0f), 1f);
    +668                if (L <= 0.001f)
    +669                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x808000);
    +670                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +671                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +672                final float l = cube(L + 0.3963377774f * A + 0.2158037573f * B);
    +673                final float m = cube(L - 0.1055613458f * A - 0.0638541728f * B);
    +674                final float s = cube(L - 0.0894841775f * A - 1.2914855480f * B);
    +675                final float r = reverseGamma(Math.min(Math.max(+4.0767245293f * l - 3.3072168827f * m + 0.2307590544f * s, 0f), 1f));
    +676                final float g = reverseGamma(Math.min(Math.max(-1.2681437731f * l + 2.6093323231f * m - 0.3411344290f * s, 0f), 1f));
    +677                final float b = reverseGamma(Math.min(Math.max(-0.0041119885f * l - 0.7034763098f * m + 1.7068625689f * s, 0f), 1f));
    +678                float x, y, z, w;
    +679                if(g < b) {
    +680                        x = b;
    +681                        y = g;
    +682                        z = -1f;
    +683                        w = 2f / 3f;
    +684                }
    +685                else {
    +686                        x = g;
    +687                        y = b;
    +688                        z = 0f;
    +689                        w = -1f / 3f;
    +690                }
    +691                if(r < x) {
    +692                        z = w;
    +693                        w = r;
    +694                }
    +695                else {
    +696                        w = x;
    +697                        x = r;
    +698                }
    +699                final float d = x - Math.min(w, y);
    +700                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
    +701                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
    +702                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    +703                return fromRGBA(FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), lum, opacity));
    +704        }
    +705
    +706        /**
    +707         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    +708         * start as-is) and 1f (return white), start should be a packed color, as from
    +709         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +710         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +711         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    +712         * @see #darken(float, float) the counterpart method that darkens a float color
    +713         * @param start the starting color as a packed float
    +714         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    +715         * @return a packed float that represents a color between start and white
    +716         */
    +717        public static float lighten(final float start, final float change) {
    +718                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    +719                return BitConversion.intBitsToFloat(((int) (i + (0xFF - i) * change) & 0xFF) | other);
    +720        }
    +721
    +722        /**
    +723         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    +724         * start as-is) and 1f (return black), start should be a packed color, as from
    +725         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +726         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +727         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    +728         * @see #lighten(float, float) the counterpart method that lightens a float color
    +729         * @param start the starting color as a packed float
    +730         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    +731         * @return a packed float that represents a color between start and black
    +732         */
    +733        public static float darken(final float start, final float change) {
    +734                final int s = BitConversion.floatToRawIntBits(start), i = s & 0xFF, other = s & 0xFEFFFF00;
    +735                return BitConversion.intBitsToFloat(((int) (i * (1f - change)) & 0xFF) | other);
    +736        }
    +737
    +738        /**
    +739         * Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change
    +740         * should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from
    +741         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +742         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to
    +743         * lerp towards a warmer color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    +744         * alpha and L of start as-is.
    +745         * @see #lowerA(float, float) the counterpart method that cools a float color
    +746         * @param start the starting color as a packed float
    +747         * @param change how much to warm start, as a float between 0 and 1; higher means a warmer result
    +748         * @return a packed float that represents a color between start and a warmer color
    +749         */
    +750        public static float raiseA(final float start, final float change) {
    +751                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +752                return BitConversion.intBitsToFloat(((int) (p + (0xFF - p) * change) << 8 & 0xFF00) | other);
    +753        }
    +754
    +755        /**
    +756         * Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change
    +757         * should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from
    +758         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +759         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +760         * towards a cooler color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and
    +761         * L of start as-is.
    +762         * @see #raiseA(float, float) the counterpart method that warms a float color
    +763         * @param start the starting color as a packed float
    +764         * @param change how much to cool start, as a float between 0 and 1; higher means a cooler result
    +765         * @return a packed float that represents a color between start and a cooler color
    +766         */
    +767        public static float lowerA(final float start, final float change) {
    +768                final int s = BitConversion.floatToRawIntBits(start), p = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +769                return BitConversion.intBitsToFloat(((int) (p * (1f - change)) & 0xFF) << 8 | other);
    +770        }
    +771
    +772        /**
    +773         * Interpolates from the packed float color start towards a "natural" color (between green and orange) by change.
    +774         * While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as
    +775         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +776         * Colors, and is a little more efficient and clear than using
    +777         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more natural color. Unlike
    +778         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and L of start as-is.
    +779         * @see #lowerB(float, float) the counterpart method that makes a float color less natural
    +780         * @param start the starting color as a packed float
    +781         * @param change how much to change start to a natural color, as a float between 0 and 1; higher means a more natural result
    +782         * @return a packed float that represents a color between start and a more natural color
    +783         */
    +784        public static float raiseB(final float start, final float change) {
    +785                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +786                return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    +787        }
    +788
    +789        /**
    +790         * Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change.
    +791         * While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as
    +792         * from {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +793         * Colors, and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp
    +794         * towards a more artificial color. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the
    +795         * alpha and L of start as-is.
    +796         * @see #raiseB(float, float) the counterpart method that makes a float color less artificial
    +797         * @param start the starting color as a packed float
    +798         * @param change how much to change start to a bolder color, as a float between 0 and 1; higher means a more artificial result
    +799         * @return a packed float that represents a color between start and a more artificial color
    +800         */
    +801        public static float lowerB(final float start, final float change) {
    +802                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +803                return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    +804        }
    +805
    +806        /**
    +807         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    +808         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    +809         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +810         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +811         * transparent. This won't change the L, A, or B of the color.
    +812         * @see #fade(float, float) the counterpart method that makes a float color more translucent
    +813         * @param start the starting color as a packed float
    +814         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    +815         * @return a packed float that represents a color between start and its opaque version
    +816         */
    +817        public static float blot(final float start, final float change) {
    +818                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    +819                return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    +820        }
    +821
    +822        /**
    +823         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    +824         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    +825         * {@link #oklab(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +826         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +827         * transparent. This won't change the L, A, or B of the color.
    +828         * @see #blot(float, float) the counterpart method that makes a float color more opaque
    +829         * @param start the starting color as a packed float
    +830         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    +831         * @return a packed float that represents a color between start and transparent
    +832         */
    +833        public static float fade(final float start, final float change) {
    +834                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    +835                return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    +836        }
    +837
    +838        /**
    +839         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
    +840         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    +841         * from {@link #oklab(float, float, float, float)}. This only changes A and B; it leaves L and alpha alone, unlike
    +842         * {@link #lessenChange(float, float)}, which usually changes L.
    +843         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    +844         * @param start the starting color as a packed float
    +845         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    +846         * @return a packed float that represents a color between start and a desaturated color
    +847         */
    +848        public static float dullen(final float start, final float change) {
    +849                final int s = BitConversion.floatToRawIntBits(start);
    +850                return oklab((s & 0xFF) / 255f,
    +851                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    +852                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f - change) + 0.5f,
    +853                                (s >>> 25) / 127f);
    +854        }
    +855
    +856        /**
    +857         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
    +858         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    +859         * from {@link #oklab(float, float, float, float)}. This changes only A and B. Higher values for {@code change} can
    +860         * force the color out of the gamut, which this corrects using {@link #limitToGamut(float, float, float, float)}.
    +861         * The alpha never changes.
    +862         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    +863         * @param start the starting color as a packed float
    +864         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    +865         * @return a packed float that represents a color between start and a saturated color
    +866         */
    +867        public static float enrich(final float start, final float change) {
    +868                final int s = BitConversion.floatToRawIntBits(start);
    +869                return limitToGamut((s & 0xFF) / 255f,
    +870                                ((s >>> 8 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    +871                                ((s >>> 16 & 0xFF) / 255f - 0.5f) * (1f + change) + 0.5f,
    +872                                (s >>> 25) / 127f);
    +873        }
    +874
    +875        /**
    +876         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast with,
    +877         * gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B
    +878         * are likely to be clamped if the result gets close to white or black). This won't ever produce black or other very
    +879         * dark colors, and also has a gap in the range it produces for L values between 0.5 and 0.55. That allows
    +880         * most of the colors this method produces to contrast well as a foreground when displayed on a background of
    +881         * {@code contrastingColor}, or vice versa. This will leave the L unchanged if the chromatic channels of the
    +882         * contrastingColor and those of the mainColor are already very different. This has nothing to do with the contrast
    +883         * channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar lightness values further
    +884         * apart by just a little, this makes a modification on {@code mainColor} to maximize its lightness difference from
    +885         * {@code contrastingColor} without losing its other qualities.
    +886         * @param mainColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
    +887         *                     this is the color that will be adjusted
    +888         * @param contrastingColor a packed float color, as produced by {@link #oklab(float, float, float, float)};
    +889         *                            the adjusted mainColor will contrast with this
    +890         * @return a different Oklab packed float color, based on mainColor but with potentially very different lightness
    +891         */
    +892        public static float inverseLightness(final float mainColor, final float contrastingColor)
    +893        {
    +894                final int bits = BitConversion.floatToRawIntBits(mainColor),
    +895                                contrastBits = BitConversion.floatToRawIntBits(contrastingColor),
    +896                                L = (bits & 0xff),
    +897                                A = (bits >>> 8 & 0xff),
    +898                                B = (bits >>> 16 & 0xff),
    +899                                cL = (contrastBits & 0xff),
    +900                                cA = (contrastBits >>> 8 & 0xff),
    +901                                cB = (contrastBits >>> 16 & 0xff);
    +902                if((A - cA) * (A - cA) + (B - cB) * (B - cB) >= 0x10000)
    +903                        return mainColor;
    +904                return BitConversion.intBitsToFloat((bits & 0xFEFFFF00) | (int) (cL < 128 ? L * 0.45f + 140 : 127 - L * 0.45f));
    +905        }
    +906
    +907        /**
    +908         * Given a packed float Oklab color {@code mainColor} and another Oklab color that it should be made to contrast
    +909         * with, gets a packed float Oklab color with L that should be quite different from {@code contrastingColor}'s L,
    +910         * but the same chromatic channels and opacity (A and B are likely to be clamped if the result gets close to white
    +911         * or black). This allows most of the colors this method produces to contrast well as a foreground when displayed on
    +912         * a background of {@code contrastingColor}, or vice versa.
    +913         * <br>
    +914         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    +915         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    +916         * averages the original L of mainColor with the modified one, this tends to not produce harsh color changes.
    +917         * @param mainColor a packed Oklab float color; this is the color that will be adjusted
    +918         * @param contrastingColor a packed Oklab float color; the adjusted mainColor will contrast with the L of this
    +919         * @return a different packed Oklab float color, based on mainColor but typically with different lightness
    +920         */
    +921        public static float differentiateLightness(final float mainColor, final float contrastingColor)
    +922        {
    +923                final int main = BitConversion.floatToRawIntBits(mainColor), contrast = BitConversion.floatToRawIntBits(contrastingColor);
    +924                return limitToGamut(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
    +925        }
    +926
    +927        /**
    +928         * Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that
    +929         * with the original L. This means light colors become darker, and dark colors become lighter, with almost all
    +930         * results in the middle-range of possible lightness.
    +931         * @param mainColor a packed Oklab float color
    +932         * @return a different packed Oklab float color, with its L channel changed and limited to the correct gamut
    +933         */
    +934        public static float offsetLightness(final float mainColor) {
    +935                final int oklab = BitConversion.floatToRawIntBits(mainColor);
    +936                return limitToGamut(BitConversion.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
    +937        }
    +938
    +939        /**
    +940         * Makes the additive Oklab color stored in {@code color} cause less of a change when used as a tint, as if it were
    +941         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    +942         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    +943         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    +944         * @param color a color that should have its tinting effect potentially weakened
    +945         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    +946         * @return an Oklab float color between gray and {@code color}
    +947         */
    +948        public static float lessenChange(final float color, float fraction) {
    +949                final int e = BitConversion.floatToRawIntBits(color),
    +950                                sL = 0x80, sA = 0x80, sB = 0x80,
    +951                                eL = (e & 0xFF), eA = (e >>> 8) & 0xFF, eB = (e >>> 16) & 0xFF, eAlpha = e >>> 24 & 0xFE;
    +952                return BitConversion.intBitsToFloat(((int) (sL + fraction * (eL - sL)) & 0xFF)
    +953                                | (((int) (sA + fraction * (eA - sA)) & 0xFF) << 8)
    +954                                | (((int) (sB + fraction * (eB - sB)) & 0xFF) << 16)
    +955                                | (eAlpha << 24));
    +956        }
    +957
    +958        /**
    +959         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    +960         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    +961         * be different each time this is called, and can be obtained from a random number generator to make the colors more
    +962         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    +963         * produce two similar colors in a row unless variance is very small. The variance affects the L, A, and B of the
    +964         * generated color, and each of those channels can go up or down by the given variance as long as the total distance
    +965         * isn't greater than the variance (this considers A and B extra-wide, going from -1 to 1, while L goes from 0 to 1,
    +966         * but only internally for measuring distance).
    +967         * @param color a packed float color, as produced by {@link #oklab(float, float, float, float)}
    +968         * @param seed a long seed that should be different on each call; should not be 0
    +969         * @param variance max amount of difference between the given color and the generated color; always less than 1
    +970         * @return a generated packed float color that should be at least somewhat different from {@code color}
    +971         */
    +972        public static float randomEdit(final float color, long seed, final float variance) {
    +973                final int decoded = BitConversion.floatToRawIntBits(color);
    +974                final float L = reverseLight((decoded & 0xff) / 255f);
    +975                final float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +976                final float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +977                final float limit = variance * variance;
    +978                float dist, x, y, z;
    +979                for (int j = 0; j < 50; j++) {
    +980                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +981                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +982                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +983                        seed += 0x9E3779B97F4A7C15L;
    +984                        dist = x * x + y * y + z * z;
    +985                        if(dist <= limit && inGamut(x += L, y = (A + y) * 0.5f + 0.5f, z = (B + z) * 0.5f + 0.5f))
    +986                                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.5f) << 16 & 0xFF0000)
    +987                                                | ((int)(y * 255.5f) << 8 & 0xFF00) | (int)(x * 255.5f));
    +988                }
    +989                return color;
    +990        }
    +991
    +992        /**
    +993         * Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and
    +994         * hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness
    +995         * and hue. The index can be constructed from a lightness value {@code L} from 0 to 255, and a hue value {@code H}
    +996         * from 0 to 255 with: {@code (L << 8 | H)} or the simpler equivalent {@code (L * 256 + H)}. These assume L and H
    +997         * have been limited to the 0 to 255 range already. This does not bounds-check index. Because hue is not typically
    +998         * measured between 0 and 255, getting that value is a bit different; you can use
    +999         * {@link TrigTools#atan2Turns(float, float)} (with an Oklab color's B for y, then its A for x) and multiply it by 256
    +1000         * to get H.
    +1001         * <br>
    +1002         * The distance this returns is a byte between 0 and 84 (both inclusive), as the Euclidean distance from the center
    +1003         * grayscale value at the lightness in the index, to the edge of the gamut at the same lightness, along the hue in
    +1004         * the index. This is measured in a space from -1 to 1 for both A and B, with the 0 in the center meaning grayscale,
    +1005         * and multiplied by 256 to get a meaningful byte value. To return to the A and B values Oklab uses here, you would
    +1006         * need to use some trigonometry on the hue (if it's in the 0 to 1 range, you can call
    +1007         * {@link TrigTools#cosTurns(float)} on the hue to almost get A, and {@link TrigTools#sinTurns(float)} to almost get B),
    +1008         * then multiply each of those by the distance, divide each by 256.0, and add 0.5.
    +1009         * <br>
    +1010         * Only intended for the narrow cases where external code needs read-only access to the internal Oklab gamut data.
    +1011         * The gamut data is quite large (it is in a 71 KB source file containing only the gamut, while the entire IPT_HQ
    +1012         * ColorTools file is 56 KB, and includes everything else except a gamut table), so it's better to have
    +1013         * direct read access to it without being able to accidentally rewrite it.
    +1014         * @param index must be between 0 and 65535; the upper 8 bits are lightness and the lower 8 are hue angle.
    +1015         * @return a byte (always between 0 and 84, inclusive) representing the Euclidean distance between a grayscale value and the most saturated value possible, using the above measurements
    +1016         */
    +1017        public static byte getRawGamutValue(int index){
    +1018                return GAMUT_DATA[index];
    +1019        }
    +1020
    +1021        /**
    +1022         * Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
    +1023         * @param packed a packed float color as Oklab
    +1024         * @return true if the given packed float color can be converted back and forth to RGBA
    +1025         */
    +1026        public static boolean inGamut(final float packed)
    +1027        {
    +1028                final int decoded = BitConversion.floatToRawIntBits(packed);
    +1029                final float A = ((decoded >>> 8 & 0xff) - 127f) / 255f;
    +1030                final float B = ((decoded >>> 16 & 0xff) - 127f) / 255f;
    +1031                final float g = GAMUT_DATA[(decoded & 0xff) << 8 | (int)(256f * TrigTools.atan2Turns(B, A))];
    +1032                return g * g * 0x1p-18 + 0x1p-14 >= (A * A + B * B);
    +1033        }
    +1034
    +1035        /**
    +1036         * Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
    +1037         * @param L lightness channel, as a float from 0 to 1
    +1038         * @param A green-to-red chromatic channel, as a float from 0 to 1
    +1039         * @param B blue-to-yellow chromatic channel, as a float from 0 to 1
    +1040         * @return true if the given Oklab channels can be converted back and forth to RGBA
    +1041         */
    +1042        public static boolean inGamut(float L, float A, float B)
    +1043        {
    +1044                A = ((int) (A * 255) - 127f) / 255f;
    +1045                B = ((int) (B * 255) - 127f) / 255f;
    +1046                final float g = GAMUT_DATA[((int) (L * 255) & 0xFF) << 8 | (int)(256f * TrigTools.atan2Turns(B, A))];
    +1047                return g * g * 0x1p-18 + 0x1p-14 >= (A * A + B * B);
    +1048
    +1049                ////This was the old code for this inGamut(), which was subtly different from the other inGamut() when called
    +1050                /// on a packed float. The packed floats can go ever-so-slightly towards or away from the edge.
    +1051//              A = (A - 0.5f);
    +1052//              B = (B - 0.5f);
    +1053//              final byte g = GAMUT_DATA[((int)(L * 255.999f) << 8) | (int)(256f * TrigTools.atan2Turns(B, A))];
    +1054//              return g * g * 0x1p-16 >= (A * A + B * B);
     1055
    -1056        /**
    -1057         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
    -1058         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    -1059         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    -1060         * @param packed a packed float color in Oklab format; does not need to be in-gamut
    -1061         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    -1062         * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
    -1063         */
    -1064        public static float maximizeSaturation(final float packed) {
    -1065                final int decoded = BitConversion.floatToRawIntBits(packed);
    -1066                final float A = ((decoded >>> 8 & 0xff) - 127.5f);
    -1067                final float B = ((decoded >>> 16 & 0xff) - 127.5f);
    -1068                final float hue = MathTools.atan2_(B, A);
    -1069                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
    -1070                final float dist = GAMUT_DATA[idx] * 0.5f;
    -1071                return BitConversion.intBitsToFloat(
    -1072                                (decoded & 0xFE0000FF) |
    -1073                                                (int) (MathTools.cos_(hue) * dist + 128f) << 8 |
    -1074                                                (int) (MathTools.sin_(hue) * dist + 128f) << 16);
    -1075        }
    -1076        /**
    -1077         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
    -1078         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    -1079         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    -1080         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    -1081         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    -1082         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    -1083         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
    -1084         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    -1085         * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation
    -1086         * for out-of-gamut colors.
    -1087         */
    -1088        public static float maximizeSaturation(float L, float A, float B, float alpha) {
    -1089                L = Math.min(Math.max(L, 0f), 1f);
    -1090                A = Math.min(Math.max(A, 0f), 1f) - 0.5f;
    -1091                B = Math.min(Math.max(B, 0f), 1f) - 0.5f;
    -1092                alpha = Math.min(Math.max(alpha, 0f), 1f);
    -1093                final float hue = MathTools.atan2_(B, A);
    -1094                final int idx = (int) (L * 255.999f) << 8 | (int) (256f * hue);
    -1095                final float dist = GAMUT_DATA[idx] * 0.5f;
    -1096                return BitConversion.intBitsToFloat(
    -1097                                (int) (alpha * 127.999f) << 25 |
    -1098                                                (int) (MathTools.sin_(hue) * dist + 128f) << 16 |
    -1099                                                (int) (MathTools.cos_(hue) * dist + 128f) << 8 |
    -1100                                                (int) (L * 255.999f));
    -1101        }
    -1102
    -1103        /**
    -1104         * Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does.
    -1105         * This is different from {@link #hue(float)}, which uses HSL. This gives a float between 0 (inclusive)
    -1106         * and 1 (exclusive).
    -1107         *
    -1108         * @param packed a packed Oklab float color
    -1109         * @return a float between 0 (inclusive) and 1 (exclusive) that represents hue in the Oklab color space
    -1110         */
    -1111        public static float oklabHue(final float packed) {
    -1112                final int decoded = BitConversion.floatToRawIntBits(packed);
    -1113                final float A = ((decoded >>> 8 & 0xff) - 127.5f);
    -1114                final float B = ((decoded >>> 16 & 0xff) - 127.5f);
    -1115                return MathTools.atan2_(B, A);
    -1116        }
    -1117
    -1118        /**
    -1119         * Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does.
    -1120         * Saturation here is a fraction of the chroma limit (see {@link #chromaLimit(float, float)}) for a given hue and
    -1121         * lightness, and is between 0 and 1 almost all the time. Saturation should always be a float between 0 (inclusive)
    -1122         * and 1 (inclusive).
    -1123         *
    -1124         * @param packed a packed Oklab float color
    -1125         * @return a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the Oklab color space
    -1126         */
    -1127        public static float oklabSaturation(final float packed) {
    -1128                final int decoded = BitConversion.floatToRawIntBits(packed);
    -1129                final float A = ((decoded >>> 8 & 0xff) - 127.5f);
    -1130                final float B = ((decoded >>> 16 & 0xff) - 127.5f);
    -1131                final float hue = MathTools.atan2_(B, A);
    -1132                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
    -1133                final float dist = GAMUT_DATA[idx] + 1.5f;
    -1134                return dist == 3.5f ? 0f : (A * A + B * B) * 4f / (dist * dist);
    -1135        }
    -1136        /**
    -1137         * Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does.
    -1138         * This is different from {@link #lightness(float)}, which uses HSL. This gives a float between 0 (inclusive)
    -1139         * and 1 (inclusive).
    -1140         * <br>
    -1141         * This is the same as {@link #channelL(float)}.
    -1142         *
    -1143         * @param packed a packed Oklab float color
    -1144         * @return a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the Oklab color space
    -1145         */
    -1146        public static float oklabLightness(final float packed){
    -1147                return (BitConversion.floatToRawIntBits(packed) & 0xff) / 255f;
    -1148        }
    -1149
    -1150        /**
    -1151         * A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color
    -1152         * but calculating them directly in the Oklab color space. This is more efficient than
    -1153         * {@link #floatGetHSL(float, float, float, float)}, but for colors with less than 0.5f lightness, it can be very
    -1154         * unpredictable in how it handles saturation. Most colors between 0.5 and 0.75 hue that also have less than 0.5
    -1155         * lightness are extremely desaturated and close to gray, regardless of what you give for saturation, and these
    -1156         * colors suddenly jump to very saturated around 0.75 hue and higher. To avoid this issue, you may prefer using
    -1157         * {@link #oklabByHCL(float, float, float, float)}, which takes an absolute chroma as opposed to the saturation here
    -1158         * (which is a fraction of the maximum chroma).
    -1159         * <br>
    -1160         * Note that this takes a different value for its {@code hue} that the method {@link #hue(float)} produces, just
    -1161         * like its {@code saturation} and the method {@link #saturation(float)}, and {@code lightness} and the method
    -1162         * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
    -1163         * {@link #channelL(float)}, but the saturation here refers to what fraction the chroma should be of the maximum
    -1164         * chroma for the given hue and lightness. You can use {@link #oklabHue(float)}, {@link #oklabSaturation(float)},
    -1165         * and {@link #oklabLightness(float)} to get the hue, saturation, and lightness values from an existing color that
    -1166         * this will understand ({@link #alpha(float)} too).
    -1167         * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    -1168         * @param saturation will be clamped between 0 and 1
    -1169         * @param lightness will be clamped between 0 and 1
    -1170         * @param alpha will be clamped between 0 and 1
    -1171         * @return a packed Oklab float color that tries to match the requested hue, saturation, and lightness
    -1172         */
    -1173        public static float oklabByHSL(float hue, float saturation, float lightness, float alpha) {
    -1174                lightness = Math.min(Math.max(lightness, 0f), 1f);
    -1175                saturation = Math.min(Math.max(saturation, 0f), 1f);
    -1176                hue -= floor(hue);
    -1177                alpha = Math.min(Math.max(alpha, 0f), 1f);
    -1178                final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue);
    -1179                final float dist = GAMUT_DATA[idx] * saturation * 0.5f;
    -1180                return BitConversion.intBitsToFloat(
    -1181                                (int) (alpha * 127.999f) << 25 |
    -1182                                                (int) (MathTools.sin_(hue) * dist + 128f) << 16 |
    -1183                                                (int) (MathTools.cos_(hue) * dist + 128f) << 8 |
    -1184                                                (int) (lightness * 255.999f));
    -1185        }
    -1186
    -1187        /**
    -1188         * A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A)
    -1189         * color but calculating them directly in the Oklab color space. This has you specify the desired chroma directly,
    -1190         * as obtainable with {@link #chroma(float)}, rather than the saturation, which is a fraction of the maximum chroma
    -1191         * (saturation is what {@link #oklabByHSL(float, float, float, float)} uses). Note that this takes a different value
    -1192         * for its {@code hue} that the method {@link #hue(float)} produces, just like {@code lightness} and the method
    -1193         * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
    -1194         * {@link #channelL(float)}. If you use this to get two colors with the same chroma and lightness, but different
    -1195         * hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the
    -1196         * gamut limit (you can get this limit with {@link #chromaLimit(float, float)}). If a chroma value given is greater
    -1197         * than the chroma limit, this clamps chroma to that limit. You can use {@link #oklabHue(float)},
    -1198         * {@link #chroma(float)}, and {@link #oklabLightness(float)} to get the hue, chroma, and lightness values from an
    -1199         * existing color that this will understand ({@link #alpha(float)} too).
    -1200         * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    -1201         * @param chroma will be clamped between 0 and the maximum chroma possible for the given hue and lightness
    -1202         * @param lightness will be clamped between 0 and 1
    -1203         * @param alpha will be clamped between 0 and 1
    -1204         * @return a packed Oklab float color that tries to match the requested hue, chroma, and lightness
    -1205         */
    -1206        public static float oklabByHCL(float hue, float chroma, float lightness, float alpha) {
    -1207                lightness = Math.min(Math.max(lightness, 0f), 1f);
    -1208                chroma = Math.max(chroma, 0f);
    -1209                hue -= floor(hue);
    -1210                alpha = Math.min(Math.max(alpha, 0f), 1f);
    -1211                final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue);
    -1212                final float dist = Math.min(chroma * 127.5f, GAMUT_DATA[idx] * 0.5f);
    -1213                return BitConversion.intBitsToFloat(
    -1214                                (int) (alpha * 127.999f) << 25 |
    -1215                                                (int) (MathTools.sin_(hue) * dist + 128f) << 16 |
    -1216                                                (int) (MathTools.cos_(hue) * dist + 128f) << 8 |
    -1217                                                (int) (lightness * 255.999f));
    -1218        }
    -1219
    -1220        /**
    -1221         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
    -1222         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
    -1223         * @param packed a packed float color in Oklab format; often this color is not in-gamut
    -1224         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
    -1225         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
    -1226         */
    -1227        public static float limitToGamut(final float packed) {
    -1228                final int decoded = BitConversion.floatToRawIntBits(packed);
    -1229                final float A = ((decoded >>> 8 & 0xff) - 127.5f);
    -1230                final float B = ((decoded >>> 16 & 0xff) - 127.5f);
    -1231                final float hue = MathTools.atan2_(B, A);
    -1232                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
    -1233                final float dist = GAMUT_DATA[idx] * 0.5f;
    -1234                if (dist * dist * 0.25f >= (A * A + B * B))
    -1235                        return packed;
    -1236                return BitConversion.intBitsToFloat(
    -1237                                (decoded & 0xFE0000FF) |
    -1238                                                (int) (MathTools.cos_(hue) * dist + 128f) << 8 |
    -1239                                                (int) (MathTools.sin_(hue) * dist + 128f) << 16);
    -1240        }
    -1241
    -1242        /**
    -1243         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
    -1244         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. This always produces
    -1245         * an opaque color.
    -1246         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    -1247         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    -1248         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    -1249         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
    -1250         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    -1251         */
    -1252        public static float limitToGamut(float L, float A, float B) {
    -1253                return limitToGamut(L, A, B, 1f);
    -1254        }
    -1255        /**
    -1256         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
    -1257         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
    -1258         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    -1259         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    -1260         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    -1261         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
    -1262         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
    -1263         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    -1264         */
    -1265        public static float limitToGamut(float L, float A, float B, float alpha) {
    -1266                L = Math.min(Math.max(L, 0f), 1f);
    -1267                A = Math.min(Math.max(A, 0f), 1f);
    -1268                B = Math.min(Math.max(B, 0f), 1f);
    -1269                alpha = Math.min(Math.max(alpha, 0f), 1f);
    -1270                final float A2 = (A - 0.5f);
    -1271                final float B2 = (B - 0.5f);
    -1272                final float hue = MathTools.atan2_(B2, A2);
    -1273                final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue);
    -1274                final float dist = GAMUT_DATA[idx] * 0.5f;
    -1275                if(dist * dist * 0x1p-16f + 0x1p-14f >= (A2 * A2 + B2 * B2))
    -1276                        return oklab(L, A, B, alpha);
    -1277                return BitConversion.intBitsToFloat(
    -1278                                (int) (alpha * 127.999f) << 25 |
    -1279                                                (int) (MathTools.sin_(hue) * dist + 128f) << 16 |
    -1280                                                (int) (MathTools.cos_(hue) * dist + 128f) << 8 |
    -1281                                                (int) (L * 255.999f));
    -1282        }
    -1283
    -1284        /**
    -1285         * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add"
    -1286         * parameter and then clamping. This returns a different float value (of course, the given float can't be edited
    -1287         * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the
    -1288         * resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    -1289         * @param encoded a packed float Oklab color
    -1290         * @param addL how much to add to the L channel; typically in the -1 to 1 range
    -1291         * @param addA how much to add to the A channel; typically in the -1 to 1 range
    -1292         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    -1293         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -1294         * @return a packed float Oklab color with the requested edits applied to {@code encoded}
    -1295         */
    -1296        public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha) {
    -1297                return editOklab(encoded, addL, addA, addB, addAlpha, 1f, 1f, 1f, 1f);
    -1298        }
    -1299        /**
    -1300         * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by
    -1301         * the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This means
    -1302         * the lightness value {@code L} is multiplied by {@code mulL}, then has {@code addL} added, and then is clamped to
    -1303         * the normal range for L (0 to 1). This returns a different float value (of course, the given float can't be edited
    -1304         * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a value of 1 for any
    -1305         * "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5 range, so if you
    -1306         * multiply by a small number like {@code 0.25f}, then this will produce a less-saturated color, and if you multiply
    -1307         * by a larger number like {@code 4f}, then you will get a much more-saturated color. This clamps the resulting
    -1308         * color to remain in-gamut, so it should be safe to convert it back to RGBA.
    -1309         * @param encoded a packed float Oklab color
    -1310         * @param addL how much to add to the L channel; typically in the -1 to 1 range
    -1311         * @param addA how much to add to the A channel; typically in the -1 to 1 range
    -1312         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    -1313         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -1314         * @param mulL how much to multiply the L channel by; should be non-negative
    -1315         * @param mulA how much to multiply the A channel by; usually non-negative (not always)
    -1316         * @param mulB how much to multiply the B channel by; usually non-negative (not always)
    -1317         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    -1318         * @return a packed float Oklab color with the requested edits applied to {@code encoded}
    -1319         */
    -1320        public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha,
    -1321                                                                  float mulL, float mulA, float mulB, float mulAlpha) {
    -1322                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -1323                float L = (decoded & 0xff) / 255f;
    -1324                float A = ((decoded >>> 8 & 0xff) - 127.5f) / 127.5f;
    -1325                float B = ((decoded >>> 16 & 0xff) - 127.5f) / 127.5f;
    -1326                float alpha = (decoded >>> 25) / 127f;
    -1327
    -1328                L = Math.min(Math.max(L * mulL + addL, 0f), 1f);
    -1329                A = Math.min(Math.max(A * mulA + addA * 2f, -1f), 1f) * 0.5f;
    -1330                B = Math.min(Math.max(B * mulB + addB * 2f, -1f), 1f) * 0.5f;
    -1331                alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    -1332                final float hue = MathTools.atan2_(B, A);
    -1333                final int idx = (int) (L * 255.999f) << 8 | (int)(256f * hue);
    -1334                final float dist = GAMUT_DATA[idx] * 0.5f;
    -1335                if(dist * dist * 0x1p-16f >= (A * A + B * B))
    -1336                        return oklab(L, A + 0.5f, B + 0.5f, alpha);
    -1337                return BitConversion.intBitsToFloat(
    -1338                                (int) (alpha * 127.999f) << 25 |
    -1339                                                (int) (MathTools.sin_(hue) * dist + 128f) << 16 |
    -1340                                                (int) (MathTools.cos_(hue) * dist + 128f) << 8 |
    -1341                                                (int) (L * 255.999f));
    -1342        }
    -1343
    -1344        /**
    -1345         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    -1346         * @param random a Random object (preferably a subclass of Random, like
    -1347         * {@link com.github.tommyettinger.random.LaserRandom})
    -1348         * @return a packed float color that is always in-gamut
    -1349         */
    -1350        public static float randomColor(Random random) {
    -1351                float L = random.nextFloat();
    -1352                float A = random.nextFloat();
    -1353                float B = random.nextFloat();
    -1354                while (!inGamut(L, A, B)) {
    -1355                        L = random.nextFloat();
    -1356                        A = random.nextFloat();
    -1357                        B = random.nextFloat();
    -1358                }
    -1359                return oklab(L, A, B, 1f);
    -1360        }
    -1361
    -1362        /**
    -1363         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    -1364         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    -1365         * and EnhancedRandom.
    -1366         * @param random any subclass of juniper's EnhancedRandom, such as a
    -1367         * {@link com.github.tommyettinger.random.DistinctRandom} or
    -1368         * {@link com.github.tommyettinger.random.FourWheelRandom}
    -1369         * @return a packed float color that is always in-gamut
    -1370         */
    -1371        public static float randomizedColor(EnhancedRandom random) {
    -1372                float L = random.nextExclusiveFloat();
    -1373                float A = random.nextExclusiveFloat();
    -1374                float B = random.nextExclusiveFloat();
    -1375                while (!inGamut(L, A, B)) {
    -1376                        L = random.nextExclusiveFloat();
    -1377                        A = random.nextExclusiveFloat();
    -1378                        B = random.nextExclusiveFloat();
    -1379                }
    -1380                return oklab(L, A, B, 1f);
    -1381        }
    -1382}
    +1056        }
    +1057
    +1058        /**
    +1059         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
    +1060         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    +1061         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    +1062         * @param packed a packed float color in Oklab format; does not need to be in-gamut
    +1063         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    +1064         * @see #limitToGamut(float) You can use limitToGamut() if you only want max saturation for out-of-gamut colors.
    +1065         */
    +1066        public static float maximizeSaturation(final float packed) {
    +1067                final int decoded = BitConversion.floatToRawIntBits(packed);
    +1068                final float A = ((decoded >>> 8 & 0xff) - 127f);
    +1069                final float B = ((decoded >>> 16 & 255) - 127f);
    +1070                final float hue = TrigTools.atan2Turns(B, A);
    +1071                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
    +1072                final float dist = GAMUT_DATA[idx] * 0.5f;
    +1073                return BitConversion.intBitsToFloat(
    +1074                                (decoded & 0xFE0000FF) |
    +1075                                                (int) (TrigTools.sinTurns(hue) * dist + 127.5f) << 16 |
    +1076                                                (int) (TrigTools.cosTurns(hue) * dist + 127.5f) << 8
    +1077                );
    +1078        }
    +1079        /**
    +1080         * Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A
    +1081         * B from gray possible for that lightness while keeping the same hue as the given color. This is very
    +1082         * similar to calling {@link #enrich(float, float)} with a very large {@code change} value.
    +1083         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    +1084         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    +1085         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    +1086         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
    +1087         * @return the color that is as far from grayscale as this can get while keeping the L and hue of packed
    +1088         * @see #limitToGamut(float, float, float, float) You can use limitToGamut() if you only want max saturation
    +1089         * for out-of-gamut colors.
    +1090         */
    +1091        public static float maximizeSaturation(float L, float A, float B, float alpha) {
    +1092                L = Math.min(Math.max(L, 0f), 1f);
    +1093                A = Math.min(Math.max(A, 0f), 1f) - 0.5f;
    +1094                B = Math.min(Math.max(B, 0f), 1f) - 0.5f;
    +1095                alpha = Math.min(Math.max(alpha, 0f), 1f);
    +1096                final float hue = TrigTools.atan2Turns(B, A);
    +1097                final int idx = (int) (L * 255f) << 8 | (int) (256f * hue);
    +1098                final float dist = GAMUT_DATA[idx] * 0.5f;
    +1099                return BitConversion.intBitsToFloat(
    +1100                                (int) (alpha * 127.999f) << 25 |
    +1101                                                (int) (TrigTools.sinTurns(hue) * dist + 127.5f) << 16 |
    +1102                                                (int) (TrigTools.cosTurns(hue) * dist + 127.5f) << 8 |
    +1103                                                (int) (L * 255f));
    +1104        }
    +1105
    +1106        /**
    +1107         * Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does.
    +1108         * This is different from {@link #hue(float)}, which uses HSL. This gives a float between 0 (inclusive)
    +1109         * and 1 (exclusive).
    +1110         *
    +1111         * @param packed a packed Oklab float color
    +1112         * @return a float between 0 (inclusive) and 1 (exclusive) that represents hue in the Oklab color space
    +1113         */
    +1114        public static float oklabHue(final float packed) {
    +1115                final int decoded = BitConversion.floatToRawIntBits(packed);
    +1116                final float A = ((decoded >>> 8 & 0xff) - 127f);
    +1117                final float B = ((decoded >>> 16 & 255) - 127f);
    +1118                return TrigTools.atan2Turns(B, A);
    +1119        }
    +1120
    +1121        /**
    +1122         * Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does.
    +1123         * Saturation here is a fraction of the chroma limit (see {@link #chromaLimit(float, float)}) for a given hue and
    +1124         * lightness, and is between 0 and 1 almost all the time. Saturation should always be between 0 (inclusive) and 1
    +1125         * (inclusive).
    +1126         *
    +1127         * @param packed a packed Oklab float color
    +1128         * @return a float between 0 (inclusive) and 1 (inclusive) that represents saturation in the Oklab color space
    +1129         */
    +1130        public static float oklabSaturation(final float packed) {
    +1131                final int decoded = BitConversion.floatToRawIntBits(packed);
    +1132                final float A = ((decoded >>> 8 & 0xff) - 127f);
    +1133                final float B = ((decoded >>> 16 & 255) - 127f);
    +1134                final float hue = TrigTools.atan2Turns(B, A);
    +1135                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
    +1136                final float dist = GAMUT_DATA[idx];
    +1137                return dist <= 2.5f ? 0f : (float) Math.sqrt(A * A + B * B) * 2f / (dist);
    +1138        }
    +1139
    +1140        /**
    +1141         * Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does.
    +1142         * This is different from {@link #lightness(float)}, which uses HSL. This gives a float between 0 (inclusive)
    +1143         * and 1 (inclusive).
    +1144         * <br>
    +1145         * This is the same as {@link #channelL(float)}.
    +1146         *
    +1147         * @param packed a packed Oklab float color
    +1148         * @return a float between 0 (inclusive) and 1 (inclusive) that represents lightness in the Oklab color space
    +1149         */
    +1150        public static float oklabLightness(final float packed){
    +1151                return (BitConversion.floatToRawIntBits(packed) & 0xff) / 255f;
    +1152        }
    +1153
    +1154        /**
    +1155         * A different way to specify an Oklab color, using hue, saturation, lightness, and alpha like a normal HSL(A) color
    +1156         * but calculating them directly in the Oklab color space. This is more efficient than
    +1157         * {@link #floatGetHSL(float, float, float, float)}, but for colors with less than 0.5f lightness, it can be very
    +1158         * unpredictable in how it handles saturation. Most colors between 0.5 and 0.75 hue that also have less than 0.5
    +1159         * lightness are extremely desaturated and close to gray, regardless of what you give for saturation, and these
    +1160         * colors suddenly jump to very saturated around 0.75 hue and higher. To avoid this issue, you may prefer using
    +1161         * {@link #oklabByHCL(float, float, float, float)}, which takes an absolute chroma as opposed to the saturation here
    +1162         * (which is a fraction of the maximum chroma).
    +1163         * <br>
    +1164         * Note that this takes a different value for its {@code hue} that the method {@link #hue(float)} produces, just
    +1165         * like its {@code saturation} and the method {@link #saturation(float)}, and {@code lightness} and the method
    +1166         * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
    +1167         * {@link #channelL(float)}, but the saturation here refers to what fraction the chroma should be of the maximum
    +1168         * chroma for the given hue and lightness. You can use {@link #oklabHue(float)}, {@link #oklabSaturation(float)},
    +1169         * and {@link #oklabLightness(float)} to get the hue, saturation, and lightness values from an existing color that
    +1170         * this will understand ({@link #alpha(float)} too).
    +1171         * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    +1172         * @param saturation will be clamped between 0 and 1
    +1173         * @param lightness will be clamped between 0 and 1
    +1174         * @param alpha will be clamped between 0 and 1
    +1175         * @return a packed Oklab float color that tries to match the requested hue, saturation, and lightness
    +1176         */
    +1177        public static float oklabByHSL(float hue, float saturation, float lightness, float alpha) {
    +1178                lightness = Math.min(Math.max(lightness, 0f), 1f);
    +1179                saturation = Math.min(Math.max(saturation, 0f), 1f);
    +1180                hue -= floor(hue);
    +1181                alpha = Math.min(Math.max(alpha, 0f), 1f);
    +1182                final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue);
    +1183                final float dist = GAMUT_DATA[idx] * saturation * 0.5f;
    +1184                return limitToGamut(BitConversion.intBitsToFloat(
    +1185                                (int) (alpha * 127.999f) << 25 |
    +1186                                                (int) (TrigTools.sinTurns(hue) * dist + 127.5f) << 16 |
    +1187                                                (int) (TrigTools.cosTurns(hue) * dist + 127.5f) << 8 |
    +1188                                                (int) (lightness * 255.999f)));
    +1189        }
    +1190
    +1191        /**
    +1192         * A different way to specify an Oklab color, using hue, chroma, lightness, and alpha something like a normal HSL(A)
    +1193         * color but calculating them directly in the Oklab color space. This has you specify the desired chroma directly,
    +1194         * as obtainable with {@link #chroma(float)}, rather than the saturation, which is a fraction of the maximum chroma
    +1195         * (saturation is what {@link #oklabByHSL(float, float, float, float)} uses). Note that this takes a different value
    +1196         * for its {@code hue} that the method {@link #hue(float)} produces, just like {@code lightness} and the method
    +1197         * {@link #lightness(float)}. The hue is just distributed differently, and the lightness should be equivalent to
    +1198         * {@link #channelL(float)}. If you use this to get two colors with the same chroma and lightness, but different
    +1199         * hue, then the resulting colors should have similar colorfulness unless one or both chroma values exceeded the
    +1200         * gamut limit (you can get this limit with {@link #chromaLimit(float, float)}). If a chroma value given is greater
    +1201         * than the chroma limit, this clamps chroma to that limit. You can use {@link #oklabHue(float)},
    +1202         * {@link #chroma(float)}, and {@link #oklabLightness(float)} to get the hue, chroma, and lightness values from an
    +1203         * existing color that this will understand ({@link #alpha(float)} too).
    +1204         * @param hue between 0 and 1, usually, but this will automatically wrap if too high or too low
    +1205         * @param chroma will be clamped between 0 and the maximum chroma possible for the given hue and lightness
    +1206         * @param lightness will be clamped between 0 and 1
    +1207         * @param alpha will be clamped between 0 and 1
    +1208         * @return a packed Oklab float color that tries to match the requested hue, chroma, and lightness
    +1209         */
    +1210        public static float oklabByHCL(float hue, float chroma, float lightness, float alpha) {
    +1211                lightness = Math.min(Math.max(lightness, 0f), 1f);
    +1212                chroma = Math.max(chroma, 0f);
    +1213                hue -= floor(hue);
    +1214                alpha = Math.min(Math.max(alpha, 0f), 1f);
    +1215                final int idx = (int) (lightness * 255.999f) << 8 | (int) (256f * hue);
    +1216                final float dist = Math.min(chroma * 127.5f, GAMUT_DATA[idx] * 0.5f);
    +1217                return limitToGamut(BitConversion.intBitsToFloat(
    +1218                                (int) (alpha * 127.999f) << 25 |
    +1219                                                (int) (TrigTools.sinTurns(hue) * dist + 127.5f) << 16 |
    +1220                                                (int) (TrigTools.cosTurns(hue) * dist + 127.5f) << 8 |
    +1221                                                (int) (lightness * 255.999f)));
    +1222        }
    +1223
    +1224        /**
    +1225         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
    +1226         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
    +1227         * @param packed a packed float color in Oklab format; often this color is not in-gamut
    +1228         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
    +1229         * @see #inGamut(float) You can use inGamut() if you just want to check whether a color is in-gamut.
    +1230         */
    +1231        public static float limitToGamut(final float packed) {
    +1232                final int decoded = BitConversion.floatToRawIntBits(packed);
    +1233                final float A = ((decoded >>> 8 & 0xff) - 127f);
    +1234                final float B = ((decoded >>> 16 & 255) - 127f);
    +1235                final float hue = TrigTools.atan2Turns(B, A);
    +1236                final int idx = (decoded & 0xff) << 8 | (int) (256f * hue);
    +1237                final float dist = GAMUT_DATA[idx] * 0.5f;
    +1238                if (dist * dist >= (A * A + B * B))
    +1239                        return packed;
    +1240                return BitConversion.intBitsToFloat(
    +1241                                (decoded & 0xFE0000FF) |
    +1242                                                (int) (TrigTools.sinTurns(hue) * dist + 127.5f) << 16 |
    +1243                                                (int) (TrigTools.cosTurns(hue) * dist + 127.5f) << 8
    +1244                );
    +1245        }
    +1246
    +1247        /**
    +1248         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
    +1249         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is. This always produces
    +1250         * an opaque color.
    +1251         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    +1252         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    +1253         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    +1254         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
    +1255         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    +1256         */
    +1257        public static float limitToGamut(float L, float A, float B) {
    +1258                return limitToGamut(L, A, B, 1f);
    +1259        }
    +1260        /**
    +1261         * Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside
    +1262         * the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
    +1263         * @param L lightness component; will be clamped between 0 and 1 if it isn't already
    +1264         * @param A green-to-red chromatic component; will be clamped between 0 and 1 if it isn't already
    +1265         * @param B blue-to-yellow chromatic component; will be clamped between 0 and 1 if it isn't already
    +1266         * @param alpha alpha component; will be clamped between 0 and 1 if it isn't already
    +1267         * @return the first color this finds that is in-gamut, as if it was moving toward a grayscale color with the same L
    +1268         * @see #inGamut(float, float, float)  You can use inGamut() if you just want to check whether a color is in-gamut.
    +1269         */
    +1270        public static float limitToGamut(float L, float A, float B, float alpha) {
    +1271                L = Math.min(Math.max(L, 0f), 1f);
    +1272                A = Math.min(Math.max(A, 0f), 1f);
    +1273                B = Math.min(Math.max(B, 0f), 1f);
    +1274                alpha = Math.min(Math.max(alpha, 0f), 1f);
    +1275                final float A2 = ((int) (A * 255) - 127f) / 255f;
    +1276                final float B2 = ((int) (B * 255) - 127f) / 255f;
    +1277                final float hue = TrigTools.atan2Turns(B2, A2);
    +1278                final int idx = (int) (L * 255f) << 8 | (int)(256f * hue);
    +1279                final float dist = GAMUT_DATA[idx] * 0.5f;
    +1280                if(dist * dist * 0x1p-16f >= (A2 * A2 + B2 * B2))
    +1281                        return oklab(L, A, B, alpha);
    +1282                return BitConversion.intBitsToFloat(
    +1283                                (int) (alpha * 127.999f) << 25 |
    +1284                                                (int) (TrigTools.sinTurns(hue) * dist + 127.5f) << 16 |
    +1285                                                (int) (TrigTools.cosTurns(hue) * dist + 127.5f) << 8 |
    +1286                                                (int) (L * 255f));
    +1287        }
    +1288
    +1289        /**
    +1290         * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by adding the corresponding "add"
    +1291         * parameter and then clamping. This returns a different float value (of course, the given float can't be edited
    +1292         * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged. This clamps the
    +1293         * resulting color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +1294         * @param encoded a packed float Oklab color
    +1295         * @param addL how much to add to the L channel; typically in the -1 to 1 range
    +1296         * @param addA how much to add to the A channel; typically in the -1 to 1 range
    +1297         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    +1298         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +1299         * @return a packed float Oklab color with the requested edits applied to {@code encoded}
    +1300         */
    +1301        public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha) {
    +1302                return editOklab(encoded, addL, addA, addB, addAlpha, 1f, 1f, 1f, 1f);
    +1303        }
    +1304        /**
    +1305         * Given a packed float Oklab color, this edits its L, A, B, and alpha channels by first multiplying each channel by
    +1306         * the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping. This means
    +1307         * the lightness value {@code L} is multiplied by {@code mulL}, then has {@code addL} added, and then is clamped to
    +1308         * the normal range for L (0 to 1). This returns a different float value (of course, the given float can't be edited
    +1309         * in-place). You can give a value of 0 for any "add" parameter you want to stay unchanged, or a value of 1 for any
    +1310         * "mul" parameter that shouldn't change. Note that this manipulates A and B in the -0.5 to 0.5 range, so if you
    +1311         * multiply by a small number like {@code 0.25f}, then this will produce a less-saturated color, and if you multiply
    +1312         * by a larger number like {@code 4f}, then you will get a much more-saturated color. This clamps the resulting
    +1313         * color to remain in-gamut, so it should be safe to convert it back to RGBA.
    +1314         * @param encoded a packed float Oklab color
    +1315         * @param addL how much to add to the L channel; typically in the -1 to 1 range
    +1316         * @param addA how much to add to the A channel; typically in the -1 to 1 range
    +1317         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    +1318         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +1319         * @param mulL how much to multiply the L channel by; should be non-negative
    +1320         * @param mulA how much to multiply the A channel by; usually non-negative (not always)
    +1321         * @param mulB how much to multiply the B channel by; usually non-negative (not always)
    +1322         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    +1323         * @return a packed float Oklab color with the requested edits applied to {@code encoded}
    +1324         */
    +1325        public static float editOklab(float encoded, float addL, float addA, float addB, float addAlpha,
    +1326                                                                  float mulL, float mulA, float mulB, float mulAlpha) {
    +1327                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +1328                float L = (decoded & 0xff) / 255f;
    +1329                float A = ((decoded >>> 8 & 0xff) - 127f) / 127f;
    +1330                float B = ((decoded >>> 16 & 255) - 127f) / 127f;
    +1331                float alpha = (decoded >>> 25) / 127f;
    +1332
    +1333                L = Math.min(Math.max(L * mulL + addL, 0f), 1f);
    +1334                A = Math.min(Math.max(A * mulA + addA * 2f, -1f), 1f) * 0.5f;
    +1335                B = Math.min(Math.max(B * mulB + addB * 2f, -1f), 1f) * 0.5f;
    +1336                alpha = Math.min(Math.max(alpha * mulAlpha + addAlpha, 0f), 1f);
    +1337                final float hue = TrigTools.atan2Turns(B, A);
    +1338                final int idx = (int) (L * 255f) << 8 | (int)(256f * hue);
    +1339                final float dist = GAMUT_DATA[idx] * 0.5f;
    +1340                if(dist * dist * 0x1p-16f >= (A * A + B * B))
    +1341                        return oklab(L, A + 0.5f, B + 0.5f, alpha);
    +1342                return BitConversion.intBitsToFloat(
    +1343                                (int) (alpha * 127.999f) << 25 |
    +1344                                                (int) (TrigTools.sinTurns(hue) * dist + 127.5f) << 16 |
    +1345                                                (int) (TrigTools.cosTurns(hue) * dist + 127.5f) << 8 |
    +1346                                                (int) (L * 255f));
    +1347        }
    +1348
    +1349        /**
    +1350         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    +1351         * @param random a Random object (preferably a subclass of Random, like
    +1352         * {@link com.github.tommyettinger.random.LaserRandom})
    +1353         * @return a packed float color that is always in-gamut
    +1354         */
    +1355        public static float randomColor(Random random) {
    +1356                float L = random.nextFloat();
    +1357                float A = random.nextFloat();
    +1358                float B = random.nextFloat();
    +1359                while (!inGamut(L, A, B)) {
    +1360                        L = random.nextFloat();
    +1361                        A = random.nextFloat();
    +1362                        B = random.nextFloat();
    +1363                }
    +1364                return oklab(L, A, B, 1f);
    +1365        }
    +1366
    +1367        /**
    +1368         * Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    +1369         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    +1370         * and EnhancedRandom.
    +1371         * @param random any subclass of juniper's EnhancedRandom, such as a
    +1372         * {@link com.github.tommyettinger.random.DistinctRandom} or
    +1373         * {@link com.github.tommyettinger.random.FourWheelRandom}
    +1374         * @return a packed float color that is always in-gamut
    +1375         */
    +1376        public static float randomizedColor(EnhancedRandom random) {
    +1377                float L = random.nextExclusiveFloat();
    +1378                float A = random.nextExclusiveFloat();
    +1379                float B = random.nextExclusiveFloat();
    +1380                while (!inGamut(L, A, B)) {
    +1381                        L = random.nextExclusiveFloat();
    +1382                        A = random.nextExclusiveFloat();
    +1383                        B = random.nextExclusiveFloat();
    +1384                }
    +1385                return oklab(L, A, B, 1f);
    +1386        }
    +1387
    +1388
    +1389        /**
    +1390         * Gets the squared Euclidean distance between two colors as packed Oklab floats. This is a very approximate measure
    +1391         * of how different two colors are from each other, but in Oklab this measurement is relatively more accurate than
    +1392         * if you used plain RGB as the color space, or even IPT_HQ. The result should typically be rather small; lightness
    +1393         * can only be 1 unit of distance apart at most (from black to white), and the A and B channels are usually just a
    +1394         * tiny bit away from the vertical lightness axis. A result of 1 may be the largest this can produce, but it is very
    +1395         * possible that somewhat larger results can happen. Note that this is squared, so it isn't an admissible metric for
    +1396         * some usage, like summing up distances.
    +1397         * @param encodedA a packed Oklab float
    +1398         * @param encodedB a packed Oklab float
    +1399         * @return the squared Euclidean distance between encodedA and encodedB; usually less than 1.0f
    +1400         */
    +1401        public static float distanceSquared(final float encodedA, final float encodedB) {
    +1402                final int decodedA = BitConversion.floatToRawIntBits(encodedA);
    +1403                final float LA = reverseLight((decodedA & 0xff) / 255f);
    +1404                final float AA = ((decodedA >>> 8 & 0xff) - 127f) / 127f;
    +1405                final float BA = ((decodedA >>> 16 & 255) - 127f) / 127f;
    +1406                final int decodedB = BitConversion.floatToRawIntBits(encodedB);
    +1407                final float LDiff = reverseLight((decodedB & 0xff) / 255f) - LA;
    +1408                final float ADiff = ((decodedB >>> 8 & 0xff) - 127f) / 127f - AA;
    +1409                final float BDiff = ((decodedB >>> 16 & 255) - 127f) / 127f - BA;
    +1410                return LDiff * LDiff + ADiff * ADiff + BDiff * BDiff;
    +1411        }
    +1412
    +1413        /**
    +1414         * Gets the actual Euclidean distance between two colors as packed Oklab floats. This is an approximate measure
    +1415         * of how different two colors are from each other, but in Oklab this measurement is relatively more accurate than
    +1416         * if you used plain RGB as the color space, or even IPT_HQ. The result should typically be rather small; lightness
    +1417         * can only be 1 unit of distance apart at most (from black to white), and the A and B channels are usually just a
    +1418         * tiny bit away from the vertical lightness axis. A result of 1 may be the largest this can produce, but it is very
    +1419         * possible that somewhat larger results can happen.
    +1420         * @param encodedA a packed Oklab float
    +1421         * @param encodedB a packed Oklab float
    +1422         * @return the Euclidean distance between encodedA and encodedB; usually less than 1.0f
    +1423         */
    +1424        public static float distance(final float encodedA, final float encodedB) {
    +1425                return (float) Math.sqrt(distanceSquared(encodedA, encodedB));
    +1426        }
    +1427
    +1428}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/GradientTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/GradientTools.html
    index 9a4d7f17..c901f5d7 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/GradientTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/GradientTools.html
    @@ -14,252 +14,253 @@
     
    001package com.github.tommyettinger.colorful.pure.oklab;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.Interpolation;
    -005import com.github.tommyettinger.colorful.pure.MathTools;
    -006import com.github.tommyettinger.ds.FloatList;
    -007
    -008/**
    -009 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    -010 * The intent is for the FloatList to be used as a sequence of packed float Oklab colors. You can create a new
    -011 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    -012 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    -013 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    -014 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    -015 * than two colors. You can also customize each section between colors with
    -016 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    -017 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    -018 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    -019 * <br>
    -020 * This class does some special handling for Oklab colors.
    -021 */
    -022public class GradientTools {
    -023    /**
    -024     * No need to instantiate.
    -025     */
    -026    private GradientTools(){
    -027    }
    -028
    -029    /**
    -030     * Creates a FloatList gradient from the packed float Oklab color {@code start} to the packed float Oklab color
    -031     * {@code end}, taking the specified number of steps and using linear interpolation.
    -032     * This limits individual steps of color to the correct Oklab gamut, so even interpolations between colors at
    -033     * extreme points in the color space will stay in-gamut.
    -034     * @param start the packed float Oklab color to start with
    -035     * @param end the packed float Oklab color to end on
    -036     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -037     * @return a new FloatList that contains the requested gradient
    -038     */
    -039    public static FloatList makeGradient(float start, float end, int steps) {
    -040        return makeGradient(start, end, steps, Interpolation.linear);
    -041    }
    -042    /**
    -043     * Creates a FloatList gradient from the packed float Oklab color {@code start} to the packed float Oklab color
    -044     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -045     * This limits individual steps of color to the correct Oklab gamut, so even interpolations between colors at
    -046     * extreme points in the color space will stay in-gamut.
    -047     * @param start the packed float Oklab color to start with
    -048     * @param end the packed float Oklab color to end on
    -049     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -050     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -051     * @return a new FloatList that contains the requested gradient
    -052     */
    -053    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    -054        FloatList appending = new FloatList(steps);
    -055        if(steps <= 0) {
    -056            return appending;
    -057        }
    -058        if(steps == 1) {
    -059            appending.add(start);
    -060            return appending;
    -061        }
    -062        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -063        return appending;
    -064    }
    -065
    -066    /**
    -067     * Appends a gradient from the packed float Oklab color {@code start} to the packed float Oklab color {@code end},
    -068     * taking the specified number of steps and using linear Interpolation for how it transitions. This limits
    -069     * individual steps of color to the correct Oklab gamut, so even interpolations between colors at extreme points in
    -070     * the color space will stay in-gamut.
    -071     * @param appending a FloatList that will be appended to
    -072     * @param start the packed float Oklab color to start with
    -073     * @param end the packed float Oklab color to end on
    -074     * @param steps how many steps the gradient should use; usually greater than 2
    -075     * @return {@code appending}, after adding the gradient to the end
    -076     */
    -077    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    -078        return appendGradient(appending, start, end, steps, Interpolation.linear);
    -079    }
    -080    /**
    -081     * Appends a gradient from the packed float Oklab color {@code start} to the packed float Oklab color {@code end},
    -082     * taking the specified number of steps and using the specified Interpolation for how it transitions. This limits
    -083     * individual steps of color to the correct Oklab gamut, so even interpolations between colors at extreme points in
    -084     * the color space will stay in-gamut.
    -085     * @param appending a FloatList that will be appended to
    -086     * @param start the packed float Oklab color to start with
    -087     * @param end the packed float Oklab color to end on
    -088     * @param steps how many steps the gradient should use; usually greater than 2
    -089     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -090     * @return {@code appending}, after adding the gradient to the end
    -091     */
    -092    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    -093        if(appending == null)
    -094            return null;
    -095        if(steps <= 0) {
    -096            return appending;
    -097        }
    -098        if(steps == 1) {
    -099            appending.add(start);
    -100            return appending;
    -101        }
    -102        appending.ensureCapacity(steps);
    -103        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -104        return appending;
    -105    }
    -106
    -107    /**
    -108     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses linear
    -109     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -110     * {@code steps} colors.
    -111     * @param appending a FloatList that will be appended to
    -112     * @param steps how many steps the gradient should use; usually greater than 2
    -113     * @param chain an array or varargs of packed float Oklab colors that this will interpolate through in order
    -114     * @return {@code appending}, after adding the gradient to the end
    -115     */
    -116    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    -117        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -118    }
    -119
    -120    /**
    -121     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses linear
    -122     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -123     * {@code steps} colors.
    -124     * @param appending a FloatList that will be appended to
    -125     * @param steps how many steps the gradient should use; usually greater than 2
    -126     * @param chain a FloatList of packed float Oklab colors that this will interpolate through in order
    -127     * @return {@code appending}, after adding the gradient to the end
    -128     */
    -129    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    -130        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -131    }
    -132
    -133    /**
    -134     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses the specified
    -135     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -136     * end of {@code appending} and produces a total of {@code steps} colors.
    -137     * @param appending a FloatList that will be appended to
    -138     * @param steps how many steps the gradient should use; usually greater than 2
    -139     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -140     * @param chain a FloatList of packed float Oklab colors that this will interpolate through in order
    -141     * @return {@code appending}, after adding the gradient to the end
    -142     */
    -143    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    -144        if (appending == null)
    -145            return null;
    -146        if(chain == null)
    -147            return appending;
    -148        if (steps <= 0 || chain.size() == 0) {
    -149            return appending;
    -150        }
    -151        if (steps == 1 || chain.size() == 1) {
    -152            appending.add(chain.first());
    -153            return appending;
    -154        }
    -155        appending.ensureCapacity(steps);
    -156        int limit = steps - 1, splits = chain.size() - 1;
    -157        float step = 1f / steps, change = 0f;
    -158        for (int i = 0; i < limit; i++) {
    -159            float interp = interpolation.apply(change);
    -160            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -161            int idx = (int)splint;
    -162            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint))));
    -163            change += step;
    -164        }
    -165        appending.add(chain.get(splits));
    -166        return appending;
    -167    }
    -168
    -169    /**
    -170     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses the specified
    -171     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -172     * end of {@code appending} and produces a total of {@code steps} colors.
    -173     * @param appending a FloatList that will be appended to
    -174     * @param steps how many steps the gradient should use; usually greater than 2
    -175     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -176     * @param chain an array or varargs of packed float Oklab colors that this will interpolate through in order
    -177     * @return {@code appending}, after adding the gradient to the end
    -178     */
    -179    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    -180        if (appending == null)
    -181            return null;
    -182        if(chain == null)
    -183            return appending;
    -184        if (steps <= 0 || chain.length == 0) {
    -185            return appending;
    -186        }
    -187        if (steps == 1 || chain.length == 1) {
    -188            appending.add(chain[0]);
    -189            return appending;
    -190        }
    -191        appending.ensureCapacity(steps);
    -192        int limit = steps - 1, splits = chain.length - 1;
    -193        float step = 1f / steps, change = 0f;
    -194        for (int i = 0; i < limit; i++) {
    -195            float interp = interpolation.apply(change);
    -196            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -197            int idx = (int)splint;
    -198            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint))));
    -199            change += step;
    -200        }
    -201        appending.add(chain[splits]);
    -202        return appending;
    -203    }
    -204
    -205    /**
    -206     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    -207     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -208     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -209     * number of steps, it just doesn't append {@code end} in the last step.
    -210     * @param appending a FloatList that will be appended to
    -211     * @param start the packed float Oklab color to start with
    -212     * @param end the packed float Oklab color to end just before
    -213     * @param steps how many steps the gradient should use; usually greater than 2
    -214     * @return {@code appending}, after adding the gradient to its end
    -215     */
    -216    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    -217        return appendPartialGradient(appending, start, end, steps, Interpolation.linear);
    -218    }
    -219    /**
    -220     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    -221     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -222     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -223     * number of steps, it just doesn't append {@code end} in the last step.
    -224     * @param appending a FloatList that will be appended to
    -225     * @param start the packed float Oklab color to start with
    -226     * @param end the packed float Oklab color to end just before
    -227     * @param steps how many steps the gradient should use; usually greater than 2
    -228     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    -229     * @return {@code appending}, after adding the gradient to its end
    -230     */
    -231    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    -232        if(appending == null)
    -233            return null;
    -234        if(steps <= 0) {
    -235            return appending;
    -236        }
    -237        if(steps == 1) {
    -238            appending.add(start);
    -239            return appending;
    -240        }
    -241        int limit = steps;
    -242        float step = 1f / steps, change = 0f;
    -243        for (int i = 0; i < limit; i++) {
    -244            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(start, end, interpolation.apply(change))));
    -245            change += step;
    -246        }
    -247        return appending;
    -248    }
    -249}
    +004import com.github.tommyettinger.colorful.pure.Interpolations;
    +005import com.github.tommyettinger.colorful.pure.Interpolations.Interpolation;
    +006import com.github.tommyettinger.colorful.pure.MathTools;
    +007import com.github.tommyettinger.ds.FloatList;
    +008
    +009/**
    +010 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    +011 * The intent is for the FloatList to be used as a sequence of packed float Oklab colors. You can create a new
    +012 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    +013 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    +014 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    +015 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    +016 * than two colors. You can also customize each section between colors with
    +017 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    +018 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    +019 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    +020 * <br>
    +021 * This class does some special handling for Oklab colors.
    +022 */
    +023public class GradientTools {
    +024    /**
    +025     * No need to instantiate.
    +026     */
    +027    private GradientTools(){
    +028    }
    +029
    +030    /**
    +031     * Creates a FloatList gradient from the packed float Oklab color {@code start} to the packed float Oklab color
    +032     * {@code end}, taking the specified number of steps and using linear interpolation.
    +033     * This limits individual steps of color to the correct Oklab gamut, so even interpolations between colors at
    +034     * extreme points in the color space will stay in-gamut.
    +035     * @param start the packed float Oklab color to start with
    +036     * @param end the packed float Oklab color to end on
    +037     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +038     * @return a new FloatList that contains the requested gradient
    +039     */
    +040    public static FloatList makeGradient(float start, float end, int steps) {
    +041        return makeGradient(start, end, steps, Interpolations.linear);
    +042    }
    +043    /**
    +044     * Creates a FloatList gradient from the packed float Oklab color {@code start} to the packed float Oklab color
    +045     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    +046     * This limits individual steps of color to the correct Oklab gamut, so even interpolations between colors at
    +047     * extreme points in the color space will stay in-gamut.
    +048     * @param start the packed float Oklab color to start with
    +049     * @param end the packed float Oklab color to end on
    +050     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +051     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +052     * @return a new FloatList that contains the requested gradient
    +053     */
    +054    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    +055        FloatList appending = new FloatList(steps);
    +056        if(steps <= 0) {
    +057            return appending;
    +058        }
    +059        if(steps == 1) {
    +060            appending.add(start);
    +061            return appending;
    +062        }
    +063        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +064        return appending;
    +065    }
    +066
    +067    /**
    +068     * Appends a gradient from the packed float Oklab color {@code start} to the packed float Oklab color {@code end},
    +069     * taking the specified number of steps and using linear Interpolation for how it transitions. This limits
    +070     * individual steps of color to the correct Oklab gamut, so even interpolations between colors at extreme points in
    +071     * the color space will stay in-gamut.
    +072     * @param appending a FloatList that will be appended to
    +073     * @param start the packed float Oklab color to start with
    +074     * @param end the packed float Oklab color to end on
    +075     * @param steps how many steps the gradient should use; usually greater than 2
    +076     * @return {@code appending}, after adding the gradient to the end
    +077     */
    +078    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    +079        return appendGradient(appending, start, end, steps, Interpolations.linear);
    +080    }
    +081    /**
    +082     * Appends a gradient from the packed float Oklab color {@code start} to the packed float Oklab color {@code end},
    +083     * taking the specified number of steps and using the specified Interpolation for how it transitions. This limits
    +084     * individual steps of color to the correct Oklab gamut, so even interpolations between colors at extreme points in
    +085     * the color space will stay in-gamut.
    +086     * @param appending a FloatList that will be appended to
    +087     * @param start the packed float Oklab color to start with
    +088     * @param end the packed float Oklab color to end on
    +089     * @param steps how many steps the gradient should use; usually greater than 2
    +090     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +091     * @return {@code appending}, after adding the gradient to the end
    +092     */
    +093    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    +094        if(appending == null)
    +095            return null;
    +096        if(steps <= 0) {
    +097            return appending;
    +098        }
    +099        if(steps == 1) {
    +100            appending.add(start);
    +101            return appending;
    +102        }
    +103        appending.ensureCapacity(steps);
    +104        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +105        return appending;
    +106    }
    +107
    +108    /**
    +109     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses linear
    +110     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +111     * {@code steps} colors.
    +112     * @param appending a FloatList that will be appended to
    +113     * @param steps how many steps the gradient should use; usually greater than 2
    +114     * @param chain an array or varargs of packed float Oklab colors that this will interpolate through in order
    +115     * @return {@code appending}, after adding the gradient to the end
    +116     */
    +117    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    +118        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +119    }
    +120
    +121    /**
    +122     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses linear
    +123     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +124     * {@code steps} colors.
    +125     * @param appending a FloatList that will be appended to
    +126     * @param steps how many steps the gradient should use; usually greater than 2
    +127     * @param chain a FloatList of packed float Oklab colors that this will interpolate through in order
    +128     * @return {@code appending}, after adding the gradient to the end
    +129     */
    +130    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    +131        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +132    }
    +133
    +134    /**
    +135     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses the specified
    +136     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +137     * end of {@code appending} and produces a total of {@code steps} colors.
    +138     * @param appending a FloatList that will be appended to
    +139     * @param steps how many steps the gradient should use; usually greater than 2
    +140     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +141     * @param chain a FloatList of packed float Oklab colors that this will interpolate through in order
    +142     * @return {@code appending}, after adding the gradient to the end
    +143     */
    +144    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    +145        if (appending == null)
    +146            return null;
    +147        if(chain == null)
    +148            return appending;
    +149        if (steps <= 0 || chain.size() == 0) {
    +150            return appending;
    +151        }
    +152        if (steps == 1 || chain.size() == 1) {
    +153            appending.add(chain.first());
    +154            return appending;
    +155        }
    +156        appending.ensureCapacity(steps);
    +157        int limit = steps - 1, splits = chain.size() - 1;
    +158        float step = 1f / steps, change = 0f;
    +159        for (int i = 0; i < limit; i++) {
    +160            float interp = interpolation.apply(change);
    +161            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +162            int idx = (int)splint;
    +163            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint))));
    +164            change += step;
    +165        }
    +166        appending.add(chain.get(splits));
    +167        return appending;
    +168    }
    +169
    +170    /**
    +171     * Appends a gradient between several packed float Oklab colors provided in {@code chain}. This uses the specified
    +172     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +173     * end of {@code appending} and produces a total of {@code steps} colors.
    +174     * @param appending a FloatList that will be appended to
    +175     * @param steps how many steps the gradient should use; usually greater than 2
    +176     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +177     * @param chain an array or varargs of packed float Oklab colors that this will interpolate through in order
    +178     * @return {@code appending}, after adding the gradient to the end
    +179     */
    +180    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    +181        if (appending == null)
    +182            return null;
    +183        if(chain == null)
    +184            return appending;
    +185        if (steps <= 0 || chain.length == 0) {
    +186            return appending;
    +187        }
    +188        if (steps == 1 || chain.length == 1) {
    +189            appending.add(chain[0]);
    +190            return appending;
    +191        }
    +192        appending.ensureCapacity(steps);
    +193        int limit = steps - 1, splits = chain.length - 1;
    +194        float step = 1f / steps, change = 0f;
    +195        for (int i = 0; i < limit; i++) {
    +196            float interp = interpolation.apply(change);
    +197            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +198            int idx = (int)splint;
    +199            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint))));
    +200            change += step;
    +201        }
    +202        appending.add(chain[splits]);
    +203        return appending;
    +204    }
    +205
    +206    /**
    +207     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    +208     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +209     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +210     * number of steps, it just doesn't append {@code end} in the last step.
    +211     * @param appending a FloatList that will be appended to
    +212     * @param start the packed float Oklab color to start with
    +213     * @param end the packed float Oklab color to end just before
    +214     * @param steps how many steps the gradient should use; usually greater than 2
    +215     * @return {@code appending}, after adding the gradient to its end
    +216     */
    +217    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    +218        return appendPartialGradient(appending, start, end, steps, Interpolations.linear);
    +219    }
    +220    /**
    +221     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    +222     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +223     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +224     * number of steps, it just doesn't append {@code end} in the last step.
    +225     * @param appending a FloatList that will be appended to
    +226     * @param start the packed float Oklab color to start with
    +227     * @param end the packed float Oklab color to end just before
    +228     * @param steps how many steps the gradient should use; usually greater than 2
    +229     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    +230     * @return {@code appending}, after adding the gradient to its end
    +231     */
    +232    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    +233        if(appending == null)
    +234            return null;
    +235        if(steps <= 0) {
    +236            return appending;
    +237        }
    +238        if(steps == 1) {
    +239            appending.add(start);
    +240            return appending;
    +241        }
    +242        int limit = steps;
    +243        float step = 1f / steps, change = 0f;
    +244        for (int i = 0; i < limit; i++) {
    +245            appending.add(ColorTools.limitToGamut(FloatColors.lerpFloatColors(start, end, interpolation.apply(change))));
    +246            change += step;
    +247        }
    +248        return appending;
    +249    }
    +250}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/Palette.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/Palette.html
    index 5f7a451c..28f84b33 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/Palette.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/Palette.html
    @@ -34,7 +34,7 @@
     021    public static final FloatList LIST = new FloatList(256);
     022
     023    /**
    -024     * This color constant "Transparent" has RGBA8888 code {@code 00000000}, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +024     * This color constant "Transparent" has RGBA8888 code {@code 00000000}, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     025     * It can be represented as a packed float with the constant {@code 0x0.fefep-126F}.
     026     * <pre>
     027     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -46,7 +46,7 @@
     033    static { NAMED.put("Transparent", 0x0.fefep-126F); LIST.add(0x0.fefep-126F); }
     034
     035    /**
    -036     * This color constant "Black" has RGBA8888 code {@code 000000FF}, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +036     * This color constant "Black" has RGBA8888 code {@code 000000FF}, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     037     * It can be represented as a packed float with the constant {@code -0x1.fefep125F}.
     038     * <pre>
     039     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -58,7 +58,7 @@
     045    static { NAMED.put("Black", -0x1.fefep125F); LIST.add(-0x1.fefep125F); }
     046
     047    /**
    -048     * This color constant "Coal Black" has RGBA8888 code {@code 131313FF}, L 0.05882353, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.015122874, and chroma 0.0055242716.
    +048     * This color constant "Coal Black" has RGBA8888 code {@code 131313FF}, L 0.05882353, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     049     * It can be represented as a packed float with the constant {@code -0x1.fefe1ep125F}.
     050     * <pre>
     051     * <font style='background-color: #131313;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #131313; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -70,7 +70,7 @@
     057    static { NAMED.put("Coal Black", -0x1.fefe1ep125F); LIST.add(-0x1.fefe1ep125F); }
     058
     059    /**
    -060     * This color constant "Shadow" has RGBA8888 code {@code 252525FF}, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.007346189, and chroma 0.0055242716.
    +060     * This color constant "Shadow" has RGBA8888 code {@code 252525FF}, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     061     * It can be represented as a packed float with the constant {@code -0x1.fefe44p125F}.
     062     * <pre>
     063     * <font style='background-color: #252525;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #252525; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -82,43 +82,43 @@
     069    static { NAMED.put("Shadow", -0x1.fefe44p125F); LIST.add(-0x1.fefe44p125F); }
     070
     071    /**
    -072     * This color constant "Graphite" has RGBA8888 code {@code 373737FF}, L 0.21176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.004326663, and chroma 0.0055242716.
    -073     * It can be represented as a packed float with the constant {@code -0x1.fefe6cp125F}.
    +072     * This color constant "Graphite" has RGBA8888 code {@code 373737FF}, L 0.20784314, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +073     * It can be represented as a packed float with the constant {@code -0x1.fefe6ap125F}.
     074     * <pre>
     075     * <font style='background-color: #373737;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #373737; color: #000000'>&nbsp;@&nbsp;</font>
     076     * <font style='background-color: #373737;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #373737'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #373737'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #373737'>&nbsp;@&nbsp;</font><font style='background-color: #373737; color: #888888'>&nbsp;@&nbsp;</font>
     077     * <font style='background-color: #373737;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #373737; color: #ffffff'>&nbsp;@&nbsp;</font>
     078     * </pre>
     079     */
    -080    public static final float GRAPHITE = -0x1.fefe6cp125F;
    -081    static { NAMED.put("Graphite", -0x1.fefe6cp125F); LIST.add(-0x1.fefe6cp125F); }
    +080    public static final float GRAPHITE = -0x1.fefe6ap125F;
    +081    static { NAMED.put("Graphite", -0x1.fefe6ap125F); LIST.add(-0x1.fefe6ap125F); }
     082
     083    /**
    -084     * This color constant "Dark Gray" has RGBA8888 code {@code 494949FF}, L 0.2901961, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.003331945, and chroma 0.0055242716.
    -085     * It can be represented as a packed float with the constant {@code -0x1.fefe94p125F}.
    +084     * This color constant "Dark Gray" has RGBA8888 code {@code 494949FF}, L 0.28627452, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +085     * It can be represented as a packed float with the constant {@code -0x1.fefe92p125F}.
     086     * <pre>
     087     * <font style='background-color: #494949;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #494949; color: #000000'>&nbsp;@&nbsp;</font>
     088     * <font style='background-color: #494949;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #494949'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #494949'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #494949'>&nbsp;@&nbsp;</font><font style='background-color: #494949; color: #888888'>&nbsp;@&nbsp;</font>
     089     * <font style='background-color: #494949;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #494949; color: #ffffff'>&nbsp;@&nbsp;</font>
     090     * </pre>
     091     */
    -092    public static final float DARK_GRAY = -0x1.fefe94p125F;
    -093    static { NAMED.put("Dark Gray", -0x1.fefe94p125F); LIST.add(-0x1.fefe94p125F); }
    +092    public static final float DARK_GRAY = -0x1.fefe92p125F;
    +093    static { NAMED.put("Dark Gray", -0x1.fefe92p125F); LIST.add(-0x1.fefe92p125F); }
     094
     095    /**
    -096     * This color constant "Lead" has RGBA8888 code {@code 5B5B5BFF}, L 0.3647059, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716.
    -097     * It can be represented as a packed float with the constant {@code -0x1.fefebap125F}.
    +096     * This color constant "Lead" has RGBA8888 code {@code 5B5B5BFF}, L 0.36078432, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +097     * It can be represented as a packed float with the constant {@code -0x1.fefeb8p125F}.
     098     * <pre>
     099     * <font style='background-color: #5B5B5B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5B5B5B; color: #000000'>&nbsp;@&nbsp;</font>
     100     * <font style='background-color: #5B5B5B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #5B5B5B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #5B5B5B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #5B5B5B'>&nbsp;@&nbsp;</font><font style='background-color: #5B5B5B; color: #888888'>&nbsp;@&nbsp;</font>
     101     * <font style='background-color: #5B5B5B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5B5B5B; color: #ffffff'>&nbsp;@&nbsp;</font>
     102     * </pre>
     103     */
    -104    public static final float LEAD = -0x1.fefebap125F;
    -105    static { NAMED.put("Lead", -0x1.fefebap125F); LIST.add(-0x1.fefebap125F); }
    +104    public static final float LEAD = -0x1.fefeb8p125F;
    +105    static { NAMED.put("Lead", -0x1.fefeb8p125F); LIST.add(-0x1.fefeb8p125F); }
     106
     107    /**
    -108     * This color constant "Iron" has RGBA8888 code {@code 6E6E6EFF}, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0020156212, and chroma 0.0055242716.
    +108     * This color constant "Iron" has RGBA8888 code {@code 6E6E6EFF}, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     109     * It can be represented as a packed float with the constant {@code -0x1.fefee2p125F}.
     110     * <pre>
     111     * <font style='background-color: #6E6E6E;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #6E6E6E; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -130,7 +130,7 @@
     117    static { NAMED.put("Iron", -0x1.fefee2p125F); LIST.add(-0x1.fefee2p125F); }
     118
     119    /**
    -120     * This color constant "Gray" has RGBA8888 code {@code 808080FF}, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0016803193, and chroma 0.0055242716.
    +120     * This color constant "Gray" has RGBA8888 code {@code 808080FF}, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     121     * It can be represented as a packed float with the constant {@code -0x1.feff06p125F}.
     122     * <pre>
     123     * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -142,7 +142,7 @@
     129    static { NAMED.put("Gray", -0x1.feff06p125F); LIST.add(-0x1.feff06p125F); }
     130
     131    /**
    -132     * This color constant "Chinchilla" has RGBA8888 code {@code 929292FF}, L 0.58431375, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0014222222, and chroma 0.0055242716.
    +132     * This color constant "Chinchilla" has RGBA8888 code {@code 929292FF}, L 0.58431375, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     133     * It can be represented as a packed float with the constant {@code -0x1.feff2ap125F}.
     134     * <pre>
     135     * <font style='background-color: #929292;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #929292; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -154,67 +154,67 @@
     141    static { NAMED.put("Chinchilla", -0x1.feff2ap125F); LIST.add(-0x1.feff2ap125F); }
     142
     143    /**
    -144     * This color constant "Greyhound" has RGBA8888 code {@code A4A4A4FF}, L 0.6509804, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0012193263, and chroma 0.0055242716.
    -145     * It can be represented as a packed float with the constant {@code -0x1.feff4cp125F}.
    +144     * This color constant "Greyhound" has RGBA8888 code {@code A4A4A4FF}, L 0.654902, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +145     * It can be represented as a packed float with the constant {@code -0x1.feff4ep125F}.
     146     * <pre>
     147     * <font style='background-color: #A4A4A4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A4A4A4; color: #000000'>&nbsp;@&nbsp;</font>
     148     * <font style='background-color: #A4A4A4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #A4A4A4'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #A4A4A4'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #A4A4A4'>&nbsp;@&nbsp;</font><font style='background-color: #A4A4A4; color: #888888'>&nbsp;@&nbsp;</font>
     149     * <font style='background-color: #A4A4A4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A4A4A4; color: #ffffff'>&nbsp;@&nbsp;</font>
     150     * </pre>
     151     */
    -152    public static final float GREYHOUND = -0x1.feff4cp125F;
    -153    static { NAMED.put("Greyhound", -0x1.feff4cp125F); LIST.add(-0x1.feff4cp125F); }
    +152    public static final float GREYHOUND = -0x1.feff4ep125F;
    +153    static { NAMED.put("Greyhound", -0x1.feff4ep125F); LIST.add(-0x1.feff4ep125F); }
     154
     155    /**
    -156     * This color constant "Silver" has RGBA8888 code {@code B6B6B6FF}, L 0.7176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0013493, and chroma 0.0055242716.
    -157     * It can be represented as a packed float with the constant {@code -0x1.feff6ep125F}.
    +156     * This color constant "Silver" has RGBA8888 code {@code B6B6B6FF}, L 0.72156864, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +157     * It can be represented as a packed float with the constant {@code -0x1.feff7p125F}.
     158     * <pre>
     159     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #000000'>&nbsp;@&nbsp;</font>
     160     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #B6B6B6; color: #888888'>&nbsp;@&nbsp;</font>
     161     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #ffffff'>&nbsp;@&nbsp;</font>
     162     * </pre>
     163     */
    -164    public static final float SILVER = -0x1.feff6ep125F;
    -165    static { NAMED.put("Silver", -0x1.feff6ep125F); LIST.add(-0x1.feff6ep125F); }
    +164    public static final float SILVER = -0x1.feff7p125F;
    +165    static { NAMED.put("Silver", -0x1.feff7p125F); LIST.add(-0x1.feff7p125F); }
     166
     167    /**
    -168     * This color constant "Light Gray" has RGBA8888 code {@code C9C9C9FF}, L 0.78431374, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716.
    -169     * It can be represented as a packed float with the constant {@code -0x1.feff9p125F}.
    +168     * This color constant "Light Gray" has RGBA8888 code {@code C9C9C9FF}, L 0.7921569, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +169     * It can be represented as a packed float with the constant {@code -0x1.feff94p125F}.
     170     * <pre>
     171     * <font style='background-color: #C9C9C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C9C9C9; color: #000000'>&nbsp;@&nbsp;</font>
     172     * <font style='background-color: #C9C9C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C9C9C9'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C9C9C9'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C9C9C9'>&nbsp;@&nbsp;</font><font style='background-color: #C9C9C9; color: #888888'>&nbsp;@&nbsp;</font>
     173     * <font style='background-color: #C9C9C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C9C9C9; color: #ffffff'>&nbsp;@&nbsp;</font>
     174     * </pre>
     175     */
    -176    public static final float LIGHT_GRAY = -0x1.feff9p125F;
    -177    static { NAMED.put("Light Gray", -0x1.feff9p125F); LIST.add(-0x1.feff9p125F); }
    +176    public static final float LIGHT_GRAY = -0x1.feff94p125F;
    +177    static { NAMED.put("Light Gray", -0x1.feff94p125F); LIST.add(-0x1.feff94p125F); }
     178
     179    /**
    -180     * This color constant "Platinum" has RGBA8888 code {@code DBDBDBFF}, L 0.84705883, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.005259698, and chroma 0.0055242716.
    -181     * It can be represented as a packed float with the constant {@code -0x1.feffbp125F}.
    +180     * This color constant "Platinum" has RGBA8888 code {@code DBDBDBFF}, L 0.85490197, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +181     * It can be represented as a packed float with the constant {@code -0x1.feffb4p125F}.
     182     * <pre>
     183     * <font style='background-color: #DBDBDB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DBDBDB; color: #000000'>&nbsp;@&nbsp;</font>
     184     * <font style='background-color: #DBDBDB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #DBDBDB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #DBDBDB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #DBDBDB'>&nbsp;@&nbsp;</font><font style='background-color: #DBDBDB; color: #888888'>&nbsp;@&nbsp;</font>
     185     * <font style='background-color: #DBDBDB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DBDBDB; color: #ffffff'>&nbsp;@&nbsp;</font>
     186     * </pre>
     187     */
    -188    public static final float PLATINUM = -0x1.feffbp125F;
    -189    static { NAMED.put("Platinum", -0x1.feffbp125F); LIST.add(-0x1.feffbp125F); }
    +188    public static final float PLATINUM = -0x1.feffb4p125F;
    +189    static { NAMED.put("Platinum", -0x1.feffb4p125F); LIST.add(-0x1.feffb4p125F); }
     190
     191    /**
    -192     * This color constant "Cloud" has RGBA8888 code {@code EDEDEDFF}, L 0.90588236, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.015122874, and chroma 0.0055242716.
    -193     * It can be represented as a packed float with the constant {@code -0x1.feffcep125F}.
    +192     * This color constant "Cloud" has RGBA8888 code {@code EDEDEDFF}, L 0.91764706, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +193     * It can be represented as a packed float with the constant {@code -0x1.feffd4p125F}.
     194     * <pre>
     195     * <font style='background-color: #EDEDED;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EDEDED; color: #000000'>&nbsp;@&nbsp;</font>
     196     * <font style='background-color: #EDEDED;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #EDEDED'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #EDEDED'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #EDEDED'>&nbsp;@&nbsp;</font><font style='background-color: #EDEDED; color: #888888'>&nbsp;@&nbsp;</font>
     197     * <font style='background-color: #EDEDED;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EDEDED; color: #ffffff'>&nbsp;@&nbsp;</font>
     198     * </pre>
     199     */
    -200    public static final float CLOUD = -0x1.feffcep125F;
    -201    static { NAMED.put("Cloud", -0x1.feffcep125F); LIST.add(-0x1.feffcep125F); }
    +200    public static final float CLOUD = -0x1.feffd4p125F;
    +201    static { NAMED.put("Cloud", -0x1.feffd4p125F); LIST.add(-0x1.feffd4p125F); }
     202
     203    /**
    -204     * This color constant "White" has RGBA8888 code {@code FFFFFFFF}, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +204     * This color constant "White" has RGBA8888 code {@code FFFFFFFF}, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
     205     * It can be represented as a packed float with the constant {@code -0x1.fefffep125F}.
     206     * <pre>
     207     * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -226,7 +226,7 @@
     213    static { NAMED.put("White", -0x1.fefffep125F); LIST.add(-0x1.fefffep125F); }
     214
     215    /**
    -216     * This color constant "Seawater" has RGBA8888 code {@code 007F7FFF}, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.543443, saturation 0.89123964, and chroma 0.10141215.
    +216     * This color constant "Seawater" has RGBA8888 code {@code 007F7FFF}, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.53898686, saturation 0.95148593, and chroma 0.10141215.
     217     * It can be represented as a packed float with the constant {@code -0x1.f8e6ep125F}.
     218     * <pre>
     219     * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -238,55 +238,55 @@
     225    static { NAMED.put("Seawater", -0x1.f8e6ep125F); LIST.add(-0x1.f8e6ep125F); }
     226
     227    /**
    -228     * This color constant "Hospital Green" has RGBA8888 code {@code 3FBFBFFF}, L 0.6666667, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54788184, saturation 0.7316009, and chroma 0.11861114.
    -229     * It can be represented as a packed float with the constant {@code -0x1.f6e354p125F}.
    +228     * This color constant "Hospital Green" has RGBA8888 code {@code 3FBFBFFF}, L 0.67058825, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54428434, saturation 0.83201253, and chroma 0.11861114.
    +229     * It can be represented as a packed float with the constant {@code -0x1.f6e356p125F}.
     230     * <pre>
     231     * <font style='background-color: #3FBFBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBFBF; color: #000000'>&nbsp;@&nbsp;</font>
     232     * <font style='background-color: #3FBFBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3FBFBF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3FBFBF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3FBFBF'>&nbsp;@&nbsp;</font><font style='background-color: #3FBFBF; color: #888888'>&nbsp;@&nbsp;</font>
     233     * <font style='background-color: #3FBFBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBFBF; color: #ffffff'>&nbsp;@&nbsp;</font>
     234     * </pre>
     235     */
    -236    public static final float HOSPITAL_GREEN = -0x1.f6e354p125F;
    -237    static { NAMED.put("Hospital Green", -0x1.f6e354p125F); LIST.add(-0x1.f6e354p125F); }
    +236    public static final float HOSPITAL_GREEN = -0x1.f6e356p125F;
    +237    static { NAMED.put("Hospital Green", -0x1.f6e356p125F); LIST.add(-0x1.f6e356p125F); }
     238
     239    /**
    -240     * This color constant "Cyan" has RGBA8888 code {@code 00FFFFFF}, L 0.8509804, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.54374534, saturation 0.95340395, and chroma 0.1582875.
    -241     * It can be represented as a packed float with the constant {@code -0x1.f4d9b2p125F}.
    +240     * This color constant "Cyan" has RGBA8888 code {@code 00FFFFFF}, L 0.85882354, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.5409493, saturation 1.0340465, and chroma 0.1582875.
    +241     * It can be represented as a packed float with the constant {@code -0x1.f4d9b6p125F}.
     242     * <pre>
     243     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #000000'>&nbsp;@&nbsp;</font>
     244     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #00FFFF; color: #888888'>&nbsp;@&nbsp;</font>
     245     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #ffffff'>&nbsp;@&nbsp;</font>
     246     * </pre>
     247     */
    -248    public static final float CYAN = -0x1.f4d9b2p125F;
    -249    static { NAMED.put("Cyan", -0x1.f4d9b2p125F); LIST.add(-0x1.f4d9b2p125F); }
    +248    public static final float CYAN = -0x1.f4d9b6p125F;
    +249    static { NAMED.put("Cyan", -0x1.f4d9b6p125F); LIST.add(-0x1.f4d9b6p125F); }
     250
     251    /**
    -252     * This color constant "Bubble" has RGBA8888 code {@code BFFFFFFF}, L 0.91764706, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.81632656, and chroma 0.061763234.
    -253     * It can be represented as a packed float with the constant {@code -0x1.faf1d4p125F}.
    +252     * This color constant "Bubble" has RGBA8888 code {@code BFFFFFFF}, L 0.92941177, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.54428434, saturation 1.0400157, and chroma 0.061763234.
    +253     * It can be represented as a packed float with the constant {@code -0x1.faf1dap125F}.
     254     * <pre>
     255     * <font style='background-color: #BFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BFFFFF; color: #000000'>&nbsp;@&nbsp;</font>
     256     * <font style='background-color: #BFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #BFFFFF; color: #888888'>&nbsp;@&nbsp;</font>
     257     * <font style='background-color: #BFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BFFFFF; color: #ffffff'>&nbsp;@&nbsp;</font>
     258     * </pre>
     259     */
    -260    public static final float BUBBLE = -0x1.faf1d4p125F;
    -261    static { NAMED.put("Bubble", -0x1.faf1d4p125F); LIST.add(-0x1.faf1d4p125F); }
    +260    public static final float BUBBLE = -0x1.faf1dap125F;
    +261    static { NAMED.put("Bubble", -0x1.faf1dap125F); LIST.add(-0x1.faf1dap125F); }
     262
     263    /**
    -264     * This color constant "Periwinkle" has RGBA8888 code {@code 8181FFFF}, L 0.5803922, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.77569586, saturation 0.8777893, and chroma 0.17017984.
    -265     * It can be represented as a packed float with the constant {@code -0x1.d50728p125F}.
    +264     * This color constant "Periwinkle" has RGBA8888 code {@code 8181FFFF}, L 0.58431375, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.779965, saturation 0.95011365, and chroma 0.17017984.
    +265     * It can be represented as a packed float with the constant {@code -0x1.d5072ap125F}.
     266     * <pre>
     267     * <font style='background-color: #8181FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8181FF; color: #000000'>&nbsp;@&nbsp;</font>
     268     * <font style='background-color: #8181FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8181FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8181FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8181FF'>&nbsp;@&nbsp;</font><font style='background-color: #8181FF; color: #888888'>&nbsp;@&nbsp;</font>
     269     * <font style='background-color: #8181FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8181FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     270     * </pre>
     271     */
    -272    public static final float PERIWINKLE = -0x1.d50728p125F;
    -273    static { NAMED.put("Periwinkle", -0x1.d50728p125F); LIST.add(-0x1.d50728p125F); }
    +272    public static final float PERIWINKLE = -0x1.d5072ap125F;
    +273    static { NAMED.put("Periwinkle", -0x1.d5072ap125F); LIST.add(-0x1.d5072ap125F); }
     274
     275    /**
    -276     * This color constant "Blue" has RGBA8888 code {@code 0000FFFF}, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.7323789, saturation 0.97586775, and chroma 0.31835338.
    +276     * This color constant "Blue" has RGBA8888 code {@code 0000FFFF}, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.73413044, saturation 0.9925803, and chroma 0.31835338.
     277     * It can be represented as a packed float with the constant {@code -0x1.aef69cp125F}.
     278     * <pre>
     279     * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -298,19 +298,19 @@
     285    static { NAMED.put("Blue", -0x1.aef69cp125F); LIST.add(-0x1.aef69cp125F); }
     286
     287    /**
    -288     * This color constant "Faded Blue" has RGBA8888 code {@code 3F3FBFFF}, L 0.33333334, A 0.50980395, B 0.4, alpha 1.0, hue 0.7655599, saturation 0.41548988, and chroma 0.20017387.
    -289     * It can be represented as a packed float with the constant {@code -0x1.cd04aap125F}.
    +288     * This color constant "Faded Blue" has RGBA8888 code {@code 3F3FBFFF}, L 0.33333334, A 0.50980395, B 0.40392157, alpha 1.0, hue 0.76980346, saturation 0.6282279, and chroma 0.19240016.
    +289     * It can be represented as a packed float with the constant {@code -0x1.cf04aap125F}.
     290     * <pre>
     291     * <font style='background-color: #3F3FBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3F3FBF; color: #000000'>&nbsp;@&nbsp;</font>
     292     * <font style='background-color: #3F3FBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3F3FBF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3F3FBF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3F3FBF'>&nbsp;@&nbsp;</font><font style='background-color: #3F3FBF; color: #888888'>&nbsp;@&nbsp;</font>
     293     * <font style='background-color: #3F3FBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3F3FBF; color: #ffffff'>&nbsp;@&nbsp;</font>
     294     * </pre>
     295     */
    -296    public static final float FADED_BLUE = -0x1.cd04aap125F;
    -297    static { NAMED.put("Faded Blue", -0x1.cd04aap125F); LIST.add(-0x1.cd04aap125F); }
    +296    public static final float FADED_BLUE = -0x1.cf04aap125F;
    +297    static { NAMED.put("Faded Blue", -0x1.cf04aap125F); LIST.add(-0x1.cf04aap125F); }
     298
     299    /**
    -300     * This color constant "Ocean Blue" has RGBA8888 code {@code 00007FFF}, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.7282781, saturation 0.96145123, and chroma 0.20108652.
    +300     * This color constant "Ocean Blue" has RGBA8888 code {@code 00007FFF}, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.73098123, saturation 0.9874258, and chroma 0.20108652.
     301     * It can be represented as a packed float with the constant {@code -0x1.ccf848p125F}.
     302     * <pre>
     303     * <font style='background-color: #00007F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00007F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -322,7 +322,7 @@
     309    static { NAMED.put("Ocean Blue", -0x1.ccf848p125F); LIST.add(-0x1.ccf848p125F); }
     310
     311    /**
    -312     * This color constant "Stygian Blue" has RGBA8888 code {@code 0F0F50FF}, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.7454664, saturation 0.71185946, and chroma 0.13677454.
    +312     * This color constant "Stygian Blue" has RGBA8888 code {@code 0F0F50FF}, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.75, saturation 0.85, and chroma 0.13677454.
     313     * It can be represented as a packed float with the constant {@code -0x1.dcfe32p125F}.
     314     * <pre>
     315     * <font style='background-color: #0F0F50;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0F0F50; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -334,7 +334,7 @@
     321    static { NAMED.put("Stygian Blue", -0x1.dcfe32p125F); LIST.add(-0x1.dcfe32p125F); }
     322
     323    /**
    -324     * This color constant "Deep Purple" has RGBA8888 code {@code 7F007FFF}, L 0.29411766, A 0.58431375, B 0.44313726, alpha 1.0, hue 0.9055531, saturation 0.87330574, and chroma 0.20259848.
    +324     * This color constant "Deep Purple" has RGBA8888 code {@code 7F007FFF}, L 0.29411766, A 0.58431375, B 0.44313726, alpha 1.0, hue 0.90979147, saturation 0.96580774, and chroma 0.20259848.
     325     * It can be represented as a packed float with the constant {@code -0x1.e32a96p125F}.
     326     * <pre>
     327     * <font style='background-color: #7F007F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F007F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -346,7 +346,7 @@
     333    static { NAMED.put("Deep Purple", -0x1.e32a96p125F); LIST.add(-0x1.e32a96p125F); }
     334
     335    /**
    -336     * This color constant "Tyrian Purple" has RGBA8888 code {@code BF3FBFFF}, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9039804, saturation 0.51023114, and chroma 0.21345432.
    +336     * This color constant "Tyrian Purple" has RGBA8888 code {@code BF3FBFFF}, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9080125, saturation 0.73224163, and chroma 0.21345432.
     337     * It can be represented as a packed float with the constant {@code -0x1.e12cfcp125F}.
     338     * <pre>
     339     * <font style='background-color: #BF3FBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BF3FBF; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -358,7 +358,7 @@
     345    static { NAMED.put("Tyrian Purple", -0x1.e12cfcp125F); LIST.add(-0x1.e12cfcp125F); }
     346
     347    /**
    -348     * This color constant "Magenta" has RGBA8888 code {@code F500F5FF}, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9091779, saturation 0.9090322, and chroma 0.31098264.
    +348     * This color constant "Magenta" has RGBA8888 code {@code F500F5FF}, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9119308, saturation 0.96295136, and chroma 0.31098264.
     349     * It can be represented as a packed float with the constant {@code -0x1.d54326p125F}.
     350     * <pre>
     351     * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -370,43 +370,43 @@
     357    static { NAMED.put("Magenta", -0x1.d54326p125F); LIST.add(-0x1.d54326p125F); }
     358
     359    /**
    -360     * This color constant "Bubblegum Pink" has RGBA8888 code {@code FD81FFFF}, L 0.7176471, A 0.5803922, B 0.44313726, alpha 1.0, hue 0.9020082, saturation 0.881125, and chroma 0.19616999.
    -361     * It can be represented as a packed float with the constant {@code -0x1.e3296ep125F}.
    +360     * This color constant "Bubblegum Pink" has RGBA8888 code {@code FD81FFFF}, L 0.72156864, A 0.5803922, B 0.44313726, alpha 1.0, hue 0.90640444, saturation 0.97072536, and chroma 0.19616999.
    +361     * It can be represented as a packed float with the constant {@code -0x1.e3297p125F}.
     362     * <pre>
     363     * <font style='background-color: #FD81FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FD81FF; color: #000000'>&nbsp;@&nbsp;</font>
     364     * <font style='background-color: #FD81FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FD81FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FD81FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FD81FF'>&nbsp;@&nbsp;</font><font style='background-color: #FD81FF; color: #888888'>&nbsp;@&nbsp;</font>
     365     * <font style='background-color: #FD81FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FD81FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     366     * </pre>
     367     */
    -368    public static final float BUBBLEGUM_PINK = -0x1.e3296ep125F;
    -369    static { NAMED.put("Bubblegum Pink", -0x1.e3296ep125F); LIST.add(-0x1.e3296ep125F); }
    +368    public static final float BUBBLEGUM_PINK = -0x1.e3297p125F;
    +369    static { NAMED.put("Bubblegum Pink", -0x1.e3297p125F); LIST.add(-0x1.e3297p125F); }
     370
     371    /**
    -372     * This color constant "Pork Chop" has RGBA8888 code {@code FFC0CBFF}, L 0.81960785, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.010589795, saturation 0.53777516, and chroma 0.058723815.
    -373     * It can be represented as a packed float with the constant {@code -0x1.010fa2p126F}.
    +372     * This color constant "Pork Chop" has RGBA8888 code {@code FFC0CBFF}, L 0.827451, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.019803474, saturation 0.89580643, and chroma 0.058723815.
    +373     * It can be represented as a packed float with the constant {@code -0x1.010fa6p126F}.
     374     * <pre>
     375     * <font style='background-color: #FFC0CB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFC0CB; color: #000000'>&nbsp;@&nbsp;</font>
     376     * <font style='background-color: #FFC0CB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFC0CB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFC0CB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFC0CB'>&nbsp;@&nbsp;</font><font style='background-color: #FFC0CB; color: #888888'>&nbsp;@&nbsp;</font>
     377     * <font style='background-color: #FFC0CB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFC0CB; color: #ffffff'>&nbsp;@&nbsp;</font>
     378     * </pre>
     379     */
    -380    public static final float PORK_CHOP = -0x1.010fa2p126F;
    -381    static { NAMED.put("Pork Chop", -0x1.010fa2p126F); LIST.add(-0x1.010fa2p126F); }
    +380    public static final float PORK_CHOP = -0x1.010fa6p126F;
    +381    static { NAMED.put("Pork Chop", -0x1.010fa6p126F); LIST.add(-0x1.010fa6p126F); }
     382
     383    /**
    -384     * This color constant "Raw Meat" has RGBA8888 code {@code FF8181FF}, L 0.6745098, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.05119568, saturation 0.77551675, and chroma 0.13587911.
    -385     * It can be represented as a packed float with the constant {@code -0x1.0b2158p126F}.
    +384     * This color constant "Raw Meat" has RGBA8888 code {@code FF8181FF}, L 0.6784314, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.053987134, saturation 0.9744733, and chroma 0.13587911.
    +385     * It can be represented as a packed float with the constant {@code -0x1.0b215ap126F}.
     386     * <pre>
     387     * <font style='background-color: #FF8181;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF8181; color: #000000'>&nbsp;@&nbsp;</font>
     388     * <font style='background-color: #FF8181;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF8181'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF8181'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF8181'>&nbsp;@&nbsp;</font><font style='background-color: #FF8181; color: #888888'>&nbsp;@&nbsp;</font>
     389     * <font style='background-color: #FF8181;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF8181; color: #ffffff'>&nbsp;@&nbsp;</font>
     390     * </pre>
     391     */
    -392    public static final float RAW_MEAT = -0x1.0b2158p126F;
    -393    static { NAMED.put("Raw Meat", -0x1.0b2158p126F); LIST.add(-0x1.0b2158p126F); }
    +392    public static final float RAW_MEAT = -0x1.0b215ap126F;
    +393    static { NAMED.put("Raw Meat", -0x1.0b215ap126F); LIST.add(-0x1.0b215ap126F); }
     394
     395    /**
    -396     * This color constant "Red" has RGBA8888 code {@code FF0000FF}, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.07928106, saturation 0.8972241, and chroma 0.25345513.
    +396     * This color constant "Red" has RGBA8888 code {@code FF0000FF}, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.08024464, saturation 0.98868626, and chroma 0.25345513.
     397     * It can be represented as a packed float with the constant {@code -0x1.1f3904p126F}.
     398     * <pre>
     399     * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -418,55 +418,55 @@
     405    static { NAMED.put("Red", -0x1.1f3904p126F); LIST.add(-0x1.1f3904p126F); }
     406
     407    /**
    -408     * This color constant "Putty" has RGBA8888 code {@code BF3F3FFF}, L 0.44313726, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.06128862, saturation 0.408064, and chroma 0.15595676.
    -409     * It can be represented as a packed float with the constant {@code -0x1.0f24e2p126F}.
    +408     * This color constant "Putty" has RGBA8888 code {@code BF3F3FFF}, L 0.4392157, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.063416936, saturation 0.6871843, and chroma 0.15595676.
    +409     * It can be represented as a packed float with the constant {@code -0x1.0f24ep126F}.
     410     * <pre>
     411     * <font style='background-color: #BF3F3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BF3F3F; color: #000000'>&nbsp;@&nbsp;</font>
     412     * <font style='background-color: #BF3F3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BF3F3F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BF3F3F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BF3F3F'>&nbsp;@&nbsp;</font><font style='background-color: #BF3F3F; color: #888888'>&nbsp;@&nbsp;</font>
     413     * <font style='background-color: #BF3F3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BF3F3F; color: #ffffff'>&nbsp;@&nbsp;</font>
     414     * </pre>
     415     */
    -416    public static final float PUTTY = -0x1.0f24e2p126F;
    -417    static { NAMED.put("Putty", -0x1.0f24e2p126F); LIST.add(-0x1.0f24e2p126F); }
    +416    public static final float PUTTY = -0x1.0f24ep126F;
    +417    static { NAMED.put("Putty", -0x1.0f24ep126F); LIST.add(-0x1.0f24ep126F); }
     418
     419    /**
    -420     * This color constant "Sienna" has RGBA8888 code {@code 7F0000FF}, L 0.24705882, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.07915777, saturation 0.8381556, and chroma 0.1555649.
    -421     * It can be represented as a packed float with the constant {@code -0x1.13227ep126F}.
    +420     * This color constant "Sienna" has RGBA8888 code {@code 7F0000FF}, L 0.24313726, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.080711745, saturation 0.9805362, and chroma 0.1555649.
    +421     * It can be represented as a packed float with the constant {@code -0x1.13227cp126F}.
     422     * <pre>
     423     * <font style='background-color: #7F0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F0000; color: #000000'>&nbsp;@&nbsp;</font>
     424     * <font style='background-color: #7F0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7F0000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7F0000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7F0000'>&nbsp;@&nbsp;</font><font style='background-color: #7F0000; color: #888888'>&nbsp;@&nbsp;</font>
     425     * <font style='background-color: #7F0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F0000; color: #ffffff'>&nbsp;@&nbsp;</font>
     426     * </pre>
     427     */
    -428    public static final float SIENNA = -0x1.13227ep126F;
    -429    static { NAMED.put("Sienna", -0x1.13227ep126F); LIST.add(-0x1.13227ep126F); }
    +428    public static final float SIENNA = -0x1.13227cp126F;
    +429    static { NAMED.put("Sienna", -0x1.13227cp126F); LIST.add(-0x1.13227cp126F); }
     430
     431    /**
    -432     * This color constant "Seal Brown" has RGBA8888 code {@code 551414FF}, L 0.17254902, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.07099588, saturation 0.4878964, and chroma 0.09959023.
    -433     * It can be represented as a packed float with the constant {@code -0x1.0b1658p126F}.
    +432     * This color constant "Seal Brown" has RGBA8888 code {@code 551414FF}, L 0.16862746, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.073790275, saturation 0.7892004, and chroma 0.09959023.
    +433     * It can be represented as a packed float with the constant {@code -0x1.0b1656p126F}.
     434     * <pre>
     435     * <font style='background-color: #551414;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #551414; color: #000000'>&nbsp;@&nbsp;</font>
     436     * <font style='background-color: #551414;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #551414'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #551414'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #551414'>&nbsp;@&nbsp;</font><font style='background-color: #551414; color: #888888'>&nbsp;@&nbsp;</font>
     437     * <font style='background-color: #551414;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #551414; color: #ffffff'>&nbsp;@&nbsp;</font>
     438     * </pre>
     439     */
    -440    public static final float SEAL_BROWN = -0x1.0b1658p126F;
    -441    static { NAMED.put("Seal Brown", -0x1.0b1658p126F); LIST.add(-0x1.0b1658p126F); }
    +440    public static final float SEAL_BROWN = -0x1.0b1656p126F;
    +441    static { NAMED.put("Seal Brown", -0x1.0b1656p126F); LIST.add(-0x1.0b1656p126F); }
     442
     443    /**
    -444     * This color constant "Mummy Brown" has RGBA8888 code {@code 7F3F00FF}, L 0.3254902, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15801254, saturation 0.7598891, and chroma 0.107261956.
    -445     * It can be represented as a packed float with the constant {@code -0x1.170ea6p126F}.
    +444     * This color constant "Mummy Brown" has RGBA8888 code {@code 7F3F00FF}, L 0.32156864, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15640444, saturation 0.93046486, and chroma 0.107261956.
    +445     * It can be represented as a packed float with the constant {@code -0x1.170ea4p126F}.
     446     * <pre>
     447     * <font style='background-color: #7F3F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F3F00; color: #000000'>&nbsp;@&nbsp;</font>
     448     * <font style='background-color: #7F3F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7F3F00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7F3F00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7F3F00'>&nbsp;@&nbsp;</font><font style='background-color: #7F3F00; color: #888888'>&nbsp;@&nbsp;</font>
     449     * <font style='background-color: #7F3F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F3F00; color: #ffffff'>&nbsp;@&nbsp;</font>
     450     * </pre>
     451     */
    -452    public static final float MUMMY_BROWN = -0x1.170ea6p126F;
    -453    static { NAMED.put("Mummy Brown", -0x1.170ea6p126F); LIST.add(-0x1.170ea6p126F); }
    +452    public static final float MUMMY_BROWN = -0x1.170ea4p126F;
    +453    static { NAMED.put("Mummy Brown", -0x1.170ea4p126F); LIST.add(-0x1.170ea4p126F); }
     454
     455    /**
    -456     * This color constant "Fawn" has RGBA8888 code {@code BF7F3FFF}, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18403731, saturation 0.4331543, and chroma 0.106691405.
    +456     * This color constant "Fawn" has RGBA8888 code {@code BF7F3FFF}, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18118605, saturation 0.6984303, and chroma 0.106691405.
     457     * It can be represented as a packed float with the constant {@code -0x1.190b22p126F}.
     458     * <pre>
     459     * <font style='background-color: #BF7F3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BF7F3F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -478,67 +478,67 @@
     465    static { NAMED.put("Fawn", -0x1.190b22p126F); LIST.add(-0x1.190b22p126F); }
     466
     467    /**
    -468     * This color constant "Orange" has RGBA8888 code {@code FF7F00FF}, L 0.6509804, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.15541562, saturation 0.8137945, and chroma 0.17443058.
    -469     * It can be represented as a packed float with the constant {@code -0x1.25194cp126F}.
    +468     * This color constant "Orange" has RGBA8888 code {@code FF7F00FF}, L 0.654902, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.1544865, saturation 0.979648, and chroma 0.17443058.
    +469     * It can be represented as a packed float with the constant {@code -0x1.25194ep126F}.
     470     * <pre>
     471     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #000000'>&nbsp;@&nbsp;</font>
     472     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #FF7F00; color: #888888'>&nbsp;@&nbsp;</font>
     473     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #ffffff'>&nbsp;@&nbsp;</font>
     474     * </pre>
     475     */
    -476    public static final float ORANGE = -0x1.25194cp126F;
    -477    static { NAMED.put("Orange", -0x1.25194cp126F); LIST.add(-0x1.25194cp126F); }
    +476    public static final float ORANGE = -0x1.25194ep126F;
    +477    static { NAMED.put("Orange", -0x1.25194ep126F); LIST.add(-0x1.25194ep126F); }
     478
     479    /**
    -480     * This color constant "Peach" has RGBA8888 code {@code FFBF81FF}, L 0.79607844, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.19064914, saturation 0.6557377, and chroma 0.096477255.
    -481     * It can be represented as a packed float with the constant {@code -0x1.170996p126F}.
    +480     * This color constant "Peach" has RGBA8888 code {@code FFBF81FF}, L 0.8039216, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.1871773, saturation 0.962963, and chroma 0.096477255.
    +481     * It can be represented as a packed float with the constant {@code -0x1.17099ap126F}.
     482     * <pre>
     483     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #000000'>&nbsp;@&nbsp;</font>
     484     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #FFBF81; color: #888888'>&nbsp;@&nbsp;</font>
     485     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #ffffff'>&nbsp;@&nbsp;</font>
     486     * </pre>
     487     */
    -488    public static final float PEACH = -0x1.170996p126F;
    -489    static { NAMED.put("Peach", -0x1.170996p126F); LIST.add(-0x1.170996p126F); }
    +488    public static final float PEACH = -0x1.17099ap126F;
    +489    static { NAMED.put("Peach", -0x1.17099ap126F); LIST.add(-0x1.17099ap126F); }
     490
     491    /**
    -492     * This color constant "Cream" has RGBA8888 code {@code FFFFBFFF}, L 0.9647059, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.31215638, saturation 0.8888889, and chroma 0.071815535.
    -493     * It can be represented as a packed float with the constant {@code -0x1.10f9ecp126F}.
    +492     * This color constant "Cream" has RGBA8888 code {@code FFFFBFFF}, L 0.972549, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.30119568, saturation 1.1858541, and chroma 0.071815535.
    +493     * It can be represented as a packed float with the constant {@code -0x1.10f9fp126F}.
     494     * <pre>
     495     * <font style='background-color: #FFFFBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFBF; color: #000000'>&nbsp;@&nbsp;</font>
     496     * <font style='background-color: #FFFFBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFFBF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFFBF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFFBF'>&nbsp;@&nbsp;</font><font style='background-color: #FFFFBF; color: #888888'>&nbsp;@&nbsp;</font>
     497     * <font style='background-color: #FFFFBF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFBF; color: #ffffff'>&nbsp;@&nbsp;</font>
     498     * </pre>
     499     */
    -500    public static final float CREAM = -0x1.10f9ecp126F;
    -501    static { NAMED.put("Cream", -0x1.10f9ecp126F); LIST.add(-0x1.10f9ecp126F); }
    +500    public static final float CREAM = -0x1.10f9fp126F;
    +501    static { NAMED.put("Cream", -0x1.10f9fp126F); LIST.add(-0x1.10f9fp126F); }
     502
     503    /**
    -504     * This color constant "Yellow" has RGBA8888 code {@code FFFF00FF}, L 0.92941177, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.30886024, saturation 0.92988807, and chroma 0.20529193.
    -505     * It can be represented as a packed float with the constant {@code -0x1.30eddap126F}.
    +504     * This color constant "Yellow" has RGBA8888 code {@code FFFF00FF}, L 0.9411765, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.3049839, saturation 1.3285329, and chroma 0.20529193.
    +505     * It can be represented as a packed float with the constant {@code -0x1.30edep126F}.
     506     * <pre>
     507     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #000000'>&nbsp;@&nbsp;</font>
     508     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #FFFF00; color: #888888'>&nbsp;@&nbsp;</font>
     509     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #ffffff'>&nbsp;@&nbsp;</font>
     510     * </pre>
     511     */
    -512    public static final float YELLOW = -0x1.30eddap126F;
    -513    static { NAMED.put("Yellow", -0x1.30eddap126F); LIST.add(-0x1.30eddap126F); }
    +512    public static final float YELLOW = -0x1.30edep126F;
    +513    static { NAMED.put("Yellow", -0x1.30edep126F); LIST.add(-0x1.30edep126F); }
     514
     515    /**
    -516     * This color constant "Earwax" has RGBA8888 code {@code BFBF3FFF}, L 0.72156864, A 0.4745098, B 0.5686275, alpha 1.0, hue 0.30658844, saturation 0.59262407, and chroma 0.14584495.
    -517     * It can be represented as a packed float with the constant {@code -0x1.22f37p126F}.
    +516     * This color constant "Earwax" has RGBA8888 code {@code BFBF3FFF}, L 0.7254902, A 0.4745098, B 0.5686275, alpha 1.0, hue 0.30119568, saturation 0.824942, and chroma 0.14584495.
    +517     * It can be represented as a packed float with the constant {@code -0x1.22f372p126F}.
     518     * <pre>
     519     * <font style='background-color: #BFBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BFBF3F; color: #000000'>&nbsp;@&nbsp;</font>
     520     * <font style='background-color: #BFBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BFBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BFBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BFBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #BFBF3F; color: #888888'>&nbsp;@&nbsp;</font>
     521     * <font style='background-color: #BFBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BFBF3F; color: #ffffff'>&nbsp;@&nbsp;</font>
     522     * </pre>
     523     */
    -524    public static final float EARWAX = -0x1.22f37p126F;
    -525    static { NAMED.put("Earwax", -0x1.22f37p126F); LIST.add(-0x1.22f37p126F); }
    +524    public static final float EARWAX = -0x1.22f372p126F;
    +525    static { NAMED.put("Earwax", -0x1.22f372p126F); LIST.add(-0x1.22f372p126F); }
     526
     527    /**
    -528     * This color constant "Umber" has RGBA8888 code {@code 7F7F00FF}, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.31318712, saturation 0.76235455, and chroma 0.13131043.
    +528     * This color constant "Umber" has RGBA8888 code {@code 7F7F00FF}, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.30708748, saturation 0.9493337, and chroma 0.13131043.
     529     * It can be represented as a packed float with the constant {@code -0x1.1ef2f8p126F}.
     530     * <pre>
     531     * <font style='background-color: #7F7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F7F00; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -550,7 +550,7 @@
     537    static { NAMED.put("Umber", -0x1.1ef2f8p126F); LIST.add(-0x1.1ef2f8p126F); }
     538
     539    /**
    -540     * This color constant "Ivy Green" has RGBA8888 code {@code 007F00FF}, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.4036119, saturation 1.0868253, and chroma 0.18528971.
    +540     * This color constant "Ivy Green" has RGBA8888 code {@code 007F00FF}, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.3989195, saturation 0.98336864, and chroma 0.18528971.
     541     * It can be represented as a packed float with the constant {@code -0x1.1ad8d2p126F}.
     542     * <pre>
     543     * <font style='background-color: #007F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F00; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -562,79 +562,79 @@
     549    static { NAMED.put("Ivy Green", -0x1.1ad8d2p126F); LIST.add(-0x1.1ad8d2p126F); }
     550
     551    /**
    -552     * This color constant "Jade" has RGBA8888 code {@code 3FBF3FFF}, L 0.6313726, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4055531, saturation 0.71121687, and chroma 0.20259848.
    -553     * It can be represented as a packed float with the constant {@code -0x1.1cd542p126F}.
    +552     * This color constant "Jade" has RGBA8888 code {@code 3FBF3FFF}, L 0.63529414, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4012713, saturation 0.806468, and chroma 0.20259848.
    +553     * It can be represented as a packed float with the constant {@code -0x1.1cd544p126F}.
     554     * <pre>
     555     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #000000'>&nbsp;@&nbsp;</font>
     556     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #3FBF3F; color: #888888'>&nbsp;@&nbsp;</font>
     557     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #ffffff'>&nbsp;@&nbsp;</font>
     558     * </pre>
     559     */
    -560    public static final float JADE = -0x1.1cd542p126F;
    -561    static { NAMED.put("Jade", -0x1.1cd542p126F); LIST.add(-0x1.1cd542p126F); }
    +560    public static final float JADE = -0x1.1cd544p126F;
    +561    static { NAMED.put("Jade", -0x1.1cd544p126F); LIST.add(-0x1.1cd544p126F); }
     562
     563    /**
    -564     * This color constant "Green" has RGBA8888 code {@code 00FF00FF}, L 0.8, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39883053, saturation 0.9818446, and chroma 0.29610303.
    -565     * It can be represented as a packed float with the constant {@code -0x1.2cc398p126F}.
    +564     * This color constant "Green" has RGBA8888 code {@code 00FF00FF}, L 0.80784315, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39588714, saturation 1.0080564, and chroma 0.29610303.
    +565     * It can be represented as a packed float with the constant {@code -0x1.2cc39cp126F}.
     566     * <pre>
     567     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #000000'>&nbsp;@&nbsp;</font>
     568     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #00FF00; color: #888888'>&nbsp;@&nbsp;</font>
     569     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #ffffff'>&nbsp;@&nbsp;</font>
     570     * </pre>
     571     */
    -572    public static final float GREEN = -0x1.2cc398p126F;
    -573    static { NAMED.put("Green", -0x1.2cc398p126F); LIST.add(-0x1.2cc398p126F); }
    +572    public static final float GREEN = -0x1.2cc39cp126F;
    +573    static { NAMED.put("Green", -0x1.2cc39cp126F); LIST.add(-0x1.2cc39cp126F); }
     574
     575    /**
    -576     * This color constant "Celadon" has RGBA8888 code {@code AFFFAFFF}, L 0.8862745, A 0.44705883, B 0.53333336, alpha 1.0, hue 0.41055703, saturation 0.96378696, and chroma 0.12463325.
    -577     * It can be represented as a packed float with the constant {@code -0x1.10e5c4p126F}.
    +576     * This color constant "Celadon" has RGBA8888 code {@code AFFFAFFF}, L 0.89411765, A 0.44705883, B 0.53333336, alpha 1.0, hue 0.4036119, saturation 1.0540925, and chroma 0.12463325.
    +577     * It can be represented as a packed float with the constant {@code -0x1.10e5c8p126F}.
     578     * <pre>
     579     * <font style='background-color: #AFFFAF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AFFFAF; color: #000000'>&nbsp;@&nbsp;</font>
     580     * <font style='background-color: #AFFFAF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AFFFAF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AFFFAF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AFFFAF'>&nbsp;@&nbsp;</font><font style='background-color: #AFFFAF; color: #888888'>&nbsp;@&nbsp;</font>
     581     * <font style='background-color: #AFFFAF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AFFFAF; color: #ffffff'>&nbsp;@&nbsp;</font>
     582     * </pre>
     583     */
    -584    public static final float CELADON = -0x1.10e5c4p126F;
    -585    static { NAMED.put("Celadon", -0x1.10e5c4p126F); LIST.add(-0x1.10e5c4p126F); }
    +584    public static final float CELADON = -0x1.10e5c8p126F;
    +585    static { NAMED.put("Celadon", -0x1.10e5c8p126F); LIST.add(-0x1.10e5c8p126F); }
     586
     587    /**
    -588     * This color constant "Puce" has RGBA8888 code {@code BCAFC0FF}, L 0.70980394, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.83601886, saturation 0.025520736, and chroma 0.022777155.
    -589     * It can be represented as a packed float with the constant {@code -0x1.fb036ap125F}.
    +588     * This color constant "Puce" has RGBA8888 code {@code BCAFC0FF}, L 0.7176471, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.875, saturation 0.13797206, and chroma 0.022777155.
    +589     * It can be represented as a packed float with the constant {@code -0x1.fb036ep125F}.
     590     * <pre>
     591     * <font style='background-color: #BCAFC0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BCAFC0; color: #000000'>&nbsp;@&nbsp;</font>
     592     * <font style='background-color: #BCAFC0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BCAFC0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BCAFC0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BCAFC0'>&nbsp;@&nbsp;</font><font style='background-color: #BCAFC0; color: #888888'>&nbsp;@&nbsp;</font>
     593     * <font style='background-color: #BCAFC0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BCAFC0; color: #ffffff'>&nbsp;@&nbsp;</font>
     594     * </pre>
     595     */
    -596    public static final float PUCE = -0x1.fb036ap125F;
    -597    static { NAMED.put("Puce", -0x1.fb036ap125F); LIST.add(-0x1.fb036ap125F); }
    +596    public static final float PUCE = -0x1.fb036ep125F;
    +597    static { NAMED.put("Puce", -0x1.fb036ep125F); LIST.add(-0x1.fb036ep125F); }
     598
     599    /**
    -600     * This color constant "Beige" has RGBA8888 code {@code CBAA89FF}, L 0.69803923, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.19157475, saturation 0.08972135, and chroma 0.054407768.
    -601     * It can be represented as a packed float with the constant {@code -0x1.0d0564p126F}.
    +600     * This color constant "Beige" has RGBA8888 code {@code CBAA89FF}, L 0.7019608, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.18556869, saturation 0.3384788, and chroma 0.054407768.
    +601     * It can be represented as a packed float with the constant {@code -0x1.0d0566p126F}.
     602     * <pre>
     603     * <font style='background-color: #CBAA89;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CBAA89; color: #000000'>&nbsp;@&nbsp;</font>
     604     * <font style='background-color: #CBAA89;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #CBAA89'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #CBAA89'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #CBAA89'>&nbsp;@&nbsp;</font><font style='background-color: #CBAA89; color: #888888'>&nbsp;@&nbsp;</font>
     605     * <font style='background-color: #CBAA89;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CBAA89; color: #ffffff'>&nbsp;@&nbsp;</font>
     606     * </pre>
     607     */
    -608    public static final float BEIGE = -0x1.0d0564p126F;
    -609    static { NAMED.put("Beige", -0x1.0d0564p126F); LIST.add(-0x1.0d0564p126F); }
    +608    public static final float BEIGE = -0x1.0d0566p126F;
    +609    static { NAMED.put("Beige", -0x1.0d0566p126F); LIST.add(-0x1.0d0566p126F); }
     610
     611    /**
    -612     * This color constant "Wet Stone" has RGBA8888 code {@code A6A090FF}, L 0.63529414, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.28142345, saturation 0.014394464, and chroma 0.019918045.
    -613     * It can be represented as a packed float with the constant {@code -0x1.04ff44p126F}.
    +612     * This color constant "Wet Stone" has RGBA8888 code {@code A6A090FF}, L 0.6392157, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.25, saturation 0.15, and chroma 0.019918045.
    +613     * It can be represented as a packed float with the constant {@code -0x1.04ff46p126F}.
     614     * <pre>
     615     * <font style='background-color: #A6A090;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A6A090; color: #000000'>&nbsp;@&nbsp;</font>
     616     * <font style='background-color: #A6A090;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #A6A090'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #A6A090'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #A6A090'>&nbsp;@&nbsp;</font><font style='background-color: #A6A090; color: #888888'>&nbsp;@&nbsp;</font>
     617     * <font style='background-color: #A6A090;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A6A090; color: #ffffff'>&nbsp;@&nbsp;</font>
     618     * </pre>
     619     */
    -620    public static final float WET_STONE = -0x1.04ff44p126F;
    -621    static { NAMED.put("Wet Stone", -0x1.04ff44p126F); LIST.add(-0x1.04ff44p126F); }
    +620    public static final float WET_STONE = -0x1.04ff46p126F;
    +621    static { NAMED.put("Wet Stone", -0x1.04ff46p126F); LIST.add(-0x1.04ff46p126F); }
     622
     623    /**
    -624     * This color constant "Slow Creek" has RGBA8888 code {@code 7E9494FF}, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5644313, saturation 0.05491124, and chroma 0.029749114.
    +624     * This color constant "Slow Creek" has RGBA8888 code {@code 7E9494FF}, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5511957, saturation 0.20401792, and chroma 0.029749114.
     625     * It can be represented as a packed float with the constant {@code -0x1.fcf924p125F}.
     626     * <pre>
     627     * <font style='background-color: #7E9494;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7E9494; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -646,7 +646,7 @@
     633    static { NAMED.put("Slow Creek", -0x1.fcf924p125F); LIST.add(-0x1.fcf924p125F); }
     634
     635    /**
    -636     * This color constant "Slate Gray" has RGBA8888 code {@code 6E8287FF}, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59872866, saturation 0.07457798, and chroma 0.033602834.
    +636     * This color constant "Slate Gray" has RGBA8888 code {@code 6E8287FF}, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59359556, saturation 0.24037008, and chroma 0.033602834.
     637     * It can be represented as a packed float with the constant {@code -0x1.faf902p125F}.
     638     * <pre>
     639     * <font style='background-color: #6E8287;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #6E8287; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -658,7 +658,7 @@
     645    static { NAMED.put("Slate Gray", -0x1.faf902p125F); LIST.add(-0x1.faf902p125F); }
     646
     647    /**
    -648     * This color constant "Light Skin 1" has RGBA8888 code {@code 7E6E60FF}, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.0229381, and chroma 0.022777155.
    +648     * This color constant "Light Skin 1" has RGBA8888 code {@code 7E6E60FF}, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.18976586, and chroma 0.022777155.
     649     * It can be represented as a packed float with the constant {@code -0x1.0502e8p126F}.
     650     * <pre>
     651     * <font style='background-color: #7E6E60;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7E6E60; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -670,7 +670,7 @@
     657    static { NAMED.put("Light Skin 1", -0x1.0502e8p126F); LIST.add(-0x1.0502e8p126F); }
     658
     659    /**
    -660     * This color constant "Light Skin 2" has RGBA8888 code {@code A0695FFF}, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.078336, and chroma 0.068331465.
    +660     * This color constant "Light Skin 2" has RGBA8888 code {@code A0695FFF}, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.2948119, and chroma 0.068331465.
     661     * It can be represented as a packed float with the constant {@code -0x1.090ef6p126F}.
     662     * <pre>
     663     * <font style='background-color: #A0695F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A0695F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -682,91 +682,91 @@
     669    static { NAMED.put("Light Skin 2", -0x1.090ef6p126F); LIST.add(-0x1.090ef6p126F); }
     670
     671    /**
    -672     * This color constant "Light Skin 3" has RGBA8888 code {@code C07872FF}, L 0.5647059, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.070401505, saturation 0.1291548, and chroma 0.0821242.
    -673     * It can be represented as a packed float with the constant {@code -0x1.09132p126F}.
    +672     * This color constant "Light Skin 3" has RGBA8888 code {@code C07872FF}, L 0.5686275, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.073790275, saturation 0.39929786, and chroma 0.0821242.
    +673     * It can be represented as a packed float with the constant {@code -0x1.091322p126F}.
     674     * <pre>
     675     * <font style='background-color: #C07872;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C07872; color: #000000'>&nbsp;@&nbsp;</font>
     676     * <font style='background-color: #C07872;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C07872'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C07872'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C07872'>&nbsp;@&nbsp;</font><font style='background-color: #C07872; color: #888888'>&nbsp;@&nbsp;</font>
     677     * <font style='background-color: #C07872;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C07872; color: #ffffff'>&nbsp;@&nbsp;</font>
     678     * </pre>
     679     */
    -680    public static final float LIGHT_SKIN_3 = -0x1.09132p126F;
    -681    static { NAMED.put("Light Skin 3", -0x1.09132p126F); LIST.add(-0x1.09132p126F); }
    +680    public static final float LIGHT_SKIN_3 = -0x1.091322p126F;
    +681    static { NAMED.put("Light Skin 3", -0x1.091322p126F); LIST.add(-0x1.091322p126F); }
     682
     683    /**
    -684     * This color constant "Light Skin 4" has RGBA8888 code {@code D08A74FF}, L 0.62352943, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.10391619, saturation 0.1947072, and chroma 0.0835974.
    -685     * It can be represented as a packed float with the constant {@code -0x1.0d113ep126F}.
    +684     * This color constant "Light Skin 4" has RGBA8888 code {@code D08A74FF}, L 0.627451, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.105220385, saturation 0.49572846, and chroma 0.0835974.
    +685     * It can be represented as a packed float with the constant {@code -0x1.0d114p126F}.
     686     * <pre>
     687     * <font style='background-color: #D08A74;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D08A74; color: #000000'>&nbsp;@&nbsp;</font>
     688     * <font style='background-color: #D08A74;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D08A74'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D08A74'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D08A74'>&nbsp;@&nbsp;</font><font style='background-color: #D08A74; color: #888888'>&nbsp;@&nbsp;</font>
     689     * <font style='background-color: #D08A74;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D08A74; color: #ffffff'>&nbsp;@&nbsp;</font>
     690     * </pre>
     691     */
    -692    public static final float LIGHT_SKIN_4 = -0x1.0d113ep126F;
    -693    static { NAMED.put("Light Skin 4", -0x1.0d113ep126F); LIST.add(-0x1.0d113ep126F); }
    +692    public static final float LIGHT_SKIN_4 = -0x1.0d114p126F;
    +693    static { NAMED.put("Light Skin 4", -0x1.0d114p126F); LIST.add(-0x1.0d114p126F); }
     694
     695    /**
    -696     * This color constant "Light Skin 5" has RGBA8888 code {@code E19B7DFF}, L 0.6862745, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.2743484, and chroma 0.082864076.
    -697     * It can be represented as a packed float with the constant {@code -0x1.0f0f5ep126F}.
    +696     * This color constant "Light Skin 5" has RGBA8888 code {@code E19B7DFF}, L 0.6901961, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.5954583, and chroma 0.082864076.
    +697     * It can be represented as a packed float with the constant {@code -0x1.0f0f6p126F}.
     698     * <pre>
     699     * <font style='background-color: #E19B7D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E19B7D; color: #000000'>&nbsp;@&nbsp;</font>
     700     * <font style='background-color: #E19B7D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E19B7D'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E19B7D'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E19B7D'>&nbsp;@&nbsp;</font><font style='background-color: #E19B7D; color: #888888'>&nbsp;@&nbsp;</font>
     701     * <font style='background-color: #E19B7D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E19B7D; color: #ffffff'>&nbsp;@&nbsp;</font>
     702     * </pre>
     703     */
    -704    public static final float LIGHT_SKIN_5 = -0x1.0f0f5ep126F;
    -705    static { NAMED.put("Light Skin 5", -0x1.0f0f5ep126F); LIST.add(-0x1.0f0f5ep126F); }
    +704    public static final float LIGHT_SKIN_5 = -0x1.0f0f6p126F;
    +705    static { NAMED.put("Light Skin 5", -0x1.0f0f6p126F); LIST.add(-0x1.0f0f6p126F); }
     706
     707    /**
    -708     * This color constant "Light Skin 6" has RGBA8888 code {@code EBAA8CFF}, L 0.73333335, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.30118066, and chroma 0.071815535.
    -709     * It can be represented as a packed float with the constant {@code -0x1.0d0d76p126F}.
    +708     * This color constant "Light Skin 6" has RGBA8888 code {@code EBAA8CFF}, L 0.7372549, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.6386771, and chroma 0.071815535.
    +709     * It can be represented as a packed float with the constant {@code -0x1.0d0d78p126F}.
     710     * <pre>
     711     * <font style='background-color: #EBAA8C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EBAA8C; color: #000000'>&nbsp;@&nbsp;</font>
     712     * <font style='background-color: #EBAA8C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #EBAA8C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #EBAA8C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #EBAA8C'>&nbsp;@&nbsp;</font><font style='background-color: #EBAA8C; color: #888888'>&nbsp;@&nbsp;</font>
     713     * <font style='background-color: #EBAA8C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EBAA8C; color: #ffffff'>&nbsp;@&nbsp;</font>
     714     * </pre>
     715     */
    -716    public static final float LIGHT_SKIN_6 = -0x1.0d0d76p126F;
    -717    static { NAMED.put("Light Skin 6", -0x1.0d0d76p126F); LIST.add(-0x1.0d0d76p126F); }
    +716    public static final float LIGHT_SKIN_6 = -0x1.0d0d78p126F;
    +717    static { NAMED.put("Light Skin 6", -0x1.0d0d78p126F); LIST.add(-0x1.0d0d78p126F); }
     718
     719    /**
    -720     * This color constant "Light Skin 7" has RGBA8888 code {@code F5B99BFF}, L 0.78039217, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.138223, saturation 0.38347107, and chroma 0.06652104.
    -721     * It can be represented as a packed float with the constant {@code -0x1.0d0b8ep126F}.
    +720     * This color constant "Light Skin 7" has RGBA8888 code {@code F5B99BFF}, L 0.7882353, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.13720988, saturation 0.76829535, and chroma 0.06652104.
    +721     * It can be represented as a packed float with the constant {@code -0x1.0d0b92p126F}.
     722     * <pre>
     723     * <font style='background-color: #F5B99B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F5B99B; color: #000000'>&nbsp;@&nbsp;</font>
     724     * <font style='background-color: #F5B99B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F5B99B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F5B99B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F5B99B'>&nbsp;@&nbsp;</font><font style='background-color: #F5B99B; color: #888888'>&nbsp;@&nbsp;</font>
     725     * <font style='background-color: #F5B99B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F5B99B; color: #ffffff'>&nbsp;@&nbsp;</font>
     726     * </pre>
     727     */
    -728    public static final float LIGHT_SKIN_7 = -0x1.0d0b8ep126F;
    -729    static { NAMED.put("Light Skin 7", -0x1.0d0b8ep126F); LIST.add(-0x1.0d0b8ep126F); }
    +728    public static final float LIGHT_SKIN_7 = -0x1.0d0b92p126F;
    +729    static { NAMED.put("Light Skin 7", -0x1.0d0b92p126F); LIST.add(-0x1.0d0b92p126F); }
     730
     731    /**
    -732     * This color constant "Light Skin 8" has RGBA8888 code {@code F6C8AFFF}, L 0.81960785, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.14085212, saturation 0.43699297, and chroma 0.055518243.
    -733     * It can be represented as a packed float with the constant {@code -0x1.0b09a2p126F}.
    +732     * This color constant "Light Skin 8" has RGBA8888 code {@code F6C8AFFF}, L 0.827451, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.13941902, saturation 0.8221316, and chroma 0.055518243.
    +733     * It can be represented as a packed float with the constant {@code -0x1.0b09a6p126F}.
     734     * <pre>
     735     * <font style='background-color: #F6C8AF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F6C8AF; color: #000000'>&nbsp;@&nbsp;</font>
     736     * <font style='background-color: #F6C8AF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F6C8AF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F6C8AF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F6C8AF'>&nbsp;@&nbsp;</font><font style='background-color: #F6C8AF; color: #888888'>&nbsp;@&nbsp;</font>
     737     * <font style='background-color: #F6C8AF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F6C8AF; color: #ffffff'>&nbsp;@&nbsp;</font>
     738     * </pre>
     739     */
    -740    public static final float LIGHT_SKIN_8 = -0x1.0b09a2p126F;
    -741    static { NAMED.put("Light Skin 8", -0x1.0b09a2p126F); LIST.add(-0x1.0b09a2p126F); }
    +740    public static final float LIGHT_SKIN_8 = -0x1.0b09a6p126F;
    +741    static { NAMED.put("Light Skin 8", -0x1.0b09a6p126F); LIST.add(-0x1.0b09a6p126F); }
     742
     743    /**
    -744     * This color constant "Light Skin 9" has RGBA8888 code {@code F5E1D2FF}, L 0.8784314, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.16171224, and chroma 0.022777155.
    -745     * It can be represented as a packed float with the constant {@code -0x1.0503cp126F}.
    +744     * This color constant "Light Skin 9" has RGBA8888 code {@code F5E1D2FF}, L 0.8901961, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.6555548, and chroma 0.022777155.
    +745     * It can be represented as a packed float with the constant {@code -0x1.0503c6p126F}.
     746     * <pre>
     747     * <font style='background-color: #F5E1D2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F5E1D2; color: #000000'>&nbsp;@&nbsp;</font>
     748     * <font style='background-color: #F5E1D2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F5E1D2'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F5E1D2'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F5E1D2'>&nbsp;@&nbsp;</font><font style='background-color: #F5E1D2; color: #888888'>&nbsp;@&nbsp;</font>
     749     * <font style='background-color: #F5E1D2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F5E1D2; color: #ffffff'>&nbsp;@&nbsp;</font>
     750     * </pre>
     751     */
    -752    public static final float LIGHT_SKIN_9 = -0x1.0503cp126F;
    -753    static { NAMED.put("Light Skin 9", -0x1.0503cp126F); LIST.add(-0x1.0503cp126F); }
    +752    public static final float LIGHT_SKIN_9 = -0x1.0503c6p126F;
    +753    static { NAMED.put("Light Skin 9", -0x1.0503c6p126F); LIST.add(-0x1.0503c6p126F); }
     754
     755    /**
    -756     * This color constant "Dark Skin 1" has RGBA8888 code {@code 573B3BFF}, L 0.2627451, A 0.5176471, B 0.5058824, alpha 1.0, hue 0.05119568, saturation 0.04347301, and chroma 0.03705794.
    +756     * This color constant "Dark Skin 1" has RGBA8888 code {@code 573B3BFF}, L 0.2627451, A 0.5176471, B 0.5058824, alpha 1.0, hue 0.060548004, saturation 0.24478021, and chroma 0.03705794.
     757     * It can be represented as a packed float with the constant {@code -0x1.030886p126F}.
     758     * <pre>
     759     * <font style='background-color: #573B3B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #573B3B; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -778,7 +778,7 @@
     765    static { NAMED.put("Dark Skin 1", -0x1.030886p126F); LIST.add(-0x1.030886p126F); }
     766
     767    /**
    -768     * This color constant "Dark Skin 2" has RGBA8888 code {@code 73413CFF}, L 0.31764707, A 0.5294118, B 0.5137255, alpha 1.0, hue 0.06948605, saturation 0.103308514, and chroma 0.064659946.
    +768     * This color constant "Dark Skin 2" has RGBA8888 code {@code 73413CFF}, L 0.31764707, A 0.5294118, B 0.5137255, alpha 1.0, hue 0.073790275, saturation 0.36507234, and chroma 0.064659946.
     769     * It can be represented as a packed float with the constant {@code -0x1.070ea2p126F}.
     770     * <pre>
     771     * <font style='background-color: #73413C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73413C; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -790,7 +790,7 @@
     777    static { NAMED.put("Dark Skin 2", -0x1.070ea2p126F); LIST.add(-0x1.070ea2p126F); }
     778
     779    /**
    -780     * This color constant "Dark Skin 3" has RGBA8888 code {@code 8E5555FF}, L 0.4117647, A 0.53333336, B 0.50980395, alpha 1.0, hue 0.045517046, saturation 0.0917525, and chroma 0.069218926.
    +780     * This color constant "Dark Skin 3" has RGBA8888 code {@code 8E5555FF}, L 0.4117647, A 0.53333336, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.33287132, and chroma 0.069218926.
     781     * It can be represented as a packed float with the constant {@code -0x1.0510d2p126F}.
     782     * <pre>
     783     * <font style='background-color: #8E5555;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8E5555; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -802,79 +802,79 @@
     789    static { NAMED.put("Dark Skin 3", -0x1.0510d2p126F); LIST.add(-0x1.0510d2p126F); }
     790
     791    /**
    -792     * This color constant "Pink Skin 1" has RGBA8888 code {@code AB7373FF}, L 0.5254902, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.05653231, and chroma 0.061763234.
    -793     * It can be represented as a packed float with the constant {@code -0x1.050f0cp126F}.
    +792     * This color constant "Pink Skin 1" has RGBA8888 code {@code AB7373FF}, L 0.5294118, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.2670001, and chroma 0.061763234.
    +793     * It can be represented as a packed float with the constant {@code -0x1.050f0ep126F}.
     794     * <pre>
     795     * <font style='background-color: #AB7373;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB7373; color: #000000'>&nbsp;@&nbsp;</font>
     796     * <font style='background-color: #AB7373;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AB7373'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AB7373'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AB7373'>&nbsp;@&nbsp;</font><font style='background-color: #AB7373; color: #888888'>&nbsp;@&nbsp;</font>
     797     * <font style='background-color: #AB7373;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB7373; color: #ffffff'>&nbsp;@&nbsp;</font>
     798     * </pre>
     799     */
    -800    public static final float PINK_SKIN_1 = -0x1.050f0cp126F;
    -801    static { NAMED.put("Pink Skin 1", -0x1.050f0cp126F); LIST.add(-0x1.050f0cp126F); }
    +800    public static final float PINK_SKIN_1 = -0x1.050f0ep126F;
    +801    static { NAMED.put("Pink Skin 1", -0x1.050f0ep126F); LIST.add(-0x1.050f0ep126F); }
     802
     803    /**
    -804     * This color constant "Pink Skin 2" has RGBA8888 code {@code C78F8FFF}, L 0.6313726, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.1156203, and chroma 0.061763234.
    -805     * It can be represented as a packed float with the constant {@code -0x1.050f42p126F}.
    +804     * This color constant "Pink Skin 2" has RGBA8888 code {@code C78F8FFF}, L 0.63529414, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.3883638, and chroma 0.061763234.
    +805     * It can be represented as a packed float with the constant {@code -0x1.050f44p126F}.
     806     * <pre>
     807     * <font style='background-color: #C78F8F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C78F8F; color: #000000'>&nbsp;@&nbsp;</font>
     808     * <font style='background-color: #C78F8F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C78F8F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C78F8F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C78F8F'>&nbsp;@&nbsp;</font><font style='background-color: #C78F8F; color: #888888'>&nbsp;@&nbsp;</font>
     809     * <font style='background-color: #C78F8F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C78F8F; color: #ffffff'>&nbsp;@&nbsp;</font>
     810     * </pre>
     811     */
    -812    public static final float PINK_SKIN_2 = -0x1.050f42p126F;
    -813    static { NAMED.put("Pink Skin 2", -0x1.050f42p126F); LIST.add(-0x1.050f42p126F); }
    +812    public static final float PINK_SKIN_2 = -0x1.050f44p126F;
    +813    static { NAMED.put("Pink Skin 2", -0x1.050f44p126F); LIST.add(-0x1.050f44p126F); }
     814
     815    /**
    -816     * This color constant "Pink Skin 3" has RGBA8888 code {@code E3ABABFF}, L 0.73333335, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.03609712, saturation 0.17939028, and chroma 0.052115876.
    -817     * It can be represented as a packed float with the constant {@code -0x1.030d76p126F}.
    +816     * This color constant "Pink Skin 3" has RGBA8888 code {@code E3ABABFF}, L 0.7411765, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.044284336, saturation 0.52000785, and chroma 0.052115876.
    +817     * It can be represented as a packed float with the constant {@code -0x1.030d7ap126F}.
     818     * <pre>
     819     * <font style='background-color: #E3ABAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3ABAB; color: #000000'>&nbsp;@&nbsp;</font>
     820     * <font style='background-color: #E3ABAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E3ABAB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E3ABAB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E3ABAB'>&nbsp;@&nbsp;</font><font style='background-color: #E3ABAB; color: #888888'>&nbsp;@&nbsp;</font>
     821     * <font style='background-color: #E3ABAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3ABAB; color: #ffffff'>&nbsp;@&nbsp;</font>
     822     * </pre>
     823     */
    -824    public static final float PINK_SKIN_3 = -0x1.030d76p126F;
    -825    static { NAMED.put("Pink Skin 3", -0x1.030d76p126F); LIST.add(-0x1.030d76p126F); }
    +824    public static final float PINK_SKIN_3 = -0x1.030d7ap126F;
    +825    static { NAMED.put("Pink Skin 3", -0x1.030d7ap126F); LIST.add(-0x1.030d7ap126F); }
     826
     827    /**
    -828     * This color constant "Pink Skin 4" has RGBA8888 code {@code F8D2DAFF}, L 0.85490197, A 0.5176471, B 0.49803922, alpha 1.0, hue 0.9823789, saturation 0.30119374, and chroma 0.0353726.
    -829     * It can be represented as a packed float with the constant {@code -0x1.ff09b4p125F}.
    +828     * This color constant "Pink Skin 4" has RGBA8888 code {@code F8D2DAFF}, L 0.8627451, A 0.5176471, B 0.49803922, alpha 1.0, hue 1.2950972E-5, saturation 0.71428573, and chroma 0.0353726.
    +829     * It can be represented as a packed float with the constant {@code -0x1.ff09b8p125F}.
     830     * <pre>
     831     * <font style='background-color: #F8D2DA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F8D2DA; color: #000000'>&nbsp;@&nbsp;</font>
     832     * <font style='background-color: #F8D2DA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F8D2DA'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F8D2DA'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F8D2DA'>&nbsp;@&nbsp;</font><font style='background-color: #F8D2DA; color: #888888'>&nbsp;@&nbsp;</font>
     833     * <font style='background-color: #F8D2DA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F8D2DA; color: #ffffff'>&nbsp;@&nbsp;</font>
     834     * </pre>
     835     */
    -836    public static final float PINK_SKIN_4 = -0x1.ff09b4p125F;
    -837    static { NAMED.put("Pink Skin 4", -0x1.ff09b4p125F); LIST.add(-0x1.ff09b4p125F); }
    +836    public static final float PINK_SKIN_4 = -0x1.ff09b8p125F;
    +837    static { NAMED.put("Pink Skin 4", -0x1.ff09b8p125F); LIST.add(-0x1.ff09b8p125F); }
     838
     839    /**
    -840     * This color constant "Bronze Skin 4" has RGBA8888 code {@code E3C7ABFF}, L 0.79607844, A 0.5058824, B 0.5176471, alpha 1.0, hue 0.19880433, saturation 0.0852071, and chroma 0.03705794.
    -841     * It can be represented as a packed float with the constant {@code -0x1.090396p126F}.
    +840     * This color constant "Bronze Skin 4" has RGBA8888 code {@code E3C7ABFF}, L 0.8039216, A 0.5058824, B 0.5176471, alpha 1.0, hue 0.189452, saturation 0.3989011, and chroma 0.03705794.
    +841     * It can be represented as a packed float with the constant {@code -0x1.09039ap126F}.
     842     * <pre>
     843     * <font style='background-color: #E3C7AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3C7AB; color: #000000'>&nbsp;@&nbsp;</font>
     844     * <font style='background-color: #E3C7AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E3C7AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E3C7AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E3C7AB'>&nbsp;@&nbsp;</font><font style='background-color: #E3C7AB; color: #888888'>&nbsp;@&nbsp;</font>
     845     * <font style='background-color: #E3C7AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3C7AB; color: #ffffff'>&nbsp;@&nbsp;</font>
     846     * </pre>
     847     */
    -848    public static final float BRONZE_SKIN_4 = -0x1.090396p126F;
    -849    static { NAMED.put("Bronze Skin 4", -0x1.090396p126F); LIST.add(-0x1.090396p126F); }
    +848    public static final float BRONZE_SKIN_4 = -0x1.09039ap126F;
    +849    static { NAMED.put("Bronze Skin 4", -0x1.09039ap126F); LIST.add(-0x1.09039ap126F); }
     850
     851    /**
    -852     * This color constant "Bronze Skin 3" has RGBA8888 code {@code C49E73FF}, L 0.654902, A 0.50980395, B 0.5294118, alpha 1.0, hue 0.19880433, saturation 0.12624669, and chroma 0.061763234.
    -853     * It can be represented as a packed float with the constant {@code -0x1.0f054ep126F}.
    +852     * This color constant "Bronze Skin 3" has RGBA8888 code {@code C49E73FF}, L 0.65882355, A 0.50980395, B 0.5294118, alpha 1.0, hue 0.19291253, saturation 0.3883638, and chroma 0.061763234.
    +853     * It can be represented as a packed float with the constant {@code -0x1.0f055p126F}.
     854     * <pre>
     855     * <font style='background-color: #C49E73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C49E73; color: #000000'>&nbsp;@&nbsp;</font>
     856     * <font style='background-color: #C49E73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C49E73'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C49E73'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C49E73'>&nbsp;@&nbsp;</font><font style='background-color: #C49E73; color: #888888'>&nbsp;@&nbsp;</font>
     857     * <font style='background-color: #C49E73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C49E73; color: #ffffff'>&nbsp;@&nbsp;</font>
     858     * </pre>
     859     */
    -860    public static final float BRONZE_SKIN_3 = -0x1.0f054ep126F;
    -861    static { NAMED.put("Bronze Skin 3", -0x1.0f054ep126F); LIST.add(-0x1.0f054ep126F); }
    +860    public static final float BRONZE_SKIN_3 = -0x1.0f055p126F;
    +861    static { NAMED.put("Bronze Skin 3", -0x1.0f055p126F); LIST.add(-0x1.0f055p126F); }
     862
     863    /**
    -864     * This color constant "Bronze Skin 2" has RGBA8888 code {@code 8F7357FF}, L 0.4862745, A 0.50980395, B 0.52156866, alpha 1.0, hue 0.18210676, saturation 0.103822224, and chroma 0.0471994.
    +864     * This color constant "Bronze Skin 2" has RGBA8888 code {@code 8F7357FF}, L 0.4862745, A 0.50980395, B 0.52156866, alpha 1.0, hue 0.17620972, saturation 0.3626056, and chroma 0.0471994.
     865     * It can be represented as a packed float with the constant {@code -0x1.0b04f8p126F}.
     866     * <pre>
     867     * <font style='background-color: #8F7357;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F7357; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -886,19 +886,19 @@
     873    static { NAMED.put("Bronze Skin 2", -0x1.0b04f8p126F); LIST.add(-0x1.0b04f8p126F); }
     874
     875    /**
    -876     * This color constant "Bronze Skin 1" has RGBA8888 code {@code 73573BFF}, L 0.37254903, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.19157475, saturation 0.19551525, and chroma 0.054407768.
    -877     * It can be represented as a packed float with the constant {@code -0x1.0d04bep126F}.
    +876     * This color constant "Bronze Skin 1" has RGBA8888 code {@code 73573BFF}, L 0.36862746, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.18556869, saturation 0.49134022, and chroma 0.054407768.
    +877     * It can be represented as a packed float with the constant {@code -0x1.0d04bcp126F}.
     878     * <pre>
     879     * <font style='background-color: #73573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73573B; color: #000000'>&nbsp;@&nbsp;</font>
     880     * <font style='background-color: #73573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #73573B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #73573B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #73573B'>&nbsp;@&nbsp;</font><font style='background-color: #73573B; color: #888888'>&nbsp;@&nbsp;</font>
     881     * <font style='background-color: #73573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73573B; color: #ffffff'>&nbsp;@&nbsp;</font>
     882     * </pre>
     883     */
    -884    public static final float BRONZE_SKIN_1 = -0x1.0d04bep126F;
    -885    static { NAMED.put("Bronze Skin 1", -0x1.0d04bep126F); LIST.add(-0x1.0d04bep126F); }
    +884    public static final float BRONZE_SKIN_1 = -0x1.0d04bcp126F;
    +885    static { NAMED.put("Bronze Skin 1", -0x1.0d04bcp126F); LIST.add(-0x1.0d04bcp126F); }
     886
     887    /**
    -888     * This color constant "Taupe" has RGBA8888 code {@code 3B2D1FFF}, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.18556869, saturation 0.12547323, and chroma 0.029749114.
    +888     * This color constant "Taupe" has RGBA8888 code {@code 3B2D1FFF}, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.17620972, saturation 0.4259177, and chroma 0.029749114.
     889     * It can be represented as a packed float with the constant {@code -0x1.07025cp126F}.
     890     * <pre>
     891     * <font style='background-color: #3B2D1F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3B2D1F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -910,19 +910,19 @@
     897    static { NAMED.put("Taupe", -0x1.07025cp126F); LIST.add(-0x1.07025cp126F); }
     898
     899    /**
    -900     * This color constant "Drab Green" has RGBA8888 code {@code 414123FF}, L 0.24705882, A 0.49019608, B 0.52156866, alpha 1.0, hue 0.31789324, saturation 0.20790316, and chroma 0.0471994.
    -901     * It can be represented as a packed float with the constant {@code -0x1.0afa7ep126F}.
    +900     * This color constant "Drab Green" has RGBA8888 code {@code 414123FF}, L 0.24313726, A 0.49019608, B 0.52156866, alpha 1.0, hue 0.30119568, saturation 0.5499613, and chroma 0.0471994.
    +901     * It can be represented as a packed float with the constant {@code -0x1.0afa7cp126F}.
     902     * <pre>
     903     * <font style='background-color: #414123;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #414123; color: #000000'>&nbsp;@&nbsp;</font>
     904     * <font style='background-color: #414123;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #414123'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #414123'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #414123'>&nbsp;@&nbsp;</font><font style='background-color: #414123; color: #888888'>&nbsp;@&nbsp;</font>
     905     * <font style='background-color: #414123;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #414123; color: #ffffff'>&nbsp;@&nbsp;</font>
     906     * </pre>
     907     */
    -908    public static final float DRAB_GREEN = -0x1.0afa7ep126F;
    -909    static { NAMED.put("Drab Green", -0x1.0afa7ep126F); LIST.add(-0x1.0afa7ep126F); }
    +908    public static final float DRAB_GREEN = -0x1.0afa7cp126F;
    +909    static { NAMED.put("Drab Green", -0x1.0afa7cp126F); LIST.add(-0x1.0afa7cp126F); }
     910
     911    /**
    -912     * This color constant "Lizard Scales" has RGBA8888 code {@code 73733BFF}, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.30616736, saturation 0.32533228, and chroma 0.079095535.
    +912     * This color constant "Lizard Scales" has RGBA8888 code {@code 73733BFF}, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.29637668, saturation 0.63274586, and chroma 0.079095535.
     913     * It can be represented as a packed float with the constant {@code -0x1.12f8e4p126F}.
     914     * <pre>
     915     * <font style='background-color: #73733B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73733B; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -934,7 +934,7 @@
     921    static { NAMED.put("Lizard Scales", -0x1.12f8e4p126F); LIST.add(-0x1.12f8e4p126F); }
     922
     923    /**
    -924     * This color constant "Cricket" has RGBA8888 code {@code 8F8F57FF}, L 0.5568628, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.31215638, saturation 0.1962549, and chroma 0.071815535.
    +924     * This color constant "Cricket" has RGBA8888 code {@code 8F8F57FF}, L 0.5568628, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.30119568, saturation 0.48650423, and chroma 0.071815535.
     925     * It can be represented as a packed float with the constant {@code -0x1.10f91cp126F}.
     926     * <pre>
     927     * <font style='background-color: #8F8F57;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F8F57; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -946,103 +946,103 @@
     933    static { NAMED.put("Cricket", -0x1.10f91cp126F); LIST.add(-0x1.10f91cp126F); }
     934
     935    /**
    -936     * This color constant "Olive Oil" has RGBA8888 code {@code A2A255FF}, L 0.62352943, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30935085, saturation 0.3080419, and chroma 0.096477255.
    -937     * It can be represented as a packed float with the constant {@code -0x1.16f73ep126F}.
    +936     * This color constant "Olive Oil" has RGBA8888 code {@code A2A255FF}, L 0.627451, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30119568, saturation 0.6023386, and chroma 0.096477255.
    +937     * It can be represented as a packed float with the constant {@code -0x1.16f74p126F}.
     938     * <pre>
     939     * <font style='background-color: #A2A255;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A2A255; color: #000000'>&nbsp;@&nbsp;</font>
     940     * <font style='background-color: #A2A255;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #A2A255'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #A2A255'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #A2A255'>&nbsp;@&nbsp;</font><font style='background-color: #A2A255; color: #888888'>&nbsp;@&nbsp;</font>
     941     * <font style='background-color: #A2A255;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A2A255; color: #ffffff'>&nbsp;@&nbsp;</font>
     942     * </pre>
     943     */
    -944    public static final float OLIVE_OIL = -0x1.16f73ep126F;
    -945    static { NAMED.put("Olive Oil", -0x1.16f73ep126F); LIST.add(-0x1.16f73ep126F); }
    +944    public static final float OLIVE_OIL = -0x1.16f74p126F;
    +945    static { NAMED.put("Olive Oil", -0x1.16f74p126F); LIST.add(-0x1.16f74p126F); }
     946
     947    /**
    -948     * This color constant "Dun" has RGBA8888 code {@code B5B572FF}, L 0.69411767, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.30616736, saturation 0.18171746, and chroma 0.079095535.
    -949     * It can be represented as a packed float with the constant {@code -0x1.12f962p126F}.
    +948     * This color constant "Dun" has RGBA8888 code {@code B5B572FF}, L 0.7019608, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.29637668, saturation 0.46401364, and chroma 0.079095535.
    +949     * It can be represented as a packed float with the constant {@code -0x1.12f966p126F}.
     950     * <pre>
     951     * <font style='background-color: #B5B572;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B5B572; color: #000000'>&nbsp;@&nbsp;</font>
     952     * <font style='background-color: #B5B572;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B5B572'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B5B572'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B5B572'>&nbsp;@&nbsp;</font><font style='background-color: #B5B572; color: #888888'>&nbsp;@&nbsp;</font>
     953     * <font style='background-color: #B5B572;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B5B572; color: #ffffff'>&nbsp;@&nbsp;</font>
     954     * </pre>
     955     */
    -956    public static final float DUN = -0x1.12f962p126F;
    -957    static { NAMED.put("Dun", -0x1.12f962p126F); LIST.add(-0x1.12f962p126F); }
    +956    public static final float DUN = -0x1.12f966p126F;
    +957    static { NAMED.put("Dun", -0x1.12f966p126F); LIST.add(-0x1.12f966p126F); }
     958
     959    /**
    -960     * This color constant "Corn Silk" has RGBA8888 code {@code C7C78FFF}, L 0.7607843, A 0.4862745, B 0.5294118, alpha 1.0, hue 0.31948605, saturation 0.103308514, and chroma 0.064659946.
    -961     * It can be represented as a packed float with the constant {@code -0x1.0ef984p126F}.
    +960     * This color constant "Corn Silk" has RGBA8888 code {@code C7C78FFF}, L 0.76862746, A 0.4862745, B 0.5294118, alpha 1.0, hue 0.30708748, saturation 0.34873483, and chroma 0.064659946.
    +961     * It can be represented as a packed float with the constant {@code -0x1.0ef988p126F}.
     962     * <pre>
     963     * <font style='background-color: #C7C78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C7C78F; color: #000000'>&nbsp;@&nbsp;</font>
     964     * <font style='background-color: #C7C78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C7C78F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C7C78F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C7C78F'>&nbsp;@&nbsp;</font><font style='background-color: #C7C78F; color: #888888'>&nbsp;@&nbsp;</font>
     965     * <font style='background-color: #C7C78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C7C78F; color: #ffffff'>&nbsp;@&nbsp;</font>
     966     * </pre>
     967     */
    -968    public static final float CORN_SILK = -0x1.0ef984p126F;
    -969    static { NAMED.put("Corn Silk", -0x1.0ef984p126F); LIST.add(-0x1.0ef984p126F); }
    +968    public static final float CORN_SILK = -0x1.0ef988p126F;
    +969    static { NAMED.put("Corn Silk", -0x1.0ef988p126F); LIST.add(-0x1.0ef988p126F); }
     970
     971    /**
    -972     * This color constant "Tan" has RGBA8888 code {@code DADAABFF}, L 0.83137256, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.30842525, saturation 0.06777885, and chroma 0.054407768.
    -973     * It can be represented as a packed float with the constant {@code -0x1.0cfba8p126F}.
    +972     * This color constant "Tan" has RGBA8888 code {@code DADAABFF}, L 0.8392157, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.29428434, saturation 0.2854945, and chroma 0.054407768.
    +973     * It can be represented as a packed float with the constant {@code -0x1.0cfbacp126F}.
     974     * <pre>
     975     * <font style='background-color: #DADAAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DADAAB; color: #000000'>&nbsp;@&nbsp;</font>
     976     * <font style='background-color: #DADAAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #DADAAB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #DADAAB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #DADAAB'>&nbsp;@&nbsp;</font><font style='background-color: #DADAAB; color: #888888'>&nbsp;@&nbsp;</font>
     977     * <font style='background-color: #DADAAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DADAAB; color: #ffffff'>&nbsp;@&nbsp;</font>
     978     * </pre>
     979     */
    -980    public static final float TAN = -0x1.0cfba8p126F;
    -981    static { NAMED.put("Tan", -0x1.0cfba8p126F); LIST.add(-0x1.0cfba8p126F); }
    +980    public static final float TAN = -0x1.0cfbacp126F;
    +981    static { NAMED.put("Tan", -0x1.0cfbacp126F); LIST.add(-0x1.0cfbacp126F); }
     982
     983    /**
    -984     * This color constant "Straw" has RGBA8888 code {@code EDEDC7FF}, L 0.8980392, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.33071172, saturation 0.029941387, and chroma 0.040217306.
    -985     * It can be represented as a packed float with the constant {@code -0x1.08fbcap126F}.
    +984     * This color constant "Straw" has RGBA8888 code {@code EDEDC7FF}, L 0.90588236, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.310548, saturation 0.1923273, and chroma 0.040217306.
    +985     * It can be represented as a packed float with the constant {@code -0x1.08fbcep126F}.
     986     * <pre>
     987     * <font style='background-color: #EDEDC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EDEDC7; color: #000000'>&nbsp;@&nbsp;</font>
     988     * <font style='background-color: #EDEDC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #EDEDC7'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #EDEDC7'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #EDEDC7'>&nbsp;@&nbsp;</font><font style='background-color: #EDEDC7; color: #888888'>&nbsp;@&nbsp;</font>
     989     * <font style='background-color: #EDEDC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EDEDC7; color: #ffffff'>&nbsp;@&nbsp;</font>
     990     * </pre>
     991     */
    -992    public static final float STRAW = -0x1.08fbcap126F;
    -993    static { NAMED.put("Straw", -0x1.08fbcap126F); LIST.add(-0x1.08fbcap126F); }
    +992    public static final float STRAW = -0x1.08fbcep126F;
    +993    static { NAMED.put("Straw", -0x1.08fbcep126F); LIST.add(-0x1.08fbcep126F); }
     994
     995    /**
    -996     * This color constant "Honeydew" has RGBA8888 code {@code C7E3ABFF}, L 0.8352941, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.375, saturation 0.069975674, and chroma 0.071815535.
    -997     * It can be represented as a packed float with the constant {@code -0x1.0cf3aap126F}.
    +996     * This color constant "Honeydew" has RGBA8888 code {@code C7E3ABFF}, L 0.84313726, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.3627901, saturation 0.28811076, and chroma 0.071815535.
    +997     * It can be represented as a packed float with the constant {@code -0x1.0cf3aep126F}.
     998     * <pre>
     999     * <font style='background-color: #C7E3AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C7E3AB; color: #000000'>&nbsp;@&nbsp;</font>
     1000     * <font style='background-color: #C7E3AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C7E3AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C7E3AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C7E3AB'>&nbsp;@&nbsp;</font><font style='background-color: #C7E3AB; color: #888888'>&nbsp;@&nbsp;</font>
     1001     * <font style='background-color: #C7E3AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C7E3AB; color: #ffffff'>&nbsp;@&nbsp;</font>
     1002     * </pre>
     1003     */
    -1004    public static final float HONEYDEW = -0x1.0cf3aap126F;
    -1005    static { NAMED.put("Honeydew", -0x1.0cf3aap126F); LIST.add(-0x1.0cf3aap126F); }
    +1004    public static final float HONEYDEW = -0x1.0cf3aep126F;
    +1005    static { NAMED.put("Honeydew", -0x1.0cf3aep126F); LIST.add(-0x1.0cf3aep126F); }
     1006
     1007    /**
    -1008     * This color constant "Tarnish" has RGBA8888 code {@code ABC78FFF}, L 0.7372549, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3636593, saturation 0.100864, and chroma 0.07753685.
    -1009     * It can be represented as a packed float with the constant {@code -0x1.0ef378p126F}.
    +1008     * This color constant "Tarnish" has RGBA8888 code {@code ABC78FFF}, L 0.74509805, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3524291, saturation 0.35714287, and chroma 0.07753685.
    +1009     * It can be represented as a packed float with the constant {@code -0x1.0ef37cp126F}.
     1010     * <pre>
     1011     * <font style='background-color: #ABC78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABC78F; color: #000000'>&nbsp;@&nbsp;</font>
     1012     * <font style='background-color: #ABC78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABC78F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABC78F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABC78F'>&nbsp;@&nbsp;</font><font style='background-color: #ABC78F; color: #888888'>&nbsp;@&nbsp;</font>
     1013     * <font style='background-color: #ABC78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABC78F; color: #ffffff'>&nbsp;@&nbsp;</font>
     1014     * </pre>
     1015     */
    -1016    public static final float TARNISH = -0x1.0ef378p126F;
    -1017    static { NAMED.put("Tarnish", -0x1.0ef378p126F); LIST.add(-0x1.0ef378p126F); }
    +1016    public static final float TARNISH = -0x1.0ef37cp126F;
    +1017    static { NAMED.put("Tarnish", -0x1.0ef37cp126F); LIST.add(-0x1.0ef37cp126F); }
     1018
     1019    /**
    -1020     * This color constant "Pea Soup" has RGBA8888 code {@code 8EBE55FF}, L 0.6784314, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.36230367, saturation 0.3804915, and chroma 0.13854803.
    -1021     * It can be represented as a packed float with the constant {@code -0x1.1ae95ap126F}.
    +1020     * This color constant "Pea Soup" has RGBA8888 code {@code 8EBE55FF}, L 0.68235296, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.35600415, saturation 0.6594257, and chroma 0.13854803.
    +1021     * It can be represented as a packed float with the constant {@code -0x1.1ae95cp126F}.
     1022     * <pre>
     1023     * <font style='background-color: #8EBE55;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8EBE55; color: #000000'>&nbsp;@&nbsp;</font>
     1024     * <font style='background-color: #8EBE55;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8EBE55'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8EBE55'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8EBE55'>&nbsp;@&nbsp;</font><font style='background-color: #8EBE55; color: #888888'>&nbsp;@&nbsp;</font>
     1025     * <font style='background-color: #8EBE55;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8EBE55; color: #ffffff'>&nbsp;@&nbsp;</font>
     1026     * </pre>
     1027     */
    -1028    public static final float PEA_SOUP = -0x1.1ae95ap126F;
    -1029    static { NAMED.put("Pea Soup", -0x1.1ae95ap126F); LIST.add(-0x1.1ae95ap126F); }
    +1028    public static final float PEA_SOUP = -0x1.1ae95cp126F;
    +1029    static { NAMED.put("Pea Soup", -0x1.1ae95cp126F); LIST.add(-0x1.1ae95cp126F); }
     1030
     1031    /**
    -1032     * This color constant "Marsh" has RGBA8888 code {@code 738F57FF}, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.375, saturation 0.1515024, and chroma 0.082864076.
    +1032     * This color constant "Marsh" has RGBA8888 code {@code 738F57FF}, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.3644131, saturation 0.45234665, and chroma 0.082864076.
     1033     * It can be represented as a packed float with the constant {@code -0x1.0ef10ep126F}.
     1034     * <pre>
     1035     * <font style='background-color: #738F57;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #738F57; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1054,7 +1054,7 @@
     1041    static { NAMED.put("Marsh", -0x1.0ef10ep126F); LIST.add(-0x1.0ef10ep126F); }
     1042
     1043    /**
    -1044     * This color constant "Asparagus" has RGBA8888 code {@code 587D3EFF}, L 0.4509804, A 0.4627451, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.29466382, and chroma 0.104961164.
    +1044     * This color constant "Asparagus" has RGBA8888 code {@code 587D3EFF}, L 0.4509804, A 0.4627451, B 0.5372549, alpha 1.0, hue 0.36663744, saturation 0.62574995, and chroma 0.104961164.
     1045     * It can be represented as a packed float with the constant {@code -0x1.12ece6p126F}.
     1046     * <pre>
     1047     * <font style='background-color: #587D3E;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #587D3E; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1066,19 +1066,19 @@
     1053    static { NAMED.put("Asparagus", -0x1.12ece6p126F); LIST.add(-0x1.12ece6p126F); }
     1054
     1055    /**
    -1056     * This color constant "Peat Bog" has RGBA8888 code {@code 465032FF}, L 0.29803923, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.35914788, saturation 0.16971225, and chroma 0.055518243.
    -1057     * It can be represented as a packed float with the constant {@code -0x1.0af698p126F}.
    +1056     * This color constant "Peat Bog" has RGBA8888 code {@code 465032FF}, L 0.29411766, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.34359556, saturation 0.4973174, and chroma 0.055518243.
    +1057     * It can be represented as a packed float with the constant {@code -0x1.0af696p126F}.
     1058     * <pre>
     1059     * <font style='background-color: #465032;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #465032; color: #000000'>&nbsp;@&nbsp;</font>
     1060     * <font style='background-color: #465032;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #465032'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #465032'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #465032'>&nbsp;@&nbsp;</font><font style='background-color: #465032; color: #888888'>&nbsp;@&nbsp;</font>
     1061     * <font style='background-color: #465032;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #465032; color: #ffffff'>&nbsp;@&nbsp;</font>
     1062     * </pre>
     1063     */
    -1064    public static final float PEAT_BOG = -0x1.0af698p126F;
    -1065    static { NAMED.put("Peat Bog", -0x1.0af698p126F); LIST.add(-0x1.0af698p126F); }
    +1064    public static final float PEAT_BOG = -0x1.0af696p126F;
    +1065    static { NAMED.put("Peat Bog", -0x1.0af696p126F); LIST.add(-0x1.0af696p126F); }
     1066
     1067    /**
    -1068     * This color constant "Deep Jungle" has RGBA8888 code {@code 191E0FFF}, L 0.09411765, A 0.4862745, B 0.5137255, alpha 1.0, hue 0.375, saturation 0.2120065, and chroma 0.038669903.
    +1068     * This color constant "Deep Jungle" has RGBA8888 code {@code 191E0FFF}, L 0.09411765, A 0.4862745, B 0.5137255, alpha 1.0, hue 0.3524291, saturation 0.625, and chroma 0.038669903.
     1069     * It can be represented as a packed float with the constant {@code -0x1.06f83p126F}.
     1070     * <pre>
     1071     * <font style='background-color: #191E0F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #191E0F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1090,7 +1090,7 @@
     1077    static { NAMED.put("Deep Jungle", -0x1.06f83p126F); LIST.add(-0x1.06f83p126F); }
     1078
     1079    /**
    -1080     * This color constant "Pine Green" has RGBA8888 code {@code 235037FF}, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.44383267, saturation 0.5838377, and chroma 0.079095535.
    +1080     * This color constant "Pine Green" has RGBA8888 code {@code 235037FF}, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.43344522, saturation 0.6792316, and chroma 0.079095535.
     1081     * It can be represented as a packed float with the constant {@code -0x1.06ec8ap126F}.
     1082     * <pre>
     1083     * <font style='background-color: #235037;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #235037; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1102,7 +1102,7 @@
     1089    static { NAMED.put("Pine Green", -0x1.06ec8ap126F); LIST.add(-0x1.06ec8ap126F); }
     1090
     1091    /**
    -1092     * This color constant "Olive Green" has RGBA8888 code {@code 3B573BFF}, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.42138404, saturation 0.19425261, and chroma 0.05767509.
    +1092     * This color constant "Olive Green" has RGBA8888 code {@code 3B573BFF}, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.40640444, saturation 0.3795317, and chroma 0.05767509.
     1093     * It can be represented as a packed float with the constant {@code -0x1.06f29ep126F}.
     1094     * <pre>
     1095     * <font style='background-color: #3B573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3B573B; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1114,19 +1114,19 @@
     1101    static { NAMED.put("Olive Green", -0x1.06f29ep126F); LIST.add(-0x1.06f29ep126F); }
     1102
     1103    /**
    -1104     * This color constant "Gray Green" has RGBA8888 code {@code 506450FF}, L 0.3764706, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.41928825, saturation 0.07537778, and chroma 0.040217306.
    -1105     * It can be represented as a packed float with the constant {@code -0x1.04f6cp126F}.
    +1104     * This color constant "Gray Green" has RGBA8888 code {@code 506450FF}, L 0.37254903, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.3975709, saturation 0.22222222, and chroma 0.040217306.
    +1105     * It can be represented as a packed float with the constant {@code -0x1.04f6bep126F}.
     1106     * <pre>
     1107     * <font style='background-color: #506450;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #506450; color: #000000'>&nbsp;@&nbsp;</font>
     1108     * <font style='background-color: #506450;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #506450'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #506450'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #506450'>&nbsp;@&nbsp;</font><font style='background-color: #506450; color: #888888'>&nbsp;@&nbsp;</font>
     1109     * <font style='background-color: #506450;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #506450; color: #ffffff'>&nbsp;@&nbsp;</font>
     1110     * </pre>
     1111     */
    -1112    public static final float GRAY_GREEN = -0x1.04f6cp126F;
    -1113    static { NAMED.put("Gray Green", -0x1.04f6cp126F); LIST.add(-0x1.04f6cp126F); }
    +1112    public static final float GRAY_GREEN = -0x1.04f6bep126F;
    +1113    static { NAMED.put("Gray Green", -0x1.04f6bep126F); LIST.add(-0x1.04f6bep126F); }
     1114
     1115    /**
    -1116     * This color constant "Maidenhair Fern" has RGBA8888 code {@code 3B7349FF}, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.42320445, saturation 0.3791533, and chroma 0.09260367.
    +1116     * This color constant "Maidenhair Fern" has RGBA8888 code {@code 3B7349FF}, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.41398114, saturation 0.5424141, and chroma 0.09260367.
     1117     * It can be represented as a packed float with the constant {@code -0x1.0aeaccp126F}.
     1118     * <pre>
     1119     * <font style='background-color: #3B7349;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3B7349; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1138,7 +1138,7 @@
     1125    static { NAMED.put("Maidenhair Fern", -0x1.0aeaccp126F); LIST.add(-0x1.0aeaccp126F); }
     1126
     1127    /**
    -1128     * This color constant "Kelly Green" has RGBA8888 code {@code 578F57FF}, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.40801254, saturation 0.29565728, and chroma 0.107261956.
    +1128     * This color constant "Kelly Green" has RGBA8888 code {@code 578F57FF}, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.39991105, saturation 0.49459895, and chroma 0.107261956.
     1129     * It can be represented as a packed float with the constant {@code -0x1.0ee902p126F}.
     1130     * <pre>
     1131     * <font style='background-color: #578F57;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #578F57; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1150,103 +1150,103 @@
     1137    static { NAMED.put("Kelly Green", -0x1.0ee902p126F); LIST.add(-0x1.0ee902p126F); }
     1138
     1139    /**
    -1140     * This color constant "Dusty Green" has RGBA8888 code {@code 73AB73FF}, L 0.6117647, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.41176948, saturation 0.19803588, and chroma 0.096477255.
    -1141     * It can be represented as a packed float with the constant {@code -0x1.0ceb38p126F}.
    +1140     * This color constant "Dusty Green" has RGBA8888 code {@code 73AB73FF}, L 0.6156863, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.40278715, saturation 0.39375985, and chroma 0.096477255.
    +1141     * It can be represented as a packed float with the constant {@code -0x1.0ceb3ap126F}.
     1142     * <pre>
     1143     * <font style='background-color: #73AB73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73AB73; color: #000000'>&nbsp;@&nbsp;</font>
     1144     * <font style='background-color: #73AB73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #73AB73'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #73AB73'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #73AB73'>&nbsp;@&nbsp;</font><font style='background-color: #73AB73; color: #888888'>&nbsp;@&nbsp;</font>
     1145     * <font style='background-color: #73AB73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73AB73; color: #ffffff'>&nbsp;@&nbsp;</font>
     1146     * </pre>
     1147     */
    -1148    public static final float DUSTY_GREEN = -0x1.0ceb38p126F;
    -1149    static { NAMED.put("Dusty Green", -0x1.0ceb38p126F); LIST.add(-0x1.0ceb38p126F); }
    +1148    public static final float DUSTY_GREEN = -0x1.0ceb3ap126F;
    +1149    static { NAMED.put("Dusty Green", -0x1.0ceb3ap126F); LIST.add(-0x1.0ceb3ap126F); }
     1150
     1151    /**
    -1152     * This color constant "Garter Snake" has RGBA8888 code {@code 64C082FF}, L 0.6666667, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.43293634, saturation 0.3960396, and chroma 0.124142565.
    -1153     * It can be represented as a packed float with the constant {@code -0x1.0ce354p126F}.
    +1152     * This color constant "Garter Snake" has RGBA8888 code {@code 64C082FF}, L 0.67058825, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.42620972, saturation 0.5906595, and chroma 0.124142565.
    +1153     * It can be represented as a packed float with the constant {@code -0x1.0ce356p126F}.
     1154     * <pre>
     1155     * <font style='background-color: #64C082;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #64C082; color: #000000'>&nbsp;@&nbsp;</font>
     1156     * <font style='background-color: #64C082;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #64C082'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #64C082'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #64C082'>&nbsp;@&nbsp;</font><font style='background-color: #64C082; color: #888888'>&nbsp;@&nbsp;</font>
     1157     * <font style='background-color: #64C082;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #64C082; color: #ffffff'>&nbsp;@&nbsp;</font>
     1158     * </pre>
     1159     */
    -1160    public static final float GARTER_SNAKE = -0x1.0ce354p126F;
    -1161    static { NAMED.put("Garter Snake", -0x1.0ce354p126F); LIST.add(-0x1.0ce354p126F); }
    +1160    public static final float GARTER_SNAKE = -0x1.0ce356p126F;
    +1161    static { NAMED.put("Garter Snake", -0x1.0ce356p126F); LIST.add(-0x1.0ce356p126F); }
     1162
     1163    /**
    -1164     * This color constant "Silver Green" has RGBA8888 code {@code 8FC78FFF}, L 0.7137255, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.41176948, saturation 0.15616, and chroma 0.096477255.
    -1165     * It can be represented as a packed float with the constant {@code -0x1.0ceb6cp126F}.
    +1164     * This color constant "Silver Green" has RGBA8888 code {@code 8FC78FFF}, L 0.72156864, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.40278715, saturation 0.3538132, and chroma 0.096477255.
    +1165     * It can be represented as a packed float with the constant {@code -0x1.0ceb7p126F}.
     1166     * <pre>
     1167     * <font style='background-color: #8FC78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8FC78F; color: #000000'>&nbsp;@&nbsp;</font>
     1168     * <font style='background-color: #8FC78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8FC78F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8FC78F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8FC78F'>&nbsp;@&nbsp;</font><font style='background-color: #8FC78F; color: #888888'>&nbsp;@&nbsp;</font>
     1169     * <font style='background-color: #8FC78F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8FC78F; color: #ffffff'>&nbsp;@&nbsp;</font>
     1170     * </pre>
     1171     */
    -1172    public static final float SILVER_GREEN = -0x1.0ceb6cp126F;
    -1173    static { NAMED.put("Silver Green", -0x1.0ceb6cp126F); LIST.add(-0x1.0ceb6cp126F); }
    +1172    public static final float SILVER_GREEN = -0x1.0ceb7p126F;
    +1173    static { NAMED.put("Silver Green", -0x1.0ceb7p126F); LIST.add(-0x1.0ceb7p126F); }
     1174
     1175    /**
    -1176     * This color constant "Pistachio" has RGBA8888 code {@code A2D8A2FF}, L 0.7764706, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.41646945, saturation 0.11585842, and chroma 0.08575976.
    -1177     * It can be represented as a packed float with the constant {@code -0x1.0aed8cp126F}.
    +1176     * This color constant "Pistachio" has RGBA8888 code {@code A2D8A2FF}, L 0.78431374, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.40640444, saturation 0.30904725, and chroma 0.08575976.
    +1177     * It can be represented as a packed float with the constant {@code -0x1.0aed9p126F}.
     1178     * <pre>
     1179     * <font style='background-color: #A2D8A2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A2D8A2; color: #000000'>&nbsp;@&nbsp;</font>
     1180     * <font style='background-color: #A2D8A2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #A2D8A2'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #A2D8A2'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #A2D8A2'>&nbsp;@&nbsp;</font><font style='background-color: #A2D8A2; color: #888888'>&nbsp;@&nbsp;</font>
     1181     * <font style='background-color: #A2D8A2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A2D8A2; color: #ffffff'>&nbsp;@&nbsp;</font>
     1182     * </pre>
     1183     */
    -1184    public static final float PISTACHIO = -0x1.0aed8cp126F;
    -1185    static { NAMED.put("Pistachio", -0x1.0aed8cp126F); LIST.add(-0x1.0aed8cp126F); }
    +1184    public static final float PISTACHIO = -0x1.0aed9p126F;
    +1185    static { NAMED.put("Pistachio", -0x1.0aed9p126F); LIST.add(-0x1.0aed9p126F); }
     1186
     1187    /**
    -1188     * This color constant "Angel Wing" has RGBA8888 code {@code E1F8FAFF}, L 0.92941177, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5644313, saturation 0.3712, and chroma 0.029749114.
    -1189     * It can be represented as a packed float with the constant {@code -0x1.fcf9dap125F}.
    +1188     * This color constant "Angel Wing" has RGBA8888 code {@code E1F8FAFF}, L 0.9372549, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5511957, saturation 0.52704626, and chroma 0.029749114.
    +1189     * It can be represented as a packed float with the constant {@code -0x1.fcf9dep125F}.
     1190     * <pre>
     1191     * <font style='background-color: #E1F8FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E1F8FA; color: #000000'>&nbsp;@&nbsp;</font>
     1192     * <font style='background-color: #E1F8FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E1F8FA'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E1F8FA'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E1F8FA'>&nbsp;@&nbsp;</font><font style='background-color: #E1F8FA; color: #888888'>&nbsp;@&nbsp;</font>
     1193     * <font style='background-color: #E1F8FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E1F8FA; color: #ffffff'>&nbsp;@&nbsp;</font>
     1194     * </pre>
     1195     */
    -1196    public static final float ANGEL_WING = -0x1.fcf9dap125F;
    -1197    static { NAMED.put("Angel Wing", -0x1.fcf9dap125F); LIST.add(-0x1.fcf9dap125F); }
    +1196    public static final float ANGEL_WING = -0x1.fcf9dep125F;
    +1197    static { NAMED.put("Angel Wing", -0x1.fcf9dep125F); LIST.add(-0x1.fcf9dep125F); }
     1198
     1199    /**
    -1200     * This color constant "Sage Green" has RGBA8888 code {@code B4EECAFF}, L 0.85490197, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.19143423, and chroma 0.069218926.
    -1201     * It can be represented as a packed float with the constant {@code -0x1.04efb4p126F}.
    +1200     * This color constant "Sage Green" has RGBA8888 code {@code B4EECAFF}, L 0.8666667, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.47466686, and chroma 0.069218926.
    +1201     * It can be represented as a packed float with the constant {@code -0x1.04efbap126F}.
     1202     * <pre>
     1203     * <font style='background-color: #B4EECA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B4EECA; color: #000000'>&nbsp;@&nbsp;</font>
     1204     * <font style='background-color: #B4EECA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B4EECA'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B4EECA'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B4EECA'>&nbsp;@&nbsp;</font><font style='background-color: #B4EECA; color: #888888'>&nbsp;@&nbsp;</font>
     1205     * <font style='background-color: #B4EECA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B4EECA; color: #ffffff'>&nbsp;@&nbsp;</font>
     1206     * </pre>
     1207     */
    -1208    public static final float SAGE_GREEN = -0x1.04efb4p126F;
    -1209    static { NAMED.put("Sage Green", -0x1.04efb4p126F); LIST.add(-0x1.04efb4p126F); }
    +1208    public static final float SAGE_GREEN = -0x1.04efbap126F;
    +1209    static { NAMED.put("Sage Green", -0x1.04efbap126F); LIST.add(-0x1.04efbap126F); }
     1210
     1211    /**
    -1212     * This color constant "Dried Sage" has RGBA8888 code {@code ABE3C5FF}, L 0.81960785, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.118390046, and chroma 0.069218926.
    -1213     * It can be represented as a packed float with the constant {@code -0x1.04efa2p126F}.
    +1212     * This color constant "Dried Sage" has RGBA8888 code {@code ABE3C5FF}, L 0.83137256, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.34176013, and chroma 0.069218926.
    +1213     * It can be represented as a packed float with the constant {@code -0x1.04efa8p126F}.
     1214     * <pre>
     1215     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #000000'>&nbsp;@&nbsp;</font>
     1216     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ABE3C5; color: #888888'>&nbsp;@&nbsp;</font>
     1217     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #ffffff'>&nbsp;@&nbsp;</font>
     1218     * </pre>
     1219     */
    -1220    public static final float DRIED_SAGE = -0x1.04efa2p126F;
    -1221    static { NAMED.put("Dried Sage", -0x1.04efa2p126F); LIST.add(-0x1.04efa2p126F); }
    +1220    public static final float DRIED_SAGE = -0x1.04efa8p126F;
    +1221    static { NAMED.put("Dried Sage", -0x1.04efa8p126F); LIST.add(-0x1.04efa8p126F); }
     1222
     1223    /**
    -1224     * This color constant "Artichoke" has RGBA8888 code {@code 87B48EFF}, L 0.65882355, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.4378436, saturation 0.14369221, and chroma 0.071815535.
    -1225     * It can be represented as a packed float with the constant {@code -0x1.06ef5p126F}.
    +1224     * This color constant "Artichoke" has RGBA8888 code {@code 87B48EFF}, L 0.6627451, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.42620972, saturation 0.34401047, and chroma 0.071815535.
    +1225     * It can be represented as a packed float with the constant {@code -0x1.06ef52p126F}.
     1226     * <pre>
     1227     * <font style='background-color: #87B48E;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #87B48E; color: #000000'>&nbsp;@&nbsp;</font>
     1228     * <font style='background-color: #87B48E;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #87B48E'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #87B48E'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #87B48E'>&nbsp;@&nbsp;</font><font style='background-color: #87B48E; color: #888888'>&nbsp;@&nbsp;</font>
     1229     * <font style='background-color: #87B48E;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #87B48E; color: #ffffff'>&nbsp;@&nbsp;</font>
     1230     * </pre>
     1231     */
    -1232    public static final float ARTICHOKE = -0x1.06ef5p126F;
    -1233    static { NAMED.put("Artichoke", -0x1.06ef5p126F); LIST.add(-0x1.06ef5p126F); }
    +1232    public static final float ARTICHOKE = -0x1.06ef52p126F;
    +1233    static { NAMED.put("Artichoke", -0x1.06ef52p126F); LIST.add(-0x1.06ef52p126F); }
     1234
     1235    /**
    -1236     * This color constant "Viridian" has RGBA8888 code {@code 507D5FFF}, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.4378436, saturation 0.24035555, and chroma 0.071815535.
    +1236     * This color constant "Viridian" has RGBA8888 code {@code 507D5FFF}, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.42620972, saturation 0.4472136, and chroma 0.071815535.
     1237     * It can be represented as a packed float with the constant {@code -0x1.06eee6p126F}.
     1238     * <pre>
     1239     * <font style='background-color: #507D5F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #507D5F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1258,7 +1258,7 @@
     1245    static { NAMED.put("Viridian", -0x1.06eee6p126F); LIST.add(-0x1.06eee6p126F); }
     1246
     1247    /**
    -1248     * This color constant "Floral Foam" has RGBA8888 code {@code 0F6946FF}, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.4596309, saturation 0.893996, and chroma 0.10895567.
    +1248     * This color constant "Floral Foam" has RGBA8888 code {@code 0F6946FF}, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.45250326, saturation 0.90676475, and chroma 0.10895567.
     1249     * It can be represented as a packed float with the constant {@code -0x1.06e4b2p126F}.
     1250     * <pre>
     1251     * <font style='background-color: #0F6946;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0F6946; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1270,7 +1270,7 @@
     1257    static { NAMED.put("Floral Foam", -0x1.06e4b2p126F); LIST.add(-0x1.06e4b2p126F); }
     1258
     1259    /**
    -1260     * This color constant "Hunter Green" has RGBA8888 code {@code 1E2D23FF}, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.44880432, saturation 0.2366864, and chroma 0.03705794.
    +1260     * This color constant "Hunter Green" has RGBA8888 code {@code 1E2D23FF}, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.42620972, saturation 0.4259177, and chroma 0.03705794.
     1261     * It can be represented as a packed float with the constant {@code -0x1.02f64cp126F}.
     1262     * <pre>
     1263     * <font style='background-color: #1E2D23;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #1E2D23; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1282,19 +1282,19 @@
     1269    static { NAMED.put("Hunter Green", -0x1.02f64cp126F); LIST.add(-0x1.02f64cp126F); }
     1270
     1271    /**
    -1272     * This color constant "Dark Teal" has RGBA8888 code {@code 234146FF}, L 0.23137255, A 0.47843137, B 0.4862745, alpha 1.0, hue 0.59020853, saturation 0.4045211, and chroma 0.050931267.
    -1273     * It can be represented as a packed float with the constant {@code -0x1.f8f476p125F}.
    +1272     * This color constant "Dark Teal" has RGBA8888 code {@code 234146FF}, L 0.22745098, A 0.47843137, B 0.4862745, alpha 1.0, hue 0.58601886, saturation 0.64788353, and chroma 0.050931267.
    +1273     * It can be represented as a packed float with the constant {@code -0x1.f8f474p125F}.
     1274     * <pre>
     1275     * <font style='background-color: #234146;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #234146; color: #000000'>&nbsp;@&nbsp;</font>
     1276     * <font style='background-color: #234146;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #234146'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #234146'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #234146'>&nbsp;@&nbsp;</font><font style='background-color: #234146; color: #888888'>&nbsp;@&nbsp;</font>
     1277     * <font style='background-color: #234146;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #234146; color: #ffffff'>&nbsp;@&nbsp;</font>
     1278     * </pre>
     1279     */
    -1280    public static final float DARK_TEAL = -0x1.f8f476p125F;
    -1281    static { NAMED.put("Dark Teal", -0x1.f8f476p125F); LIST.add(-0x1.f8f476p125F); }
    +1280    public static final float DARK_TEAL = -0x1.f8f474p125F;
    +1281    static { NAMED.put("Dark Teal", -0x1.f8f474p125F); LIST.add(-0x1.f8f474p125F); }
     1282
     1283    /**
    -1284     * This color constant "Kyanite" has RGBA8888 code {@code 3B7373FF}, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.545517, saturation 0.4471342, and chroma 0.069218926.
    +1284     * This color constant "Kyanite" has RGBA8888 code {@code 3B7373FF}, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.53898686, saturation 0.63432395, and chroma 0.069218926.
     1285     * It can be represented as a packed float with the constant {@code -0x1.faeed4p125F}.
     1286     * <pre>
     1287     * <font style='background-color: #3B7373;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3B7373; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1306,103 +1306,103 @@
     1293    static { NAMED.put("Kyanite", -0x1.faeed4p125F); LIST.add(-0x1.faeed4p125F); }
     1294
     1295    /**
    -1296     * This color constant "Spearmint" has RGBA8888 code {@code 64ABABFF}, L 0.61960787, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.5409493, saturation 0.32430163, and chroma 0.07674564.
    -1297     * It can be represented as a packed float with the constant {@code -0x1.faed3cp125F}.
    +1296     * This color constant "Spearmint" has RGBA8888 code {@code 64ABABFF}, L 0.62352943, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.53480494, saturation 0.5587603, and chroma 0.07674564.
    +1297     * It can be represented as a packed float with the constant {@code -0x1.faed3ep125F}.
     1298     * <pre>
     1299     * <font style='background-color: #64ABAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #64ABAB; color: #000000'>&nbsp;@&nbsp;</font>
     1300     * <font style='background-color: #64ABAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #64ABAB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #64ABAB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #64ABAB'>&nbsp;@&nbsp;</font><font style='background-color: #64ABAB; color: #888888'>&nbsp;@&nbsp;</font>
     1301     * <font style='background-color: #64ABAB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #64ABAB; color: #ffffff'>&nbsp;@&nbsp;</font>
     1302     * </pre>
     1303     */
    -1304    public static final float SPEARMINT = -0x1.faed3cp125F;
    -1305    static { NAMED.put("Spearmint", -0x1.faed3cp125F); LIST.add(-0x1.faed3cp125F); }
    +1304    public static final float SPEARMINT = -0x1.faed3ep125F;
    +1305    static { NAMED.put("Spearmint", -0x1.faed3ep125F); LIST.add(-0x1.faed3ep125F); }
     1306
     1307    /**
    -1308     * This color constant "Amazonite" has RGBA8888 code {@code 8FC7C7FF}, L 0.73333335, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.1686625, and chroma 0.061763234.
    -1309     * It can be represented as a packed float with the constant {@code -0x1.faf176p125F}.
    +1308     * This color constant "Amazonite" has RGBA8888 code {@code 8FC7C7FF}, L 0.7372549, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.54428434, saturation 0.39351946, and chroma 0.061763234.
    +1309     * It can be represented as a packed float with the constant {@code -0x1.faf178p125F}.
     1310     * <pre>
     1311     * <font style='background-color: #8FC7C7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8FC7C7; color: #000000'>&nbsp;@&nbsp;</font>
     1312     * <font style='background-color: #8FC7C7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8FC7C7'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8FC7C7'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8FC7C7'>&nbsp;@&nbsp;</font><font style='background-color: #8FC7C7; color: #888888'>&nbsp;@&nbsp;</font>
     1313     * <font style='background-color: #8FC7C7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8FC7C7; color: #ffffff'>&nbsp;@&nbsp;</font>
     1314     * </pre>
     1315     */
    -1316    public static final float AMAZONITE = -0x1.faf176p125F;
    -1317    static { NAMED.put("Amazonite", -0x1.faf176p125F); LIST.add(-0x1.faf176p125F); }
    +1316    public static final float AMAZONITE = -0x1.faf178p125F;
    +1317    static { NAMED.put("Amazonite", -0x1.faf178p125F); LIST.add(-0x1.faf178p125F); }
     1318
     1319    /**
    -1320     * This color constant "Pastel Sky" has RGBA8888 code {@code ABE3E3FF}, L 0.83137256, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.55842525, saturation 0.12433905, and chroma 0.054407768.
    -1321     * It can be represented as a packed float with the constant {@code -0x1.faf3a8p125F}.
    +1320     * This color constant "Pastel Sky" has RGBA8888 code {@code ABE3E3FF}, L 0.8392157, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.3085149, and chroma 0.054407768.
    +1321     * It can be represented as a packed float with the constant {@code -0x1.faf3acp125F}.
     1322     * <pre>
     1323     * <font style='background-color: #ABE3E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3E3; color: #000000'>&nbsp;@&nbsp;</font>
     1324     * <font style='background-color: #ABE3E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABE3E3'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABE3E3'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABE3E3'>&nbsp;@&nbsp;</font><font style='background-color: #ABE3E3; color: #888888'>&nbsp;@&nbsp;</font>
     1325     * <font style='background-color: #ABE3E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3E3; color: #ffffff'>&nbsp;@&nbsp;</font>
     1326     * </pre>
     1327     */
    -1328    public static final float PASTEL_SKY = -0x1.faf3a8p125F;
    -1329    static { NAMED.put("Pastel Sky", -0x1.faf3a8p125F); LIST.add(-0x1.faf3a8p125F); }
    +1328    public static final float PASTEL_SKY = -0x1.faf3acp125F;
    +1329    static { NAMED.put("Pastel Sky", -0x1.faf3acp125F); LIST.add(-0x1.faf3acp125F); }
     1330
     1331    /**
    -1332     * This color constant "Aquamarine" has RGBA8888 code {@code C7F1F1FF}, L 0.8862745, A 0.47843137, B 0.49411765, alpha 1.0, hue 0.54236877, saturation 0.14938237, and chroma 0.044538103.
    -1333     * It can be represented as a packed float with the constant {@code -0x1.fcf5c4p125F}.
    +1332     * This color constant "Aquamarine" has RGBA8888 code {@code C7F1F1FF}, L 0.8980392, A 0.47843137, B 0.49411765, alpha 1.0, hue 0.53142345, saturation 0.443393, and chroma 0.044538103.
    +1333     * It can be represented as a packed float with the constant {@code -0x1.fcf5cap125F}.
     1334     * <pre>
     1335     * <font style='background-color: #C7F1F1;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C7F1F1; color: #000000'>&nbsp;@&nbsp;</font>
     1336     * <font style='background-color: #C7F1F1;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C7F1F1'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C7F1F1'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C7F1F1'>&nbsp;@&nbsp;</font><font style='background-color: #C7F1F1; color: #888888'>&nbsp;@&nbsp;</font>
     1337     * <font style='background-color: #C7F1F1;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C7F1F1; color: #ffffff'>&nbsp;@&nbsp;</font>
     1338     * </pre>
     1339     */
    -1340    public static final float AQUAMARINE = -0x1.fcf5c4p125F;
    -1341    static { NAMED.put("Aquamarine", -0x1.fcf5c4p125F); LIST.add(-0x1.fcf5c4p125F); }
    +1340    public static final float AQUAMARINE = -0x1.fcf5cap125F;
    +1341    static { NAMED.put("Aquamarine", -0x1.fcf5cap125F); LIST.add(-0x1.fcf5cap125F); }
     1342
     1343    /**
    -1344     * This color constant "Dust Bunny" has RGBA8888 code {@code BED2F0FF}, L 0.80784315, A 0.49411765, B 0.47843137, alpha 1.0, hue 0.70763123, saturation 0.34188035, and chroma 0.044538103.
    -1345     * It can be represented as a packed float with the constant {@code -0x1.f4fd9cp125F}.
    +1344     * This color constant "Dust Bunny" has RGBA8888 code {@code BED2F0FF}, L 0.81960785, A 0.49411765, B 0.47843137, alpha 1.0, hue 0.71857655, saturation 0.5998846, and chroma 0.044538103.
    +1345     * It can be represented as a packed float with the constant {@code -0x1.f4fda2p125F}.
     1346     * <pre>
     1347     * <font style='background-color: #BED2F0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BED2F0; color: #000000'>&nbsp;@&nbsp;</font>
     1348     * <font style='background-color: #BED2F0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BED2F0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BED2F0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BED2F0'>&nbsp;@&nbsp;</font><font style='background-color: #BED2F0; color: #888888'>&nbsp;@&nbsp;</font>
     1349     * <font style='background-color: #BED2F0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BED2F0; color: #ffffff'>&nbsp;@&nbsp;</font>
     1350     * </pre>
     1351     */
    -1352    public static final float DUST_BUNNY = -0x1.f4fd9cp125F;
    -1353    static { NAMED.put("Dust Bunny", -0x1.f4fd9cp125F); LIST.add(-0x1.f4fd9cp125F); }
    +1352    public static final float DUST_BUNNY = -0x1.f4fda2p125F;
    +1353    static { NAMED.put("Dust Bunny", -0x1.f4fda2p125F); LIST.add(-0x1.f4fda2p125F); }
     1354
     1355    /**
    -1356     * This color constant "Patina" has RGBA8888 code {@code ABC7E3FF}, L 0.7647059, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.68210673, saturation 0.22452903, and chroma 0.0471994.
    -1357     * It can be represented as a packed float with the constant {@code -0x1.f4fb86p125F}.
    +1356     * This color constant "Patina" has RGBA8888 code {@code ABC7E3FF}, L 0.77254903, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.689452, saturation 0.4682752, and chroma 0.0471994.
    +1357     * It can be represented as a packed float with the constant {@code -0x1.f4fb8ap125F}.
     1358     * <pre>
     1359     * <font style='background-color: #ABC7E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABC7E3; color: #000000'>&nbsp;@&nbsp;</font>
     1360     * <font style='background-color: #ABC7E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABC7E3'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABC7E3'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABC7E3'>&nbsp;@&nbsp;</font><font style='background-color: #ABC7E3; color: #888888'>&nbsp;@&nbsp;</font>
     1361     * <font style='background-color: #ABC7E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABC7E3; color: #ffffff'>&nbsp;@&nbsp;</font>
     1362     * </pre>
     1363     */
    -1364    public static final float PATINA = -0x1.f4fb86p125F;
    -1365    static { NAMED.put("Patina", -0x1.f4fb86p125F); LIST.add(-0x1.f4fb86p125F); }
    +1364    public static final float PATINA = -0x1.f4fb8ap125F;
    +1365    static { NAMED.put("Patina", -0x1.f4fb8ap125F); LIST.add(-0x1.f4fb8ap125F); }
     1366
     1367    /**
    -1368     * This color constant "Chipped Granite" has RGBA8888 code {@code A8B9DCFF}, L 0.7254902, A 0.49411765, B 0.4745098, alpha 1.0, hue 0.7139029, saturation 0.21914436, and chroma 0.052115876.
    -1369     * It can be represented as a packed float with the constant {@code -0x1.f2fd72p125F}.
    +1368     * This color constant "Chipped Granite" has RGBA8888 code {@code A8B9DCFF}, L 0.73333335, A 0.49411765, B 0.4745098, alpha 1.0, hue 0.7237039, saturation 0.46790484, and chroma 0.052115876.
    +1369     * It can be represented as a packed float with the constant {@code -0x1.f2fd76p125F}.
     1370     * <pre>
     1371     * <font style='background-color: #A8B9DC;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A8B9DC; color: #000000'>&nbsp;@&nbsp;</font>
     1372     * <font style='background-color: #A8B9DC;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #A8B9DC'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #A8B9DC'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #A8B9DC'>&nbsp;@&nbsp;</font><font style='background-color: #A8B9DC; color: #888888'>&nbsp;@&nbsp;</font>
     1373     * <font style='background-color: #A8B9DC;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A8B9DC; color: #ffffff'>&nbsp;@&nbsp;</font>
     1374     * </pre>
     1375     */
    -1376    public static final float CHIPPED_GRANITE = -0x1.f2fd72p125F;
    -1377    static { NAMED.put("Chipped Granite", -0x1.f2fd72p125F); LIST.add(-0x1.f2fd72p125F); }
    +1376    public static final float CHIPPED_GRANITE = -0x1.f2fd76p125F;
    +1377    static { NAMED.put("Chipped Granite", -0x1.f2fd76p125F); LIST.add(-0x1.f2fd76p125F); }
     1378
     1379    /**
    -1380     * This color constant "Blue Smoke" has RGBA8888 code {@code 8FABC7FF}, L 0.6627451, A 0.49019608, B 0.4745098, alpha 1.0, hue 0.69157475, saturation 0.13795556, and chroma 0.054407768.
    -1381     * It can be represented as a packed float with the constant {@code -0x1.f2fb52p125F}.
    +1380     * This color constant "Blue Smoke" has RGBA8888 code {@code 8FABC7FF}, L 0.6666667, A 0.49019608, B 0.4745098, alpha 1.0, hue 0.6988043, saturation 0.36140317, and chroma 0.054407768.
    +1381     * It can be represented as a packed float with the constant {@code -0x1.f2fb54p125F}.
     1382     * <pre>
     1383     * <font style='background-color: #8FABC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8FABC7; color: #000000'>&nbsp;@&nbsp;</font>
     1384     * <font style='background-color: #8FABC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8FABC7'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8FABC7'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8FABC7'>&nbsp;@&nbsp;</font><font style='background-color: #8FABC7; color: #888888'>&nbsp;@&nbsp;</font>
     1385     * <font style='background-color: #8FABC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8FABC7; color: #ffffff'>&nbsp;@&nbsp;</font>
     1386     * </pre>
     1387     */
    -1388    public static final float BLUE_SMOKE = -0x1.f2fb52p125F;
    -1389    static { NAMED.put("Blue Smoke", -0x1.f2fb52p125F); LIST.add(-0x1.f2fb52p125F); }
    +1388    public static final float BLUE_SMOKE = -0x1.f2fb54p125F;
    +1389    static { NAMED.put("Blue Smoke", -0x1.f2fb54p125F); LIST.add(-0x1.f2fb54p125F); }
     1390
     1391    /**
    -1392     * This color constant "Air Force Blue" has RGBA8888 code {@code 578FC7FF}, L 0.5529412, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6840373, saturation 0.29252034, and chroma 0.106691405.
    +1392     * This color constant "Air Force Blue" has RGBA8888 code {@code 578FC7FF}, L 0.5529412, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6871773, saturation 0.5531915, and chroma 0.106691405.
     1393     * It can be represented as a packed float with the constant {@code -0x1.e6f51ap125F}.
     1394     * <pre>
     1395     * <font style='background-color: #578FC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #578FC7; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1414,7 +1414,7 @@
     1401    static { NAMED.put("Air Force Blue", -0x1.e6f51ap125F); LIST.add(-0x1.e6f51ap125F); }
     1402
     1403    /**
    -1404     * This color constant "Cold Iron" has RGBA8888 code {@code 57738FFF}, L 0.44705883, A 0.4862745, B 0.4745098, alpha 1.0, hue 0.67138404, saturation 0.1397212, and chroma 0.05767509.
    +1404     * This color constant "Cold Iron" has RGBA8888 code {@code 57738FFF}, L 0.44705883, A 0.4862745, B 0.4745098, alpha 1.0, hue 0.6762097, saturation 0.35306334, and chroma 0.05767509.
     1405     * It can be represented as a packed float with the constant {@code -0x1.f2f8e4p125F}.
     1406     * <pre>
     1407     * <font style='background-color: #57738F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #57738F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1426,7 +1426,7 @@
     1413    static { NAMED.put("Cold Iron", -0x1.f2f8e4p125F); LIST.add(-0x1.f2f8e4p125F); }
     1414
     1415    /**
    -1416     * This color constant "Dreary Blue" has RGBA8888 code {@code 3B5773FF}, L 0.33333334, A 0.4862745, B 0.47058824, alpha 1.0, hue 0.680514, saturation 0.20566711, and chroma 0.064659946.
    +1416     * This color constant "Dreary Blue" has RGBA8888 code {@code 3B5773FF}, L 0.33333334, A 0.4862745, B 0.47058824, alpha 1.0, hue 0.6855687, saturation 0.44798666, and chroma 0.064659946.
     1417     * It can be represented as a packed float with the constant {@code -0x1.f0f8aap125F}.
     1418     * <pre>
     1419     * <font style='background-color: #3B5773;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3B5773; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1438,7 +1438,7 @@
     1425    static { NAMED.put("Dreary Blue", -0x1.f0f8aap125F); LIST.add(-0x1.f0f8aap125F); }
     1426
     1427    /**
    -1428     * This color constant "Murk" has RGBA8888 code {@code 0F192DFF}, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.71857655, saturation 0.28808865, and chroma 0.059754133.
    +1428     * This color constant "Murk" has RGBA8888 code {@code 0F192DFF}, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.72740346, saturation 0.48765984, and chroma 0.059754133.
     1429     * It can be represented as a packed float with the constant {@code -0x1.f0fc2cp125F}.
     1430     * <pre>
     1431     * <font style='background-color: #0F192D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0F192D; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1450,55 +1450,55 @@
     1437    static { NAMED.put("Murk", -0x1.f0fc2cp125F); LIST.add(-0x1.f0fc2cp125F); }
     1438
     1439    /**
    -1440     * This color constant "Ninja" has RGBA8888 code {@code 1F1F3BFF}, L 0.1254902, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.7778107, saturation 0.15748447, and chroma 0.06743233.
    -1441     * It can be represented as a packed float with the constant {@code -0x1.ef024p125F}.
    +1440     * This color constant "Ninja" has RGBA8888 code {@code 1F1F3BFF}, L 0.12156863, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.78898686, saturation 0.4022542, and chroma 0.06743233.
    +1441     * It can be represented as a packed float with the constant {@code -0x1.ef023ep125F}.
     1442     * <pre>
     1443     * <font style='background-color: #1F1F3B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #1F1F3B; color: #000000'>&nbsp;@&nbsp;</font>
     1444     * <font style='background-color: #1F1F3B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #1F1F3B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #1F1F3B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #1F1F3B'>&nbsp;@&nbsp;</font><font style='background-color: #1F1F3B; color: #888888'>&nbsp;@&nbsp;</font>
     1445     * <font style='background-color: #1F1F3B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #1F1F3B; color: #ffffff'>&nbsp;@&nbsp;</font>
     1446     * </pre>
     1447     */
    -1448    public static final float NINJA = -0x1.ef024p125F;
    -1449    static { NAMED.put("Ninja", -0x1.ef024p125F); LIST.add(-0x1.ef024p125F); }
    +1448    public static final float NINJA = -0x1.ef023ep125F;
    +1449    static { NAMED.put("Ninja", -0x1.ef023ep125F); LIST.add(-0x1.ef023ep125F); }
     1450
     1451    /**
    -1452     * This color constant "Watercolor Black" has RGBA8888 code {@code 3B3B57FF}, L 0.24313726, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.7860971, saturation 0.047061935, and chroma 0.052115876.
    -1453     * It can be represented as a packed float with the constant {@code -0x1.f3027cp125F}.
    +1452     * This color constant "Watercolor Black" has RGBA8888 code {@code 3B3B57FF}, L 0.23921569, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.8011957, saturation 0.21808812, and chroma 0.052115876.
    +1453     * It can be represented as a packed float with the constant {@code -0x1.f3027ap125F}.
     1454     * <pre>
     1455     * <font style='background-color: #3B3B57;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3B3B57; color: #000000'>&nbsp;@&nbsp;</font>
     1456     * <font style='background-color: #3B3B57;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3B3B57'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3B3B57'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3B3B57'>&nbsp;@&nbsp;</font><font style='background-color: #3B3B57; color: #888888'>&nbsp;@&nbsp;</font>
     1457     * <font style='background-color: #3B3B57;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3B3B57; color: #ffffff'>&nbsp;@&nbsp;</font>
     1458     * </pre>
     1459     */
    -1460    public static final float WATERCOLOR_BLACK = -0x1.f3027cp125F;
    -1461    static { NAMED.put("Watercolor Black", -0x1.f3027cp125F); LIST.add(-0x1.f3027cp125F); }
    +1460    public static final float WATERCOLOR_BLACK = -0x1.f3027ap125F;
    +1461    static { NAMED.put("Watercolor Black", -0x1.f3027ap125F); LIST.add(-0x1.f3027ap125F); }
     1462
     1463    /**
    -1464     * This color constant "Iolite" has RGBA8888 code {@code 494973FF}, L 0.30980393, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.06848998, and chroma 0.07513822.
    -1465     * It can be represented as a packed float with the constant {@code -0x1.ed029ep125F}.
    +1464     * This color constant "Iolite" has RGBA8888 code {@code 494973FF}, L 0.30588236, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.25970548, and chroma 0.07513822.
    +1465     * It can be represented as a packed float with the constant {@code -0x1.ed029cp125F}.
     1466     * <pre>
     1467     * <font style='background-color: #494973;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #494973; color: #000000'>&nbsp;@&nbsp;</font>
     1468     * <font style='background-color: #494973;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #494973'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #494973'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #494973'>&nbsp;@&nbsp;</font><font style='background-color: #494973; color: #888888'>&nbsp;@&nbsp;</font>
     1469     * <font style='background-color: #494973;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #494973; color: #ffffff'>&nbsp;@&nbsp;</font>
     1470     * </pre>
     1471     */
    -1472    public static final float IOLITE = -0x1.ed029ep125F;
    -1473    static { NAMED.put("Iolite", -0x1.ed029ep125F); LIST.add(-0x1.ed029ep125F); }
    +1472    public static final float IOLITE = -0x1.ed029cp125F;
    +1473    static { NAMED.put("Iolite", -0x1.ed029cp125F); LIST.add(-0x1.ed029cp125F); }
     1474
     1475    /**
    -1476     * This color constant "Boysenberry" has RGBA8888 code {@code 57578FFF}, L 0.3764706, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.7840724, saturation 0.09466445, and chroma 0.091942206.
    -1477     * It can be represented as a packed float with the constant {@code -0x1.e904cp125F}.
    +1476     * This color constant "Boysenberry" has RGBA8888 code {@code 57578FFF}, L 0.37254903, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.79236877, saturation 0.30004618, and chroma 0.091942206.
    +1477     * It can be represented as a packed float with the constant {@code -0x1.e904bep125F}.
     1478     * <pre>
     1479     * <font style='background-color: #57578F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #57578F; color: #000000'>&nbsp;@&nbsp;</font>
     1480     * <font style='background-color: #57578F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #57578F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #57578F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #57578F'>&nbsp;@&nbsp;</font><font style='background-color: #57578F; color: #888888'>&nbsp;@&nbsp;</font>
     1481     * <font style='background-color: #57578F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #57578F; color: #ffffff'>&nbsp;@&nbsp;</font>
     1482     * </pre>
     1483     */
    -1484    public static final float BOYSENBERRY = -0x1.e904cp125F;
    -1485    static { NAMED.put("Boysenberry", -0x1.e904cp125F); LIST.add(-0x1.e904cp125F); }
    +1484    public static final float BOYSENBERRY = -0x1.e904bep125F;
    +1485    static { NAMED.put("Boysenberry", -0x1.e904bep125F); LIST.add(-0x1.e904bep125F); }
     1486
     1487    /**
    -1488     * This color constant "Watercolor Gray" has RGBA8888 code {@code 736EAAFF}, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.7840724, saturation 0.14647366, and chroma 0.091942206.
    +1488     * This color constant "Watercolor Gray" has RGBA8888 code {@code 736EAAFF}, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.79236877, saturation 0.37382802, and chroma 0.091942206.
     1489     * It can be represented as a packed float with the constant {@code -0x1.e904f2p125F}.
     1490     * <pre>
     1491     * <font style='background-color: #736EAA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #736EAA; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1510,7 +1510,7 @@
     1497    static { NAMED.put("Watercolor Gray", -0x1.e904f2p125F); LIST.add(-0x1.e904f2p125F); }
     1498
     1499    /**
    -1500     * This color constant "Blue Steel" has RGBA8888 code {@code 7676CAFF}, L 0.5137255, A 0.50980395, B 0.4392157, alpha 1.0, hue 0.77546334, saturation 0.32010388, and chroma 0.12265874.
    +1500     * This color constant "Blue Steel" has RGBA8888 code {@code 7676CAFF}, L 0.5137255, A 0.50980395, B 0.4392157, alpha 1.0, hue 0.78142345, saturation 0.5665577, and chroma 0.12265874.
     1501     * It can be represented as a packed float with the constant {@code -0x1.e10506p125F}.
     1502     * <pre>
     1503     * <font style='background-color: #7676CA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7676CA; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1522,67 +1522,67 @@
     1509    static { NAMED.put("Blue Steel", -0x1.e10506p125F); LIST.add(-0x1.e10506p125F); }
     1510
     1511    /**
    -1512     * This color constant "Twilight Cloud" has RGBA8888 code {@code 8F8FC7FF}, L 0.59607846, A 0.5058824, B 0.45882353, alpha 1.0, hue 0.77259654, saturation 0.22724403, and chroma 0.082864076.
    -1513     * It can be represented as a packed float with the constant {@code -0x1.eb033p125F}.
    +1512     * This color constant "Twilight Cloud" has RGBA8888 code {@code 8F8FC7FF}, L 0.6, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.42881602, and chroma 0.07513822.
    +1513     * It can be represented as a packed float with the constant {@code -0x1.ed0332p125F}.
     1514     * <pre>
     1515     * <font style='background-color: #8F8FC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F8FC7; color: #000000'>&nbsp;@&nbsp;</font>
     1516     * <font style='background-color: #8F8FC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8F8FC7'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8F8FC7'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8F8FC7'>&nbsp;@&nbsp;</font><font style='background-color: #8F8FC7; color: #888888'>&nbsp;@&nbsp;</font>
     1517     * <font style='background-color: #8F8FC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F8FC7; color: #ffffff'>&nbsp;@&nbsp;</font>
     1518     * </pre>
     1519     */
    -1520    public static final float TWILIGHT_CLOUD = -0x1.eb033p125F;
    -1521    static { NAMED.put("Twilight Cloud", -0x1.eb033p125F); LIST.add(-0x1.eb033p125F); }
    +1520    public static final float TWILIGHT_CLOUD = -0x1.ed0332p125F;
    +1521    static { NAMED.put("Twilight Cloud", -0x1.ed0332p125F); LIST.add(-0x1.ed0332p125F); }
     1522
     1523    /**
    -1524     * This color constant "Smog" has RGBA8888 code {@code ABABE3FF}, L 0.69803923, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.35029587, and chroma 0.07513822.
    -1525     * It can be represented as a packed float with the constant {@code -0x1.ed0364p125F}.
    +1524     * This color constant "Smog" has RGBA8888 code {@code ABABE3FF}, L 0.7058824, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.6146363, and chroma 0.07513822.
    +1525     * It can be represented as a packed float with the constant {@code -0x1.ed0368p125F}.
     1526     * <pre>
     1527     * <font style='background-color: #ABABE3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABABE3; color: #000000'>&nbsp;@&nbsp;</font>
     1528     * <font style='background-color: #ABABE3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABABE3'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABABE3'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABABE3'>&nbsp;@&nbsp;</font><font style='background-color: #ABABE3; color: #888888'>&nbsp;@&nbsp;</font>
     1529     * <font style='background-color: #ABABE3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABABE3; color: #ffffff'>&nbsp;@&nbsp;</font>
     1530     * </pre>
     1531     */
    -1532    public static final float SMOG = -0x1.ed0364p125F;
    -1533    static { NAMED.put("Smog", -0x1.ed0364p125F); LIST.add(-0x1.ed0364p125F); }
    +1532    public static final float SMOG = -0x1.ed0368p125F;
    +1533    static { NAMED.put("Smog", -0x1.ed0368p125F); LIST.add(-0x1.ed0368p125F); }
     1534
     1535    /**
    -1536     * This color constant "Tropic Mist" has RGBA8888 code {@code D0DAF8FF}, L 0.84705883, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.735567, saturation 0.5078044, and chroma 0.04314594.
    -1537     * It can be represented as a packed float with the constant {@code -0x1.f4ffbp125F}.
    +1536     * This color constant "Tropic Mist" has RGBA8888 code {@code D0DAF8FF}, L 0.85490197, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.75, saturation 0.7692308, and chroma 0.04314594.
    +1537     * It can be represented as a packed float with the constant {@code -0x1.f4ffb4p125F}.
     1538     * <pre>
     1539     * <font style='background-color: #D0DAF8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D0DAF8; color: #000000'>&nbsp;@&nbsp;</font>
     1540     * <font style='background-color: #D0DAF8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D0DAF8'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D0DAF8'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D0DAF8'>&nbsp;@&nbsp;</font><font style='background-color: #D0DAF8; color: #888888'>&nbsp;@&nbsp;</font>
     1541     * <font style='background-color: #D0DAF8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D0DAF8; color: #ffffff'>&nbsp;@&nbsp;</font>
     1542     * </pre>
     1543     */
    -1544    public static final float TROPIC_MIST = -0x1.f4ffbp125F;
    -1545    static { NAMED.put("Tropic Mist", -0x1.f4ffbp125F); LIST.add(-0x1.f4ffbp125F); }
    +1544    public static final float TROPIC_MIST = -0x1.f4ffb4p125F;
    +1545    static { NAMED.put("Tropic Mist", -0x1.f4ffb4p125F); LIST.add(-0x1.f4ffb4p125F); }
     1546
     1547    /**
    -1548     * This color constant "Feather Down" has RGBA8888 code {@code E3E3FFFF}, L 0.88235295, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.7676211, saturation 0.6200378, and chroma 0.0353726.
    -1549     * It can be represented as a packed float with the constant {@code -0x1.f701c2p125F}.
    +1548     * This color constant "Feather Down" has RGBA8888 code {@code E3E3FFFF}, L 0.89411765, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.78898686, saturation 0.9162457, and chroma 0.0353726.
    +1549     * It can be represented as a packed float with the constant {@code -0x1.f701c8p125F}.
     1550     * <pre>
     1551     * <font style='background-color: #E3E3FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3E3FF; color: #000000'>&nbsp;@&nbsp;</font>
     1552     * <font style='background-color: #E3E3FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E3E3FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E3E3FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E3E3FF'>&nbsp;@&nbsp;</font><font style='background-color: #E3E3FF; color: #888888'>&nbsp;@&nbsp;</font>
     1553     * <font style='background-color: #E3E3FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3E3FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     1554     * </pre>
     1555     */
    -1556    public static final float FEATHER_DOWN = -0x1.f701c2p125F;
    -1557    static { NAMED.put("Feather Down", -0x1.f701c2p125F); LIST.add(-0x1.f701c2p125F); }
    +1556    public static final float FEATHER_DOWN = -0x1.f701c8p125F;
    +1557    static { NAMED.put("Feather Down", -0x1.f701c8p125F); LIST.add(-0x1.f701c8p125F); }
     1558
     1559    /**
    -1560     * This color constant "Mild Violet" has RGBA8888 code {@code AB8FC7FF}, L 0.62352943, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.84141475, saturation 0.16076855, and chroma 0.079095535.
    -1561     * It can be represented as a packed float with the constant {@code -0x1.ef0b3ep125F}.
    +1560     * This color constant "Mild Violet" has RGBA8888 code {@code AB8FC7FF}, L 0.627451, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.8524291, saturation 0.4, and chroma 0.079095535.
    +1561     * It can be represented as a packed float with the constant {@code -0x1.ef0b4p125F}.
     1562     * <pre>
     1563     * <font style='background-color: #AB8FC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB8FC7; color: #000000'>&nbsp;@&nbsp;</font>
     1564     * <font style='background-color: #AB8FC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AB8FC7'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AB8FC7'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AB8FC7'>&nbsp;@&nbsp;</font><font style='background-color: #AB8FC7; color: #888888'>&nbsp;@&nbsp;</font>
     1565     * <font style='background-color: #AB8FC7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB8FC7; color: #ffffff'>&nbsp;@&nbsp;</font>
     1566     * </pre>
     1567     */
    -1568    public static final float MILD_VIOLET = -0x1.ef0b3ep125F;
    -1569    static { NAMED.put("Mild Violet", -0x1.ef0b3ep125F); LIST.add(-0x1.ef0b3ep125F); }
    +1568    public static final float MILD_VIOLET = -0x1.ef0b4p125F;
    +1569    static { NAMED.put("Mild Violet", -0x1.ef0b4p125F); LIST.add(-0x1.ef0b4p125F); }
     1570
     1571    /**
    -1572     * This color constant "Violet Cushions" has RGBA8888 code {@code 8F57C7FF}, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8425412, saturation 0.3077058, and chroma 0.16359681.
    +1572     * This color constant "Violet Cushions" has RGBA8888 code {@code 8F57C7FF}, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8478395, saturation 0.56239605, and chroma 0.16359681.
     1573     * It can be represented as a packed float with the constant {@code -0x1.dd16f2p125F}.
     1574     * <pre>
     1575     * <font style='background-color: #8F57C7;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F57C7; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1594,7 +1594,7 @@
     1581    static { NAMED.put("Violet Cushions", -0x1.dd16f2p125F); LIST.add(-0x1.dd16f2p125F); }
     1582
     1583    /**
    -1584     * This color constant "Dull Violet" has RGBA8888 code {@code 73578FFF}, L 0.40392157, A 0.5254902, B 0.4627451, alpha 1.0, hue 0.84551346, saturation 0.09549119, and chroma 0.08992863.
    +1584     * This color constant "Dull Violet" has RGBA8888 code {@code 73578FFF}, L 0.40392157, A 0.5254902, B 0.4627451, alpha 1.0, hue 0.8552204, saturation 0.31237683, and chroma 0.08992863.
     1585     * It can be represented as a packed float with the constant {@code -0x1.ed0ccep125F}.
     1586     * <pre>
     1587     * <font style='background-color: #73578F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73578F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1606,7 +1606,7 @@
     1593    static { NAMED.put("Dull Violet", -0x1.ed0ccep125F); LIST.add(-0x1.ed0ccep125F); }
     1594
     1595    /**
    -1596     * This color constant "Royal Violet" has RGBA8888 code {@code 573B73FF}, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.84872866, saturation 0.18195479, and chroma 0.1008085.
    +1596     * This color constant "Royal Violet" has RGBA8888 code {@code 573B73FF}, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.8573997, saturation 0.43411013, and chroma 0.1008085.
     1597     * It can be represented as a packed float with the constant {@code -0x1.eb0e94p125F}.
     1598     * <pre>
     1599     * <font style='background-color: #573B73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #573B73; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1618,7 +1618,7 @@
     1605    static { NAMED.put("Royal Violet", -0x1.eb0e94p125F); LIST.add(-0x1.eb0e94p125F); }
     1606
     1607    /**
    -1608     * This color constant "Eminence" has RGBA8888 code {@code 3C233CFF}, L 0.16862746, A 0.5254902, B 0.48235294, alpha 1.0, hue 0.9036119, saturation 0.1524158, and chroma 0.061763234.
    +1608     * This color constant "Eminence" has RGBA8888 code {@code 3C233CFF}, L 0.16862746, A 0.5254902, B 0.48235294, alpha 1.0, hue 0.9173693, saturation 0.42432937, and chroma 0.061763234.
     1609     * It can be represented as a packed float with the constant {@code -0x1.f70c56p125F}.
     1610     * <pre>
     1611     * <font style='background-color: #3C233C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3C233C; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1630,19 +1630,19 @@
     1617    static { NAMED.put("Eminence", -0x1.f70c56p125F); LIST.add(-0x1.f70c56p125F); }
     1618
     1619    /**
    -1620     * This color constant "Prune" has RGBA8888 code {@code 463246FF}, L 0.22352941, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.057617728, and chroma 0.044538103.
    -1621     * It can be represented as a packed float with the constant {@code -0x1.f90872p125F}.
    +1620     * This color constant "Prune" has RGBA8888 code {@code 463246FF}, L 0.21960784, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.2591534, and chroma 0.044538103.
    +1621     * It can be represented as a packed float with the constant {@code -0x1.f9087p125F}.
     1622     * <pre>
     1623     * <font style='background-color: #463246;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #463246; color: #000000'>&nbsp;@&nbsp;</font>
     1624     * <font style='background-color: #463246;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #463246'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #463246'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #463246'>&nbsp;@&nbsp;</font><font style='background-color: #463246; color: #888888'>&nbsp;@&nbsp;</font>
     1625     * <font style='background-color: #463246;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #463246; color: #ffffff'>&nbsp;@&nbsp;</font>
     1626     * </pre>
     1627     */
    -1628    public static final float PRUNE = -0x1.f90872p125F;
    -1629    static { NAMED.put("Prune", -0x1.f90872p125F); LIST.add(-0x1.f90872p125F); }
    +1628    public static final float PRUNE = -0x1.f9087p125F;
    +1629    static { NAMED.put("Prune", -0x1.f9087p125F); LIST.add(-0x1.f9087p125F); }
     1630
     1631    /**
    -1632     * This color constant "Dusty Grape" has RGBA8888 code {@code 724072FF}, L 0.3372549, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.18195479, and chroma 0.1008085.
    +1632     * This color constant "Dusty Grape" has RGBA8888 code {@code 724072FF}, L 0.3372549, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.44197983, and chroma 0.1008085.
     1633     * It can be represented as a packed float with the constant {@code -0x1.f114acp125F}.
     1634     * <pre>
     1635     * <font style='background-color: #724072;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #724072; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1654,7 +1654,7 @@
     1641    static { NAMED.put("Dusty Grape", -0x1.f114acp125F); LIST.add(-0x1.f114acp125F); }
     1642
     1643    /**
    -1644     * This color constant "Pink Violet" has RGBA8888 code {@code 8F578FFF}, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.13027532, and chroma 0.1008085.
    +1644     * This color constant "Pink Violet" has RGBA8888 code {@code 8F578FFF}, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.37792477, and chroma 0.1008085.
     1645     * It can be represented as a packed float with the constant {@code -0x1.f114ep125F}.
     1646     * <pre>
     1647     * <font style='background-color: #8F578F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F578F; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1666,7 +1666,7 @@
     1653    static { NAMED.put("Pink Violet", -0x1.f114ep125F); LIST.add(-0x1.f114ep125F); }
     1654
     1655    /**
    -1656     * This color constant "Ripe Plum" has RGBA8888 code {@code AB57ABFF}, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.9052252, saturation 0.23956598, and chroma 0.14626285.
    +1656     * This color constant "Ripe Plum" has RGBA8888 code {@code AB57ABFF}, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.911086, saturation 0.5099449, and chroma 0.14626285.
     1657     * It can be represented as a packed float with the constant {@code -0x1.eb1efcp125F}.
     1658     * <pre>
     1659     * <font style='background-color: #AB57AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB57AB; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1678,7 +1678,7 @@
     1665    static { NAMED.put("Ripe Plum", -0x1.eb1efcp125F); LIST.add(-0x1.eb1efcp125F); }
     1666
     1667    /**
    -1668     * This color constant "Mauve" has RGBA8888 code {@code AB73ABFF}, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.09785124, and chroma 0.1008085.
    +1668     * This color constant "Mauve" has RGBA8888 code {@code AB73ABFF}, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.3259601, and chroma 0.1008085.
     1669     * It can be represented as a packed float with the constant {@code -0x1.f11518p125F}.
     1670     * <pre>
     1671     * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1690,91 +1690,91 @@
     1677    static { NAMED.put("Mauve", -0x1.f11518p125F); LIST.add(-0x1.f11518p125F); }
     1678
     1679    /**
    -1680     * This color constant "Ham" has RGBA8888 code {@code EBACE1FF}, L 0.7647059, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.90448654, saturation 0.28008983, and chroma 0.08992863.
    -1681     * It can be represented as a packed float with the constant {@code -0x1.f31386p125F}.
    +1680     * This color constant "Ham" has RGBA8888 code {@code EBACE1FF}, L 0.77254903, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.91398114, saturation 0.5830952, and chroma 0.08992863.
    +1681     * It can be represented as a packed float with the constant {@code -0x1.f3138ap125F}.
     1682     * <pre>
     1683     * <font style='background-color: #EBACE1;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EBACE1; color: #000000'>&nbsp;@&nbsp;</font>
     1684     * <font style='background-color: #EBACE1;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #EBACE1'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #EBACE1'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #EBACE1'>&nbsp;@&nbsp;</font><font style='background-color: #EBACE1; color: #888888'>&nbsp;@&nbsp;</font>
     1685     * <font style='background-color: #EBACE1;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #EBACE1; color: #ffffff'>&nbsp;@&nbsp;</font>
     1686     * </pre>
     1687     */
    -1688    public static final float HAM = -0x1.f31386p125F;
    -1689    static { NAMED.put("Ham", -0x1.f31386p125F); LIST.add(-0x1.f31386p125F); }
    +1688    public static final float HAM = -0x1.f3138ap125F;
    +1689    static { NAMED.put("Ham", -0x1.f3138ap125F); LIST.add(-0x1.f3138ap125F); }
     1690
     1691    /**
    -1692     * This color constant "Cotton Candy" has RGBA8888 code {@code FFDCF5FF}, L 0.8901961, A 0.5176471, B 0.49019608, alpha 1.0, hue 0.9192883, saturation 0.38934803, and chroma 0.040217306.
    -1693     * It can be represented as a packed float with the constant {@code -0x1.fb09c6p125F}.
    +1692     * This color constant "Cotton Candy" has RGBA8888 code {@code FFDCF5FF}, L 0.9019608, A 0.5176471, B 0.49019608, alpha 1.0, hue 0.939452, saturation 0.97912085, and chroma 0.040217306.
    +1693     * It can be represented as a packed float with the constant {@code -0x1.fb09ccp125F}.
     1694     * <pre>
     1695     * <font style='background-color: #FFDCF5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFDCF5; color: #000000'>&nbsp;@&nbsp;</font>
     1696     * <font style='background-color: #FFDCF5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFDCF5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFDCF5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFDCF5'>&nbsp;@&nbsp;</font><font style='background-color: #FFDCF5; color: #888888'>&nbsp;@&nbsp;</font>
     1697     * <font style='background-color: #FFDCF5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFDCF5; color: #ffffff'>&nbsp;@&nbsp;</font>
     1698     * </pre>
     1699     */
    -1700    public static final float COTTON_CANDY = -0x1.fb09c6p125F;
    -1701    static { NAMED.put("Cotton Candy", -0x1.fb09c6p125F); LIST.add(-0x1.fb09c6p125F); }
    +1700    public static final float COTTON_CANDY = -0x1.fb09ccp125F;
    +1701    static { NAMED.put("Cotton Candy", -0x1.fb09ccp125F); LIST.add(-0x1.fb09ccp125F); }
     1702
     1703    /**
    -1704     * This color constant "Silver Pink" has RGBA8888 code {@code E3C7E3FF}, L 0.8117647, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.12307692, and chroma 0.044538103.
    -1705     * It can be represented as a packed float with the constant {@code -0x1.f9099ep125F}.
    +1704     * This color constant "Silver Pink" has RGBA8888 code {@code E3C7E3FF}, L 0.8235294, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.4021346, and chroma 0.044538103.
    +1705     * It can be represented as a packed float with the constant {@code -0x1.f909a4p125F}.
     1706     * <pre>
     1707     * <font style='background-color: #E3C7E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3C7E3; color: #000000'>&nbsp;@&nbsp;</font>
     1708     * <font style='background-color: #E3C7E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E3C7E3'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E3C7E3'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E3C7E3'>&nbsp;@&nbsp;</font><font style='background-color: #E3C7E3; color: #888888'>&nbsp;@&nbsp;</font>
     1709     * <font style='background-color: #E3C7E3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E3C7E3; color: #ffffff'>&nbsp;@&nbsp;</font>
     1710     * </pre>
     1711     */
    -1712    public static final float SILVER_PINK = -0x1.f9099ep125F;
    -1713    static { NAMED.put("Silver Pink", -0x1.f9099ep125F); LIST.add(-0x1.f9099ep125F); }
    +1712    public static final float SILVER_PINK = -0x1.f909a4p125F;
    +1713    static { NAMED.put("Silver Pink", -0x1.f909a4p125F); LIST.add(-0x1.f909a4p125F); }
     1714
     1715    /**
    -1716     * This color constant "Tea Rose" has RGBA8888 code {@code E1B9D2FF}, L 0.7764706, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.93210673, saturation 0.11585003, and chroma 0.0471994.
    -1717     * It can be represented as a packed float with the constant {@code -0x1.fb0b8cp125F}.
    +1716     * This color constant "Tea Rose" has RGBA8888 code {@code E1B9D2FF}, L 0.78431374, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.9488043, saturation 0.42163703, and chroma 0.0471994.
    +1717     * It can be represented as a packed float with the constant {@code -0x1.fb0b9p125F}.
     1718     * <pre>
     1719     * <font style='background-color: #E1B9D2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E1B9D2; color: #000000'>&nbsp;@&nbsp;</font>
     1720     * <font style='background-color: #E1B9D2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E1B9D2'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E1B9D2'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E1B9D2'>&nbsp;@&nbsp;</font><font style='background-color: #E1B9D2; color: #888888'>&nbsp;@&nbsp;</font>
     1721     * <font style='background-color: #E1B9D2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E1B9D2; color: #ffffff'>&nbsp;@&nbsp;</font>
     1722     * </pre>
     1723     */
    -1724    public static final float TEA_ROSE = -0x1.fb0b8cp125F;
    -1725    static { NAMED.put("Tea Rose", -0x1.fb0b8cp125F); LIST.add(-0x1.fb0b8cp125F); }
    +1724    public static final float TEA_ROSE = -0x1.fb0b9p125F;
    +1725    static { NAMED.put("Tea Rose", -0x1.fb0b9p125F); LIST.add(-0x1.fb0b9p125F); }
     1726
     1727    /**
    -1728     * This color constant "Old Rose" has RGBA8888 code {@code D7A0BEFF}, L 0.7058824, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.954483, saturation 0.16594002, and chroma 0.069218926.
    -1729     * It can be represented as a packed float with the constant {@code -0x1.fb1168p125F}.
    +1728     * This color constant "Old Rose" has RGBA8888 code {@code D7A0BEFF}, L 0.70980394, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.96519506, saturation 0.46097723, and chroma 0.069218926.
    +1729     * It can be represented as a packed float with the constant {@code -0x1.fb116ap125F}.
     1730     * <pre>
     1731     * <font style='background-color: #D7A0BE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D7A0BE; color: #000000'>&nbsp;@&nbsp;</font>
     1732     * <font style='background-color: #D7A0BE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D7A0BE'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D7A0BE'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D7A0BE'>&nbsp;@&nbsp;</font><font style='background-color: #D7A0BE; color: #888888'>&nbsp;@&nbsp;</font>
     1733     * <font style='background-color: #D7A0BE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D7A0BE; color: #ffffff'>&nbsp;@&nbsp;</font>
     1734     * </pre>
     1735     */
    -1736    public static final float OLD_ROSE = -0x1.fb1168p125F;
    -1737    static { NAMED.put("Old Rose", -0x1.fb1168p125F); LIST.add(-0x1.fb1168p125F); }
    +1736    public static final float OLD_ROSE = -0x1.fb116ap125F;
    +1737    static { NAMED.put("Old Rose", -0x1.fb116ap125F); LIST.add(-0x1.fb116ap125F); }
     1738
     1739    /**
    -1740     * This color constant "Dusty Pink" has RGBA8888 code {@code C78FB9FF}, L 0.64705884, A 0.5372549, B 0.48235294, alpha 1.0, hue 0.9295985, saturation 0.1030243, and chroma 0.0821242.
    -1741     * It can be represented as a packed float with the constant {@code -0x1.f7134ap125F}.
    +1740     * This color constant "Dusty Pink" has RGBA8888 code {@code C78FB9FF}, L 0.6509804, A 0.5372549, B 0.48235294, alpha 1.0, hue 0.939452, saturation 0.359011, and chroma 0.0821242.
    +1741     * It can be represented as a packed float with the constant {@code -0x1.f7134cp125F}.
     1742     * <pre>
     1743     * <font style='background-color: #C78FB9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C78FB9; color: #000000'>&nbsp;@&nbsp;</font>
     1744     * <font style='background-color: #C78FB9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C78FB9'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C78FB9'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C78FB9'>&nbsp;@&nbsp;</font><font style='background-color: #C78FB9; color: #888888'>&nbsp;@&nbsp;</font>
     1745     * <font style='background-color: #C78FB9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C78FB9; color: #ffffff'>&nbsp;@&nbsp;</font>
     1746     * </pre>
     1747     */
    -1748    public static final float DUSTY_PINK = -0x1.f7134ap125F;
    -1749    static { NAMED.put("Dusty Pink", -0x1.f7134ap125F); LIST.add(-0x1.f7134ap125F); }
    +1748    public static final float DUSTY_PINK = -0x1.f7134cp125F;
    +1749    static { NAMED.put("Dusty Pink", -0x1.f7134cp125F); LIST.add(-0x1.f7134cp125F); }
     1750
     1751    /**
    -1752     * This color constant "Roseate Spoonbill" has RGBA8888 code {@code C87DA0FF}, L 0.6, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.96592754, saturation 0.13739227, and chroma 0.091942206.
    -1753     * It can be represented as a packed float with the constant {@code -0x1.fb1732p125F}.
    +1752     * This color constant "Roseate Spoonbill" has RGBA8888 code {@code C87DA0FF}, L 0.6039216, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.9737039, saturation 0.40551752, and chroma 0.091942206.
    +1753     * It can be represented as a packed float with the constant {@code -0x1.fb1734p125F}.
     1754     * <pre>
     1755     * <font style='background-color: #C87DA0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C87DA0; color: #000000'>&nbsp;@&nbsp;</font>
     1756     * <font style='background-color: #C87DA0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C87DA0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C87DA0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C87DA0'>&nbsp;@&nbsp;</font><font style='background-color: #C87DA0; color: #888888'>&nbsp;@&nbsp;</font>
     1757     * <font style='background-color: #C87DA0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C87DA0; color: #ffffff'>&nbsp;@&nbsp;</font>
     1758     * </pre>
     1759     */
    -1760    public static final float ROSEATE_SPOONBILL = -0x1.fb1732p125F;
    -1761    static { NAMED.put("Roseate Spoonbill", -0x1.fb1732p125F); LIST.add(-0x1.fb1732p125F); }
    +1760    public static final float ROSEATE_SPOONBILL = -0x1.fb1734p125F;
    +1761    static { NAMED.put("Roseate Spoonbill", -0x1.fb1734p125F); LIST.add(-0x1.fb1734p125F); }
     1762
     1763    /**
    -1764     * This color constant "Thulian Pink" has RGBA8888 code {@code C35A91FF}, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.95994633, saturation 0.24846612, and chroma 0.1411665.
    +1764     * This color constant "Thulian Pink" has RGBA8888 code {@code C35A91FF}, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.96519506, saturation 0.51941097, and chroma 0.1411665.
     1765     * It can be represented as a packed float with the constant {@code -0x1.f7230ap125F}.
     1766     * <pre>
     1767     * <font style='background-color: #C35A91;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C35A91; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1786,7 +1786,7 @@
     1773    static { NAMED.put("Thulian Pink", -0x1.f7230ap125F); LIST.add(-0x1.f7230ap125F); }
     1774
     1775    /**
    -1776     * This color constant "Brown Velvet" has RGBA8888 code {@code 4B2837FF}, L 0.2, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.96857655, saturation 0.14266118, and chroma 0.059754133.
    +1776     * This color constant "Brown Velvet" has RGBA8888 code {@code 4B2837FF}, L 0.2, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.98019654, saturation 0.42432937, and chroma 0.059754133.
     1777     * It can be represented as a packed float with the constant {@code -0x1.fd0e66p125F}.
     1778     * <pre>
     1779     * <font style='background-color: #4B2837;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4B2837; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1798,19 +1798,19 @@
     1785    static { NAMED.put("Brown Velvet", -0x1.fd0e66p125F); LIST.add(-0x1.fd0e66p125F); }
     1786
     1787    /**
    -1788     * This color constant "Nightshade" has RGBA8888 code {@code 321623FF}, L 0.11764706, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.96857655, saturation 0.25154528, and chroma 0.059754133.
    -1789     * It can be represented as a packed float with the constant {@code -0x1.fd0e3cp125F}.
    +1788     * This color constant "Nightshade" has RGBA8888 code {@code 321623FF}, L 0.11372549, A 0.5254902, B 0.49411765, alpha 1.0, hue 0.97740346, saturation 0.5050763, and chroma 0.052115876.
    +1789     * It can be represented as a packed float with the constant {@code -0x1.fd0c3ap125F}.
     1790     * <pre>
     1791     * <font style='background-color: #321623;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #321623; color: #000000'>&nbsp;@&nbsp;</font>
     1792     * <font style='background-color: #321623;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #321623'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #321623'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #321623'>&nbsp;@&nbsp;</font><font style='background-color: #321623; color: #888888'>&nbsp;@&nbsp;</font>
     1793     * <font style='background-color: #321623;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #321623; color: #ffffff'>&nbsp;@&nbsp;</font>
     1794     * </pre>
     1795     */
    -1796    public static final float NIGHTSHADE = -0x1.fd0e3cp125F;
    -1797    static { NAMED.put("Nightshade", -0x1.fd0e3cp125F); LIST.add(-0x1.fd0e3cp125F); }
    +1796    public static final float NIGHTSHADE = -0x1.fd0c3ap125F;
    +1797    static { NAMED.put("Nightshade", -0x1.fd0c3ap125F); LIST.add(-0x1.fd0c3ap125F); }
     1798
     1799    /**
    -1800     * This color constant "Scribe Ink" has RGBA8888 code {@code 280A1EFF}, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9378436, saturation 0.51980007, and chroma 0.071815535.
    +1800     * This color constant "Scribe Ink" has RGBA8888 code {@code 280A1EFF}, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9488043, saturation 0.79056937, and chroma 0.071815535.
     1801     * It can be represented as a packed float with the constant {@code -0x1.f91028p125F}.
     1802     * <pre>
     1803     * <font style='background-color: #280A1E;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #280A1E; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1822,7 +1822,7 @@
     1809    static { NAMED.put("Scribe Ink", -0x1.f91028p125F); LIST.add(-0x1.f91028p125F); }
     1810
     1811    /**
    -1812     * This color constant "Varnish" has RGBA8888 code {@code 401811FF}, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.3516231, and chroma 0.068331465.
    +1812     * This color constant "Varnish" has RGBA8888 code {@code 401811FF}, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.62893206, and chroma 0.068331465.
     1813     * It can be represented as a packed float with the constant {@code -0x1.090e46p126F}.
     1814     * <pre>
     1815     * <font style='background-color: #401811;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #401811; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1834,7 +1834,7 @@
     1821    static { NAMED.put("Varnish", -0x1.090e46p126F); LIST.add(-0x1.090e46p126F); }
     1822
     1823    /**
    -1824     * This color constant "Cedar Wood" has RGBA8888 code {@code 621800FF}, L 0.2, A 0.54901963, B 0.53333336, alpha 1.0, hue 0.095056064, saturation 0.8144353, and chroma 0.11809544.
    +1824     * This color constant "Cedar Wood" has RGBA8888 code {@code 621800FF}, L 0.2, A 0.54901963, B 0.53333336, alpha 1.0, hue 0.09638812, saturation 0.9035079, and chroma 0.11809544.
     1825     * It can be represented as a packed float with the constant {@code -0x1.111866p126F}.
     1826     * <pre>
     1827     * <font style='background-color: #621800;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #621800; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1846,7 +1846,7 @@
     1833    static { NAMED.put("Cedar Wood", -0x1.111866p126F); LIST.add(-0x1.111866p126F); }
     1834
     1835    /**
    -1836     * This color constant "Hot Sauce" has RGBA8888 code {@code A5140AFF}, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.08136994, saturation 0.8018141, and chroma 0.1836353.
    +1836     * This color constant "Hot Sauce" has RGBA8888 code {@code A5140AFF}, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.0826307, saturation 0.94850093, and chroma 0.1836353.
     1837     * It can be represented as a packed float with the constant {@code -0x1.1728aap126F}.
     1838     * <pre>
     1839     * <font style='background-color: #A5140A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A5140A; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1858,19 +1858,19 @@
     1845    static { NAMED.put("Hot Sauce", -0x1.1728aap126F); LIST.add(-0x1.1728aap126F); }
     1846
     1847    /**
    -1848     * This color constant "Lurid Red" has RGBA8888 code {@code DA2010FF}, L 0.4509804, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.08299518, saturation 0.7767863, and chroma 0.21173172.
    -1849     * It can be represented as a packed float with the constant {@code -0x1.1b2ee6p126F}.
    +1848     * This color constant "Lurid Red" has RGBA8888 code {@code DA2010FF}, L 0.44705883, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.084052734, saturation 0.89628667, and chroma 0.21173172.
    +1849     * It can be represented as a packed float with the constant {@code -0x1.1b2ee4p126F}.
     1850     * <pre>
     1851     * <font style='background-color: #DA2010;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DA2010; color: #000000'>&nbsp;@&nbsp;</font>
     1852     * <font style='background-color: #DA2010;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #DA2010'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #DA2010'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #DA2010'>&nbsp;@&nbsp;</font><font style='background-color: #DA2010; color: #888888'>&nbsp;@&nbsp;</font>
     1853     * <font style='background-color: #DA2010;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DA2010; color: #ffffff'>&nbsp;@&nbsp;</font>
     1854     * </pre>
     1855     */
    -1856    public static final float LURID_RED = -0x1.1b2ee6p126F;
    -1857    static { NAMED.put("Lurid Red", -0x1.1b2ee6p126F); LIST.add(-0x1.1b2ee6p126F); }
    +1856    public static final float LURID_RED = -0x1.1b2ee4p126F;
    +1857    static { NAMED.put("Lurid Red", -0x1.1b2ee4p126F); LIST.add(-0x1.1b2ee4p126F); }
     1858
     1859    /**
    -1860     * This color constant "Brick" has RGBA8888 code {@code D5524AFF}, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.07195936, saturation 0.3226597, and chroma 0.15199278.
    +1860     * This color constant "Brick" has RGBA8888 code {@code D5524AFF}, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.073790275, saturation 0.60073465, and chroma 0.15199278.
     1861     * It can be represented as a packed float with the constant {@code -0x1.112306p126F}.
     1862     * <pre>
     1863     * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1882,79 +1882,79 @@
     1869    static { NAMED.put("Brick", -0x1.112306p126F); LIST.add(-0x1.112306p126F); }
     1870
     1871    /**
    -1872     * This color constant "Bright Red" has RGBA8888 code {@code FF3C0AFF}, L 0.54509807, A 0.5921569, B 0.5647059, alpha 1.0, hue 0.097439915, saturation 0.844288, and chroma 0.22432896.
    -1873     * It can be represented as a packed float with the constant {@code -0x1.212f16p126F}.
    +1872     * This color constant "Bright Red" has RGBA8888 code {@code FF3C0AFF}, L 0.54901963, A 0.5921569, B 0.5647059, alpha 1.0, hue 0.09809959, saturation 0.9803628, and chroma 0.22432896.
    +1873     * It can be represented as a packed float with the constant {@code -0x1.212f18p126F}.
     1874     * <pre>
     1875     * <font style='background-color: #FF3C0A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF3C0A; color: #000000'>&nbsp;@&nbsp;</font>
     1876     * <font style='background-color: #FF3C0A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF3C0A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF3C0A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF3C0A'>&nbsp;@&nbsp;</font><font style='background-color: #FF3C0A; color: #888888'>&nbsp;@&nbsp;</font>
     1877     * <font style='background-color: #FF3C0A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF3C0A; color: #ffffff'>&nbsp;@&nbsp;</font>
     1878     * </pre>
     1879     */
    -1880    public static final float BRIGHT_RED = -0x1.212f16p126F;
    -1881    static { NAMED.put("Bright Red", -0x1.212f16p126F); LIST.add(-0x1.212f16p126F); }
    +1880    public static final float BRIGHT_RED = -0x1.212f18p126F;
    +1881    static { NAMED.put("Bright Red", -0x1.212f18p126F); LIST.add(-0x1.212f18p126F); }
     1882
     1883    /**
    -1884     * This color constant "Embers" has RGBA8888 code {@code F55A32FF}, L 0.57254905, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10581406, saturation 0.668431, and chroma 0.1836353.
    -1885     * It can be represented as a packed float with the constant {@code -0x1.1d2524p126F}.
    +1884     * This color constant "Embers" has RGBA8888 code {@code F55A32FF}, L 0.5764706, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10637331, saturation 0.86455137, and chroma 0.1836353.
    +1885     * It can be represented as a packed float with the constant {@code -0x1.1d2526p126F}.
     1886     * <pre>
     1887     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #000000'>&nbsp;@&nbsp;</font>
     1888     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #F55A32; color: #888888'>&nbsp;@&nbsp;</font>
     1889     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #ffffff'>&nbsp;@&nbsp;</font>
     1890     * </pre>
     1891     */
    -1892    public static final float EMBERS = -0x1.1d2524p126F;
    -1893    static { NAMED.put("Embers", -0x1.1d2524p126F); LIST.add(-0x1.1d2524p126F); }
    +1892    public static final float EMBERS = -0x1.1d2526p126F;
    +1893    static { NAMED.put("Embers", -0x1.1d2526p126F); LIST.add(-0x1.1d2526p126F); }
     1894
     1895    /**
    -1896     * This color constant "Salmon" has RGBA8888 code {@code FF6262FF}, L 0.6117647, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06254671, saturation 0.8039996, and chroma 0.17337766.
    -1897     * It can be represented as a packed float with the constant {@code -0x1.112938p126F}.
    +1896     * This color constant "Salmon" has RGBA8888 code {@code FF6262FF}, L 0.6156863, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06443131, saturation 0.9722263, and chroma 0.17337766.
    +1897     * It can be represented as a packed float with the constant {@code -0x1.11293ap126F}.
     1898     * <pre>
     1899     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #000000'>&nbsp;@&nbsp;</font>
     1900     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #FF6262; color: #888888'>&nbsp;@&nbsp;</font>
     1901     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #ffffff'>&nbsp;@&nbsp;</font>
     1902     * </pre>
     1903     */
    -1904    public static final float SALMON = -0x1.112938p126F;
    -1905    static { NAMED.put("Salmon", -0x1.112938p126F); LIST.add(-0x1.112938p126F); }
    +1904    public static final float SALMON = -0x1.11293ap126F;
    +1905    static { NAMED.put("Salmon", -0x1.11293ap126F); LIST.add(-0x1.11293ap126F); }
     1906
     1907    /**
    -1908     * This color constant "Taxicab Yellow" has RGBA8888 code {@code F6BD31FF}, L 0.77254903, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24593177, saturation 0.6745706, and chroma 0.15239382.
    -1909     * It can be represented as a packed float with the constant {@code -0x1.27018ap126F}.
    +1908     * This color constant "Taxicab Yellow" has RGBA8888 code {@code F6BD31FF}, L 0.78039217, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24205942, saturation 0.8706515, and chroma 0.15239382.
    +1909     * It can be represented as a packed float with the constant {@code -0x1.27018ep126F}.
     1910     * <pre>
     1911     * <font style='background-color: #F6BD31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F6BD31; color: #000000'>&nbsp;@&nbsp;</font>
     1912     * <font style='background-color: #F6BD31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F6BD31'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F6BD31'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F6BD31'>&nbsp;@&nbsp;</font><font style='background-color: #F6BD31; color: #888888'>&nbsp;@&nbsp;</font>
     1913     * <font style='background-color: #F6BD31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F6BD31; color: #ffffff'>&nbsp;@&nbsp;</font>
     1914     * </pre>
     1915     */
    -1916    public static final float TAXICAB_YELLOW = -0x1.27018ap126F;
    -1917    static { NAMED.put("Taxicab Yellow", -0x1.27018ap126F); LIST.add(-0x1.27018ap126F); }
    +1916    public static final float TAXICAB_YELLOW = -0x1.27018ep126F;
    +1917    static { NAMED.put("Taxicab Yellow", -0x1.27018ep126F); LIST.add(-0x1.27018ep126F); }
     1918
     1919    /**
    -1920     * This color constant "Apricot" has RGBA8888 code {@code FFA53CFF}, L 0.7294118, A 0.5254902, B 0.5686275, alpha 1.0, hue 0.19341156, saturation 0.70395154, and chroma 0.14584495.
    -1921     * It can be represented as a packed float with the constant {@code -0x1.230d74p126F}.
    +1920     * This color constant "Apricot" has RGBA8888 code {@code FFA53CFF}, L 0.7372549, A 0.5254902, B 0.5686275, alpha 1.0, hue 0.19098291, saturation 0.9904209, and chroma 0.14584495.
    +1921     * It can be represented as a packed float with the constant {@code -0x1.230d78p126F}.
     1922     * <pre>
     1923     * <font style='background-color: #FFA53C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA53C; color: #000000'>&nbsp;@&nbsp;</font>
     1924     * <font style='background-color: #FFA53C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA53C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA53C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA53C'>&nbsp;@&nbsp;</font><font style='background-color: #FFA53C; color: #888888'>&nbsp;@&nbsp;</font>
     1925     * <font style='background-color: #FFA53C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA53C; color: #ffffff'>&nbsp;@&nbsp;</font>
     1926     * </pre>
     1927     */
    -1928    public static final float APRICOT = -0x1.230d74p126F;
    -1929    static { NAMED.put("Apricot", -0x1.230d74p126F); LIST.add(-0x1.230d74p126F); }
    +1928    public static final float APRICOT = -0x1.230d78p126F;
    +1929    static { NAMED.put("Apricot", -0x1.230d78p126F); LIST.add(-0x1.230d78p126F); }
     1930
     1931    /**
    -1932     * This color constant "Burnt Yellow" has RGBA8888 code {@code D79B0FFF}, L 0.65882355, A 0.5058824, B 0.57254905, alpha 1.0, hue 0.23712316, saturation 0.76290655, and chroma 0.14500555.
    -1933     * It can be represented as a packed float with the constant {@code -0x1.25035p126F}.
    +1932     * This color constant "Burnt Yellow" has RGBA8888 code {@code D79B0FFF}, L 0.6627451, A 0.5058824, B 0.57254905, alpha 1.0, hue 0.23330018, saturation 0.9319499, and chroma 0.14500555.
    +1933     * It can be represented as a packed float with the constant {@code -0x1.250352p126F}.
     1934     * <pre>
     1935     * <font style='background-color: #D79B0F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D79B0F; color: #000000'>&nbsp;@&nbsp;</font>
     1936     * <font style='background-color: #D79B0F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D79B0F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D79B0F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D79B0F'>&nbsp;@&nbsp;</font><font style='background-color: #D79B0F; color: #888888'>&nbsp;@&nbsp;</font>
     1937     * <font style='background-color: #D79B0F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D79B0F; color: #ffffff'>&nbsp;@&nbsp;</font>
     1938     * </pre>
     1939     */
    -1940    public static final float BURNT_YELLOW = -0x1.25035p126F;
    -1941    static { NAMED.put("Burnt Yellow", -0x1.25035p126F); LIST.add(-0x1.25035p126F); }
    +1940    public static final float BURNT_YELLOW = -0x1.250352p126F;
    +1941    static { NAMED.put("Burnt Yellow", -0x1.250352p126F); LIST.add(-0x1.250352p126F); }
     1942
     1943    /**
    -1944     * This color constant "Dry Pepper" has RGBA8888 code {@code DA6E0AFF}, L 0.5647059, A 0.5411765, B 0.5647059, alpha 1.0, hue 0.15979148, saturation 0.77262974, and chroma 0.15279381.
    +1944     * This color constant "Dry Pepper" has RGBA8888 code {@code DA6E0AFF}, L 0.5647059, A 0.5411765, B 0.5647059, alpha 1.0, hue 0.15858527, saturation 0.9203844, and chroma 0.15279381.
     1945     * It can be represented as a packed float with the constant {@code -0x1.21152p126F}.
     1946     * <pre>
     1947     * <font style='background-color: #DA6E0A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DA6E0A; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1966,7 +1966,7 @@
     1953    static { NAMED.put("Dry Pepper", -0x1.21152p126F); LIST.add(-0x1.21152p126F); }
     1954
     1955    /**
    -1956     * This color constant "Redwood" has RGBA8888 code {@code B45A00FF}, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15767807, saturation 0.7703894, and chroma 0.13542919.
    +1956     * This color constant "Redwood" has RGBA8888 code {@code B45A00FF}, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15640444, saturation 0.9245003, and chroma 0.13542919.
     1957     * It can be represented as a packed float with the constant {@code -0x1.1d12eep126F}.
     1958     * <pre>
     1959     * <font style='background-color: #B45A00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B45A00; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1978,7 +1978,7 @@
     1965    static { NAMED.put("Redwood", -0x1.1d12eep126F); LIST.add(-0x1.1d12eep126F); }
     1966
     1967    /**
    -1968     * This color constant "Koa" has RGBA8888 code {@code A04B05FF}, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15239218, saturation 0.81816477, and chroma 0.12896542.
    +1968     * This color constant "Koa" has RGBA8888 code {@code A04B05FF}, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15127131, saturation 0.9299811, and chroma 0.12896542.
     1969     * It can be represented as a packed float with the constant {@code -0x1.1b12cep126F}.
     1970     * <pre>
     1971     * <font style='background-color: #A04B05;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A04B05; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -1990,7 +1990,7 @@
     1977    static { NAMED.put("Koa", -0x1.1b12cep126F); LIST.add(-0x1.1b12cep126F); }
     1978
     1979    /**
    -1980     * This color constant "Ochre" has RGBA8888 code {@code 5F3214FF}, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15858527, saturation 0.5838377, and chroma 0.079095535.
    +1980     * This color constant "Ochre" has RGBA8888 code {@code 5F3214FF}, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15640444, saturation 0.8320503, and chroma 0.079095535.
     1981     * It can be represented as a packed float with the constant {@code -0x1.110a7cp126F}.
     1982     * <pre>
     1983     * <font style='background-color: #5F3214;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5F3214; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2002,19 +2002,19 @@
     1989    static { NAMED.put("Ochre", -0x1.110a7cp126F); LIST.add(-0x1.110a7cp126F); }
     1990
     1991    /**
    -1992     * This color constant "Dull Green" has RGBA8888 code {@code 53500AFF}, L 0.30588236, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30935085, saturation 0.700948, and chroma 0.096477255.
    -1993     * It can be represented as a packed float with the constant {@code -0x1.16f69cp126F}.
    +1992     * This color constant "Dull Green" has RGBA8888 code {@code 53500AFF}, L 0.3019608, A 0.48235294, B 0.5411765, alpha 1.0, hue 0.30549568, saturation 0.86701477, and chroma 0.08924734.
    +1993     * It can be represented as a packed float with the constant {@code -0x1.14f69ap126F}.
     1994     * <pre>
     1995     * <font style='background-color: #53500A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #53500A; color: #000000'>&nbsp;@&nbsp;</font>
     1996     * <font style='background-color: #53500A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #53500A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #53500A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #53500A'>&nbsp;@&nbsp;</font><font style='background-color: #53500A; color: #888888'>&nbsp;@&nbsp;</font>
     1997     * <font style='background-color: #53500A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #53500A; color: #ffffff'>&nbsp;@&nbsp;</font>
     1998     * </pre>
     1999     */
    -2000    public static final float DULL_GREEN = -0x1.16f69cp126F;
    -2001    static { NAMED.put("Dull Green", -0x1.16f69cp126F); LIST.add(-0x1.16f69cp126F); }
    +2000    public static final float DULL_GREEN = -0x1.14f69ap126F;
    +2001    static { NAMED.put("Dull Green", -0x1.14f69ap126F); LIST.add(-0x1.14f69ap126F); }
     2002
     2003    /**
    -2004     * This color constant "Army Green" has RGBA8888 code {@code 626200FF}, L 0.37254903, A 0.47843137, B 0.54901963, alpha 1.0, hue 0.31596267, saturation 0.7062722, and chroma 0.106691405.
    +2004     * This color constant "Army Green" has RGBA8888 code {@code 626200FF}, L 0.37254903, A 0.47843137, B 0.54901963, alpha 1.0, hue 0.30842525, saturation 0.92855924, and chroma 0.106691405.
     2005     * It can be represented as a packed float with the constant {@code -0x1.18f4bep126F}.
     2006     * <pre>
     2007     * <font style='background-color: #626200;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #626200; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2026,7 +2026,7 @@
     2013    static { NAMED.put("Army Green", -0x1.18f4bep126F); LIST.add(-0x1.18f4bep126F); }
     2014
     2015    /**
    -2016     * This color constant "Driftwood" has RGBA8888 code {@code 8C805AFF}, L 0.5137255, A 0.49803922, B 0.5254902, alpha 1.0, hue 0.26221767, saturation 0.12760368, and chroma 0.050931267.
    +2016     * This color constant "Driftwood" has RGBA8888 code {@code 8C805AFF}, L 0.5137255, A 0.49803922, B 0.5254902, alpha 1.0, hue 0.25, saturation 0.4117647, and chroma 0.050931267.
     2017     * It can be represented as a packed float with the constant {@code -0x1.0cff06p126F}.
     2018     * <pre>
     2019     * <font style='background-color: #8C805A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8C805A; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2038,115 +2038,115 @@
     2025    static { NAMED.put("Driftwood", -0x1.0cff06p126F); LIST.add(-0x1.0cff06p126F); }
     2026
     2027    /**
    -2028     * This color constant "Dry Brush" has RGBA8888 code {@code AC9400FF}, L 0.5882353, A 0.4862745, B 0.5686275, alpha 1.0, hue 0.28142345, saturation 0.77671087, and chroma 0.13942632.
    -2029     * It can be represented as a packed float with the constant {@code -0x1.22f92cp126F}.
    +2028     * This color constant "Dry Brush" has RGBA8888 code {@code AC9400FF}, L 0.5921569, A 0.4862745, B 0.5686275, alpha 1.0, hue 0.27629608, saturation 0.96043617, and chroma 0.13942632.
    +2029     * It can be represented as a packed float with the constant {@code -0x1.22f92ep126F}.
     2030     * <pre>
     2031     * <font style='background-color: #AC9400;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AC9400; color: #000000'>&nbsp;@&nbsp;</font>
     2032     * <font style='background-color: #AC9400;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AC9400'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AC9400'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AC9400'>&nbsp;@&nbsp;</font><font style='background-color: #AC9400; color: #888888'>&nbsp;@&nbsp;</font>
     2033     * <font style='background-color: #AC9400;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AC9400; color: #ffffff'>&nbsp;@&nbsp;</font>
     2034     * </pre>
     2035     */
    -2036    public static final float DRY_BRUSH = -0x1.22f92cp126F;
    -2037    static { NAMED.put("Dry Brush", -0x1.22f92cp126F); LIST.add(-0x1.22f92cp126F); }
    +2036    public static final float DRY_BRUSH = -0x1.22f92ep126F;
    +2037    static { NAMED.put("Dry Brush", -0x1.22f92ep126F); LIST.add(-0x1.22f92ep126F); }
     2038
     2039    /**
    -2040     * This color constant "Mush" has RGBA8888 code {@code B1B10AFF}, L 0.6666667, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.30842525, saturation 0.8074922, and chroma 0.1632233.
    -2041     * It can be represented as a packed float with the constant {@code -0x1.26f154p126F}.
    +2040     * This color constant "Mush" has RGBA8888 code {@code B1B10AFF}, L 0.6745098, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.3035705, saturation 0.96316457, and chroma 0.1632233.
    +2041     * It can be represented as a packed float with the constant {@code -0x1.26f158p126F}.
     2042     * <pre>
     2043     * <font style='background-color: #B1B10A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B1B10A; color: #000000'>&nbsp;@&nbsp;</font>
     2044     * <font style='background-color: #B1B10A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B1B10A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B1B10A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B1B10A'>&nbsp;@&nbsp;</font><font style='background-color: #B1B10A; color: #888888'>&nbsp;@&nbsp;</font>
     2045     * <font style='background-color: #B1B10A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B1B10A; color: #ffffff'>&nbsp;@&nbsp;</font>
     2046     * </pre>
     2047     */
    -2048    public static final float MUSH = -0x1.26f154p126F;
    -2049    static { NAMED.put("Mush", -0x1.26f154p126F); LIST.add(-0x1.26f154p126F); }
    +2048    public static final float MUSH = -0x1.26f158p126F;
    +2049    static { NAMED.put("Mush", -0x1.26f158p126F); LIST.add(-0x1.26f158p126F); }
     2050
     2051    /**
    -2052     * This color constant "Banana Pudding" has RGBA8888 code {@code E6D55AFF}, L 0.8117647, A 0.48235294, B 0.5647059, alpha 1.0, hue 0.29236877, saturation 0.45877856, and chroma 0.1336143.
    -2053     * It can be represented as a packed float with the constant {@code -0x1.20f79ep126F}.
    +2052     * This color constant "Banana Pudding" has RGBA8888 code {@code E6D55AFF}, L 0.8235294, A 0.48235294, B 0.5647059, alpha 1.0, hue 0.2867793, saturation 0.7128265, and chroma 0.1336143.
    +2053     * It can be represented as a packed float with the constant {@code -0x1.20f7a4p126F}.
     2054     * <pre>
     2055     * <font style='background-color: #E6D55A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E6D55A; color: #000000'>&nbsp;@&nbsp;</font>
     2056     * <font style='background-color: #E6D55A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E6D55A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E6D55A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E6D55A'>&nbsp;@&nbsp;</font><font style='background-color: #E6D55A; color: #888888'>&nbsp;@&nbsp;</font>
     2057     * <font style='background-color: #E6D55A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E6D55A; color: #ffffff'>&nbsp;@&nbsp;</font>
     2058     * </pre>
     2059     */
    -2060    public static final float BANANA_PUDDING = -0x1.20f79ep126F;
    -2061    static { NAMED.put("Banana Pudding", -0x1.20f79ep126F); LIST.add(-0x1.20f79ep126F); }
    +2060    public static final float BANANA_PUDDING = -0x1.20f7a4p126F;
    +2061    static { NAMED.put("Banana Pudding", -0x1.20f7a4p126F); LIST.add(-0x1.20f7a4p126F); }
     2062
     2063    /**
    -2064     * This color constant "Saffron" has RGBA8888 code {@code FFD510FF}, L 0.83137256, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27457327, saturation 0.8132536, and chroma 0.17789528.
    -2065     * It can be represented as a packed float with the constant {@code -0x1.2cf9a8p126F}.
    +2064     * This color constant "Saffron" has RGBA8888 code {@code FFD510FF}, L 0.84313726, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27065513, saturation 0.9467276, and chroma 0.17789528.
    +2065     * It can be represented as a packed float with the constant {@code -0x1.2cf9aep126F}.
     2066     * <pre>
     2067     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #000000'>&nbsp;@&nbsp;</font>
     2068     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #FFD510; color: #888888'>&nbsp;@&nbsp;</font>
     2069     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #ffffff'>&nbsp;@&nbsp;</font>
     2070     * </pre>
     2071     */
    -2072    public static final float SAFFRON = -0x1.2cf9a8p126F;
    -2073    static { NAMED.put("Saffron", -0x1.2cf9a8p126F); LIST.add(-0x1.2cf9a8p126F); }
    +2072    public static final float SAFFRON = -0x1.2cf9aep126F;
    +2073    static { NAMED.put("Saffron", -0x1.2cf9aep126F); LIST.add(-0x1.2cf9aep126F); }
     2074
     2075    /**
    -2076     * This color constant "Pencil Yellow" has RGBA8888 code {@code FFEA4AFF}, L 0.88235295, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.29171178, saturation 0.62957466, and chroma 0.1658202.
    -2077     * It can be represented as a packed float with the constant {@code -0x1.28f5c2p126F}.
    +2076     * This color constant "Pencil Yellow" has RGBA8888 code {@code FFEA4AFF}, L 0.89411765, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.28720093, saturation 0.9385666, and chroma 0.1658202.
    +2077     * It can be represented as a packed float with the constant {@code -0x1.28f5c8p126F}.
     2078     * <pre>
     2079     * <font style='background-color: #FFEA4A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFEA4A; color: #000000'>&nbsp;@&nbsp;</font>
     2080     * <font style='background-color: #FFEA4A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFEA4A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFEA4A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFEA4A'>&nbsp;@&nbsp;</font><font style='background-color: #FFEA4A; color: #888888'>&nbsp;@&nbsp;</font>
     2081     * <font style='background-color: #FFEA4A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFEA4A; color: #ffffff'>&nbsp;@&nbsp;</font>
     2082     * </pre>
     2083     */
    -2084    public static final float PENCIL_YELLOW = -0x1.28f5c2p126F;
    -2085    static { NAMED.put("Pencil Yellow", -0x1.28f5c2p126F); LIST.add(-0x1.28f5c2p126F); }
    +2084    public static final float PENCIL_YELLOW = -0x1.28f5c8p126F;
    +2085    static { NAMED.put("Pencil Yellow", -0x1.28f5c8p126F); LIST.add(-0x1.28f5c8p126F); }
     2086
     2087    /**
    -2088     * This color constant "Chartreuse" has RGBA8888 code {@code C8FF41FF}, L 0.8862745, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34942675, saturation 0.9817451, and chroma 0.2070681.
    -2089     * It can be represented as a packed float with the constant {@code -0x1.2ae1c4p126F}.
    +2088     * This color constant "Chartreuse" has RGBA8888 code {@code C8FF41FF}, L 0.89411765, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34525383, saturation 1.0441982, and chroma 0.2070681.
    +2089     * It can be represented as a packed float with the constant {@code -0x1.2ae1c8p126F}.
     2090     * <pre>
     2091     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #000000'>&nbsp;@&nbsp;</font>
     2092     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #C8FF41; color: #888888'>&nbsp;@&nbsp;</font>
     2093     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #ffffff'>&nbsp;@&nbsp;</font>
     2094     * </pre>
     2095     */
    -2096    public static final float CHARTREUSE = -0x1.2ae1c4p126F;
    -2097    static { NAMED.put("Chartreuse", -0x1.2ae1c4p126F); LIST.add(-0x1.2ae1c4p126F); }
    +2096    public static final float CHARTREUSE = -0x1.2ae1c8p126F;
    +2097    static { NAMED.put("Chartreuse", -0x1.2ae1c8p126F); LIST.add(-0x1.2ae1c8p126F); }
     2098
     2099    /**
    -2100     * This color constant "Absinthe" has RGBA8888 code {@code 9BF046FF}, L 0.8156863, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.37081593, saturation 0.6159092, and chroma 0.209995.
    -2101     * It can be represented as a packed float with the constant {@code -0x1.26dbap126F}.
    +2100     * This color constant "Absinthe" has RGBA8888 code {@code 9BF046FF}, L 0.8235294, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.36663744, saturation 0.8408515, and chroma 0.209995.
    +2101     * It can be represented as a packed float with the constant {@code -0x1.26dba4p126F}.
     2102     * <pre>
     2103     * <font style='background-color: #9BF046;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9BF046; color: #000000'>&nbsp;@&nbsp;</font>
     2104     * <font style='background-color: #9BF046;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #9BF046'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #9BF046'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #9BF046'>&nbsp;@&nbsp;</font><font style='background-color: #9BF046; color: #888888'>&nbsp;@&nbsp;</font>
     2105     * <font style='background-color: #9BF046;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9BF046; color: #ffffff'>&nbsp;@&nbsp;</font>
     2106     * </pre>
     2107     */
    -2108    public static final float ABSINTHE = -0x1.26dbap126F;
    -2109    static { NAMED.put("Absinthe", -0x1.26dbap126F); LIST.add(-0x1.26dbap126F); }
    +2108    public static final float ABSINTHE = -0x1.26dba4p126F;
    +2109    static { NAMED.put("Absinthe", -0x1.26dba4p126F); LIST.add(-0x1.26dba4p126F); }
     2110
     2111    /**
    -2112     * This color constant "Infection" has RGBA8888 code {@code 96DC19FF}, L 0.75686276, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.3624701, saturation 0.743936, and chroma 0.2105755.
    -2113     * It can be represented as a packed float with the constant {@code -0x1.28dd82p126F}.
    +2112     * This color constant "Infection" has RGBA8888 code {@code 96DC19FF}, L 0.7647059, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.35831934, saturation 0.9158818, and chroma 0.2105755.
    +2113     * It can be represented as a packed float with the constant {@code -0x1.28dd86p126F}.
     2114     * <pre>
     2115     * <font style='background-color: #96DC19;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #96DC19; color: #000000'>&nbsp;@&nbsp;</font>
     2116     * <font style='background-color: #96DC19;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #96DC19'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #96DC19'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #96DC19'>&nbsp;@&nbsp;</font><font style='background-color: #96DC19; color: #888888'>&nbsp;@&nbsp;</font>
     2117     * <font style='background-color: #96DC19;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #96DC19; color: #ffffff'>&nbsp;@&nbsp;</font>
     2118     * </pre>
     2119     */
    -2120    public static final float INFECTION = -0x1.28dd82p126F;
    -2121    static { NAMED.put("Infection", -0x1.28dd82p126F); LIST.add(-0x1.28dd82p126F); }
    +2120    public static final float INFECTION = -0x1.28dd86p126F;
    +2121    static { NAMED.put("Infection", -0x1.28dd86p126F); LIST.add(-0x1.28dd86p126F); }
     2122
     2123    /**
    -2124     * This color constant "Frog Green" has RGBA8888 code {@code 73C805FF}, L 0.6784314, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.37081593, saturation 0.78956354, and chroma 0.209995.
    -2125     * It can be represented as a packed float with the constant {@code -0x1.26db5ap126F}.
    +2124     * This color constant "Frog Green" has RGBA8888 code {@code 73C805FF}, L 0.68235296, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.36663744, saturation 0.96097314, and chroma 0.209995.
    +2125     * It can be represented as a packed float with the constant {@code -0x1.26db5cp126F}.
     2126     * <pre>
     2127     * <font style='background-color: #73C805;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73C805; color: #000000'>&nbsp;@&nbsp;</font>
     2128     * <font style='background-color: #73C805;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #73C805'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #73C805'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #73C805'>&nbsp;@&nbsp;</font><font style='background-color: #73C805; color: #888888'>&nbsp;@&nbsp;</font>
     2129     * <font style='background-color: #73C805;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #73C805; color: #ffffff'>&nbsp;@&nbsp;</font>
     2130     * </pre>
     2131     */
    -2132    public static final float FROG_GREEN = -0x1.26db5ap126F;
    -2133    static { NAMED.put("Frog Green", -0x1.26db5ap126F); LIST.add(-0x1.26db5ap126F); }
    +2132    public static final float FROG_GREEN = -0x1.26db5cp126F;
    +2133    static { NAMED.put("Frog Green", -0x1.26db5cp126F); LIST.add(-0x1.26db5cp126F); }
     2134
     2135    /**
    -2136     * This color constant "Avocado" has RGBA8888 code {@code 6AA805FF}, L 0.58431375, A 0.4392157, B 0.5686275, alpha 1.0, hue 0.3653732, saturation 0.7637348, and chroma 0.18263547.
    +2136     * This color constant "Avocado" has RGBA8888 code {@code 6AA805FF}, L 0.58431375, A 0.4392157, B 0.5686275, alpha 1.0, hue 0.36058098, saturation 0.9563571, and chroma 0.18263547.
     2137     * It can be represented as a packed float with the constant {@code -0x1.22e12ap126F}.
     2138     * <pre>
     2139     * <font style='background-color: #6AA805;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #6AA805; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2158,7 +2158,7 @@
     2145    static { NAMED.put("Avocado", -0x1.22e12ap126F); LIST.add(-0x1.22e12ap126F); }
     2146
     2147    /**
    -2148     * This color constant "Woodlands" has RGBA8888 code {@code 3C6E14FF}, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.375, saturation 0.63123345, and chroma 0.1381068.
    +2148     * This color constant "Woodlands" has RGBA8888 code {@code 3C6E14FF}, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.3686421, saturation 0.90727216, and chroma 0.1381068.
     2149     * It can be represented as a packed float with the constant {@code -0x1.18e6cp126F}.
     2150     * <pre>
     2151     * <font style='background-color: #3C6E14;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3C6E14; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2170,19 +2170,19 @@
     2157    static { NAMED.put("Woodlands", -0x1.18e6cp126F); LIST.add(-0x1.18e6cp126F); }
     2158
     2159    /**
    -2160     * This color constant "Dark Pine" has RGBA8888 code {@code 283405FF}, L 0.1764706, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3636593, saturation 0.52099174, and chroma 0.07753685.
    -2161     * It can be represented as a packed float with the constant {@code -0x1.0ef25ap126F}.
    +2160     * This color constant "Dark Pine" has RGBA8888 code {@code 283405FF}, L 0.17254902, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3524291, saturation 0.8695652, and chroma 0.07753685.
    +2161     * It can be represented as a packed float with the constant {@code -0x1.0ef258p126F}.
     2162     * <pre>
     2163     * <font style='background-color: #283405;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #283405; color: #000000'>&nbsp;@&nbsp;</font>
     2164     * <font style='background-color: #283405;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #283405'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #283405'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #283405'>&nbsp;@&nbsp;</font><font style='background-color: #283405; color: #888888'>&nbsp;@&nbsp;</font>
     2165     * <font style='background-color: #283405;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #283405; color: #ffffff'>&nbsp;@&nbsp;</font>
     2166     * </pre>
     2167     */
    -2168    public static final float DARK_PINE = -0x1.0ef25ap126F;
    -2169    static { NAMED.put("Dark Pine", -0x1.0ef25ap126F); LIST.add(-0x1.0ef25ap126F); }
    +2168    public static final float DARK_PINE = -0x1.0ef258p126F;
    +2169    static { NAMED.put("Dark Pine", -0x1.0ef258p126F); LIST.add(-0x1.0ef258p126F); }
     2170
     2171    /**
    -2172     * This color constant "Moss Green" has RGBA8888 code {@code 204608FF}, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.38294512, saturation 0.6363817, and chroma 0.11062346.
    +2172     * This color constant "Moss Green" has RGBA8888 code {@code 204608FF}, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.94280905, and chroma 0.11062346.
     2173     * It can be represented as a packed float with the constant {@code -0x1.12ea74p126F}.
     2174     * <pre>
     2175     * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2194,7 +2194,7 @@
     2181    static { NAMED.put("Moss Green", -0x1.12ea74p126F); LIST.add(-0x1.12ea74p126F); }
     2182
     2183    /**
    -2184     * This color constant "Fern Green" has RGBA8888 code {@code 0C5C0CFF}, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.40522522, saturation 0.9969778, and chroma 0.14626285.
    +2184     * This color constant "Fern Green" has RGBA8888 code {@code 0C5C0CFF}, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.399282, saturation 0.95390135, and chroma 0.14626285.
     2185     * It can be represented as a packed float with the constant {@code -0x1.14e096p126F}.
     2186     * <pre>
     2187     * <font style='background-color: #0C5C0C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0C5C0C; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2206,7 +2206,7 @@
     2193    static { NAMED.put("Fern Green", -0x1.14e096p126F); LIST.add(-0x1.14e096p126F); }
     2194
     2195    /**
    -2196     * This color constant "Forest Glen" has RGBA8888 code {@code 149605FF}, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.40057325, saturation 0.9817451, and chroma 0.2070681.
    +2196     * This color constant "Forest Glen" has RGBA8888 code {@code 149605FF}, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.39636543, saturation 0.9778058, and chroma 0.2070681.
     2197     * It can be represented as a packed float with the constant {@code -0x1.1ed4f8p126F}.
     2198     * <pre>
     2199     * <font style='background-color: #149605;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #149605; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2218,79 +2218,79 @@
     2205    static { NAMED.put("Forest Glen", -0x1.1ed4f8p126F); LIST.add(-0x1.1ed4f8p126F); }
     2206
     2207    /**
    -2208     * This color constant "Malachite" has RGBA8888 code {@code 0AD70AFF}, L 0.6862745, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.40182015, saturation 0.99775034, and chroma 0.26337513.
    -2209     * It can be represented as a packed float with the constant {@code -0x1.26c95ep126F}.
    +2208     * This color constant "Malachite" has RGBA8888 code {@code 0AD70AFF}, L 0.6901961, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.39851815, saturation 0.98825276, and chroma 0.26337513.
    +2209     * It can be represented as a packed float with the constant {@code -0x1.26c96p126F}.
     2210     * <pre>
     2211     * <font style='background-color: #0AD70A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0AD70A; color: #000000'>&nbsp;@&nbsp;</font>
     2212     * <font style='background-color: #0AD70A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0AD70A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0AD70A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0AD70A'>&nbsp;@&nbsp;</font><font style='background-color: #0AD70A; color: #888888'>&nbsp;@&nbsp;</font>
     2213     * <font style='background-color: #0AD70A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0AD70A; color: #ffffff'>&nbsp;@&nbsp;</font>
     2214     * </pre>
     2215     */
    -2216    public static final float MALACHITE = -0x1.26c95ep126F;
    -2217    static { NAMED.put("Malachite", -0x1.26c95ep126F); LIST.add(-0x1.26c95ep126F); }
    +2216    public static final float MALACHITE = -0x1.26c96p126F;
    +2217    static { NAMED.put("Malachite", -0x1.26c96p126F); LIST.add(-0x1.26c96p126F); }
     2218
     2219    /**
    -2220     * This color constant "Apple Green" has RGBA8888 code {@code 14E60AFF}, L 0.7294118, A 0.3882353, B 0.5803922, alpha 1.0, hue 0.4007443, saturation 0.96435034, and chroma 0.27427328.
    -2221     * It can be represented as a packed float with the constant {@code -0x1.28c774p126F}.
    +2220     * This color constant "Apple Green" has RGBA8888 code {@code 14E60AFF}, L 0.7372549, A 0.3882353, B 0.5803922, alpha 1.0, hue 0.3975709, saturation 0.9722222, and chroma 0.27427328.
    +2221     * It can be represented as a packed float with the constant {@code -0x1.28c778p126F}.
     2222     * <pre>
     2223     * <font style='background-color: #14E60A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #14E60A; color: #000000'>&nbsp;@&nbsp;</font>
     2224     * <font style='background-color: #14E60A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #14E60A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #14E60A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #14E60A'>&nbsp;@&nbsp;</font><font style='background-color: #14E60A; color: #888888'>&nbsp;@&nbsp;</font>
     2225     * <font style='background-color: #14E60A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #14E60A; color: #ffffff'>&nbsp;@&nbsp;</font>
     2226     * </pre>
     2227     */
    -2228    public static final float APPLE_GREEN = -0x1.28c774p126F;
    -2229    static { NAMED.put("Apple Green", -0x1.28c774p126F); LIST.add(-0x1.28c774p126F); }
    +2228    public static final float APPLE_GREEN = -0x1.28c778p126F;
    +2229    static { NAMED.put("Apple Green", -0x1.28c778p126F); LIST.add(-0x1.28c778p126F); }
     2230
     2231    /**
    -2232     * This color constant "Celery" has RGBA8888 code {@code 7DFF73FF}, L 0.84313726, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39695174, saturation 0.8276294, and chroma 0.20078278.
    -2233     * It can be represented as a packed float with the constant {@code -0x1.1ed7aep126F}.
    +2232     * This color constant "Celery" has RGBA8888 code {@code 7DFF73FF}, L 0.85490197, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39260027, saturation 1.0044117, and chroma 0.20078278.
    +2233     * It can be represented as a packed float with the constant {@code -0x1.1ed7b4p126F}.
     2234     * <pre>
     2235     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #000000'>&nbsp;@&nbsp;</font>
     2236     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #7DFF73; color: #888888'>&nbsp;@&nbsp;</font>
     2237     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #ffffff'>&nbsp;@&nbsp;</font>
     2238     * </pre>
     2239     */
    -2240    public static final float CELERY = -0x1.1ed7aep126F;
    -2241    static { NAMED.put("Celery", -0x1.1ed7aep126F); LIST.add(-0x1.1ed7aep126F); }
    +2240    public static final float CELERY = -0x1.1ed7b4p126F;
    +2241    static { NAMED.put("Celery", -0x1.1ed7b4p126F); LIST.add(-0x1.1ed7b4p126F); }
     2242
     2243    /**
    -2244     * This color constant "Mint Green" has RGBA8888 code {@code 4BF05AFF}, L 0.7764706, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.40565702, saturation 0.682674, and chroma 0.23076649.
    -2245     * It can be represented as a packed float with the constant {@code -0x1.20cf8cp126F}.
    +2244     * This color constant "Mint Green" has RGBA8888 code {@code 4BF05AFF}, L 0.78431374, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.4019004, saturation 0.7842902, and chroma 0.23076649.
    +2245     * It can be represented as a packed float with the constant {@code -0x1.20cf9p126F}.
     2246     * <pre>
     2247     * <font style='background-color: #4BF05A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4BF05A; color: #000000'>&nbsp;@&nbsp;</font>
     2248     * <font style='background-color: #4BF05A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #4BF05A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #4BF05A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #4BF05A'>&nbsp;@&nbsp;</font><font style='background-color: #4BF05A; color: #888888'>&nbsp;@&nbsp;</font>
     2249     * <font style='background-color: #4BF05A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4BF05A; color: #ffffff'>&nbsp;@&nbsp;</font>
     2250     * </pre>
     2251     */
    -2252    public static final float MINT_GREEN = -0x1.20cf8cp126F;
    -2253    static { NAMED.put("Mint Green", -0x1.20cf8cp126F); LIST.add(-0x1.20cf8cp126F); }
    +2252    public static final float MINT_GREEN = -0x1.20cf9p126F;
    +2253    static { NAMED.put("Mint Green", -0x1.20cf9p126F); LIST.add(-0x1.20cf9p126F); }
     2254
     2255    /**
    -2256     * This color constant "Emerald" has RGBA8888 code {@code 00C514FF}, L 0.6313726, A 0.4, B 0.57254905, alpha 1.0, hue 0.40009674, saturation 0.984562, and chroma 0.24612474.
    -2257     * It can be represented as a packed float with the constant {@code -0x1.24cd42p126F}.
    +2256     * This color constant "Emerald" has RGBA8888 code {@code 00C514FF}, L 0.63529414, A 0.4, B 0.57254905, alpha 1.0, hue 0.3965574, saturation 0.9812699, and chroma 0.24612474.
    +2257     * It can be represented as a packed float with the constant {@code -0x1.24cd44p126F}.
     2258     * <pre>
     2259     * <font style='background-color: #00C514;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00C514; color: #000000'>&nbsp;@&nbsp;</font>
     2260     * <font style='background-color: #00C514;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00C514'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00C514'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00C514'>&nbsp;@&nbsp;</font><font style='background-color: #00C514; color: #888888'>&nbsp;@&nbsp;</font>
     2261     * <font style='background-color: #00C514;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00C514; color: #ffffff'>&nbsp;@&nbsp;</font>
     2262     * </pre>
     2263     */
    -2264    public static final float EMERALD = -0x1.24cd42p126F;
    -2265    static { NAMED.put("Emerald", -0x1.24cd42p126F); LIST.add(-0x1.24cd42p126F); }
    +2264    public static final float EMERALD = -0x1.24cd44p126F;
    +2265    static { NAMED.put("Emerald", -0x1.24cd44p126F); LIST.add(-0x1.24cd44p126F); }
     2266
     2267    /**
    -2268     * This color constant "Prase" has RGBA8888 code {@code 05B450FF}, L 0.5882353, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4218265, saturation 0.9324576, and chroma 0.19048727.
    -2269     * It can be represented as a packed float with the constant {@code -0x1.16d52cp126F}.
    +2268     * This color constant "Prase" has RGBA8888 code {@code 05B450FF}, L 0.5921569, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4173693, saturation 0.9127084, and chroma 0.19048727.
    +2269     * It can be represented as a packed float with the constant {@code -0x1.16d52ep126F}.
     2270     * <pre>
     2271     * <font style='background-color: #05B450;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #05B450; color: #000000'>&nbsp;@&nbsp;</font>
     2272     * <font style='background-color: #05B450;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #05B450'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #05B450'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #05B450'>&nbsp;@&nbsp;</font><font style='background-color: #05B450; color: #888888'>&nbsp;@&nbsp;</font>
     2273     * <font style='background-color: #05B450;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #05B450; color: #ffffff'>&nbsp;@&nbsp;</font>
     2274     * </pre>
     2275     */
    -2276    public static final float PRASE = -0x1.16d52cp126F;
    -2277    static { NAMED.put("Prase", -0x1.16d52cp126F); LIST.add(-0x1.16d52cp126F); }
    +2276    public static final float PRASE = -0x1.16d52ep126F;
    +2277    static { NAMED.put("Prase", -0x1.16d52ep126F); LIST.add(-0x1.16d52ep126F); }
     2278
     2279    /**
    -2280     * This color constant "Eucalyptus" has RGBA8888 code {@code 1C8C4EFF}, L 0.46666667, A 0.43529412, B 0.5294118, alpha 1.0, hue 0.43210676, saturation 0.8010974, and chroma 0.1415982.
    +2280     * This color constant "Eucalyptus" has RGBA8888 code {@code 1C8C4EFF}, L 0.46666667, A 0.43529412, B 0.5294118, alpha 1.0, hue 0.42620972, saturation 0.8726119, and chroma 0.1415982.
     2281     * It can be represented as a packed float with the constant {@code -0x1.0edeeep126F}.
     2282     * <pre>
     2283     * <font style='background-color: #1C8C4E;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #1C8C4E; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2302,19 +2302,19 @@
     2289    static { NAMED.put("Eucalyptus", -0x1.0edeeep126F); LIST.add(-0x1.0edeeep126F); }
     2290
     2291    /**
    -2292     * This color constant "Zucchini" has RGBA8888 code {@code 123832FF}, L 0.18431373, A 0.47058824, B 0.49803922, alpha 1.0, hue 0.5105898, saturation 0.7379592, and chroma 0.058723815.
    -2293     * It can be represented as a packed float with the constant {@code -0x1.fef05ep125F}.
    +2292     * This color constant "Zucchini" has RGBA8888 code {@code 123832FF}, L 0.18039216, A 0.4745098, B 0.49803922, alpha 1.0, hue 0.49998704, saturation 0.7058824, and chroma 0.050931267.
    +2293     * It can be represented as a packed float with the constant {@code -0x1.fef25cp125F}.
     2294     * <pre>
     2295     * <font style='background-color: #123832;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #123832; color: #000000'>&nbsp;@&nbsp;</font>
     2296     * <font style='background-color: #123832;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #123832'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #123832'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #123832'>&nbsp;@&nbsp;</font><font style='background-color: #123832; color: #888888'>&nbsp;@&nbsp;</font>
     2297     * <font style='background-color: #123832;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #123832; color: #ffffff'>&nbsp;@&nbsp;</font>
     2298     * </pre>
     2299     */
    -2300    public static final float ZUCCHINI = -0x1.fef05ep125F;
    -2301    static { NAMED.put("Zucchini", -0x1.fef05ep125F); LIST.add(-0x1.fef05ep125F); }
    +2300    public static final float ZUCCHINI = -0x1.fef25cp125F;
    +2301    static { NAMED.put("Zucchini", -0x1.fef25cp125F); LIST.add(-0x1.fef25cp125F); }
     2302
     2303    /**
    -2304     * This color constant "Soft Teal" has RGBA8888 code {@code 129880FF}, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.49488065, saturation 0.9107692, and chroma 0.12115674.
    +2304     * This color constant "Soft Teal" has RGBA8888 code {@code 129880FF}, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.4894102, saturation 0.93958104, and chroma 0.12115674.
     2305     * It can be represented as a packed float with the constant {@code -0x1.00e108p126F}.
     2306     * <pre>
     2307     * <font style='background-color: #129880;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #129880; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2326,151 +2326,151 @@
     2313    static { NAMED.put("Soft Teal", -0x1.00e108p126F); LIST.add(-0x1.00e108p126F); }
     2314
     2315    /**
    -2316     * This color constant "Medium Teal" has RGBA8888 code {@code 06C491FF}, L 0.6509804, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.47172436, saturation 0.9115982, and chroma 0.15477823.
    -2317     * It can be represented as a packed float with the constant {@code -0x1.06d94cp126F}.
    +2316     * This color constant "Medium Teal" has RGBA8888 code {@code 06C491FF}, L 0.654902, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.46697098, saturation 0.94714576, and chroma 0.15477823.
    +2317     * It can be represented as a packed float with the constant {@code -0x1.06d94ep126F}.
     2318     * <pre>
     2319     * <font style='background-color: #06C491;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #06C491; color: #000000'>&nbsp;@&nbsp;</font>
     2320     * <font style='background-color: #06C491;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #06C491'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #06C491'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #06C491'>&nbsp;@&nbsp;</font><font style='background-color: #06C491; color: #888888'>&nbsp;@&nbsp;</font>
     2321     * <font style='background-color: #06C491;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #06C491; color: #ffffff'>&nbsp;@&nbsp;</font>
     2322     * </pre>
     2323     */
    -2324    public static final float MEDIUM_TEAL = -0x1.06d94cp126F;
    -2325    static { NAMED.put("Medium Teal", -0x1.06d94cp126F); LIST.add(-0x1.06d94cp126F); }
    +2324    public static final float MEDIUM_TEAL = -0x1.06d94ep126F;
    +2325    static { NAMED.put("Medium Teal", -0x1.06d94ep126F); LIST.add(-0x1.06d94ep126F); }
     2326
     2327    /**
    -2328     * This color constant "Spring Green" has RGBA8888 code {@code 00DE6AFF}, L 0.7176471, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42491466, saturation 0.94792074, and chroma 0.21487926.
    -2329     * It can be represented as a packed float with the constant {@code -0x1.18cf6ep126F}.
    +2328     * This color constant "Spring Green" has RGBA8888 code {@code 00DE6AFF}, L 0.72156864, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42098877, saturation 0.9252436, and chroma 0.21487926.
    +2329     * It can be represented as a packed float with the constant {@code -0x1.18cf7p126F}.
     2330     * <pre>
     2331     * <font style='background-color: #00DE6A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00DE6A; color: #000000'>&nbsp;@&nbsp;</font>
     2332     * <font style='background-color: #00DE6A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00DE6A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00DE6A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00DE6A'>&nbsp;@&nbsp;</font><font style='background-color: #00DE6A; color: #888888'>&nbsp;@&nbsp;</font>
     2333     * <font style='background-color: #00DE6A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00DE6A; color: #ffffff'>&nbsp;@&nbsp;</font>
     2334     * </pre>
     2335     */
    -2336    public static final float SPRING_GREEN = -0x1.18cf6ep126F;
    -2337    static { NAMED.put("Spring Green", -0x1.18cf6ep126F); LIST.add(-0x1.18cf6ep126F); }
    +2336    public static final float SPRING_GREEN = -0x1.18cf7p126F;
    +2337    static { NAMED.put("Spring Green", -0x1.18cf7p126F); LIST.add(-0x1.18cf7p126F); }
     2338
     2339    /**
    -2340     * This color constant "Turquoise" has RGBA8888 code {@code 2DEBA8FF}, L 0.77254903, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.46014452, saturation 0.83749604, and chroma 0.17337766.
    -2341     * It can be represented as a packed float with the constant {@code -0x1.0ad58ap126F}.
    +2340     * This color constant "Turquoise" has RGBA8888 code {@code 2DEBA8FF}, L 0.78039217, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.45571566, saturation 0.89144206, and chroma 0.17337766.
    +2341     * It can be represented as a packed float with the constant {@code -0x1.0ad58ep126F}.
     2342     * <pre>
     2343     * <font style='background-color: #2DEBA8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2DEBA8; color: #000000'>&nbsp;@&nbsp;</font>
     2344     * <font style='background-color: #2DEBA8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #2DEBA8'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #2DEBA8'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #2DEBA8'>&nbsp;@&nbsp;</font><font style='background-color: #2DEBA8; color: #888888'>&nbsp;@&nbsp;</font>
     2345     * <font style='background-color: #2DEBA8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2DEBA8; color: #ffffff'>&nbsp;@&nbsp;</font>
     2346     * </pre>
     2347     */
    -2348    public static final float TURQUOISE = -0x1.0ad58ap126F;
    -2349    static { NAMED.put("Turquoise", -0x1.0ad58ap126F); LIST.add(-0x1.0ad58ap126F); }
    +2348    public static final float TURQUOISE = -0x1.0ad58ep126F;
    +2349    static { NAMED.put("Turquoise", -0x1.0ad58ep126F); LIST.add(-0x1.0ad58ep126F); }
     2350
     2351    /**
    -2352     * This color constant "Seafoam" has RGBA8888 code {@code 3CFEA5FF}, L 0.827451, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.44880432, saturation 0.81632656, and chroma 0.18528971.
    -2353     * It can be represented as a packed float with the constant {@code -0x1.0ed3a6p126F}.
    +2352     * This color constant "Seafoam" has RGBA8888 code {@code 3CFEA5FF}, L 0.8352941, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.4445043, saturation 0.9753916, and chroma 0.18528971.
    +2353     * It can be represented as a packed float with the constant {@code -0x1.0ed3aap126F}.
     2354     * <pre>
     2355     * <font style='background-color: #3CFEA5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3CFEA5; color: #000000'>&nbsp;@&nbsp;</font>
     2356     * <font style='background-color: #3CFEA5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3CFEA5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3CFEA5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3CFEA5'>&nbsp;@&nbsp;</font><font style='background-color: #3CFEA5; color: #888888'>&nbsp;@&nbsp;</font>
     2357     * <font style='background-color: #3CFEA5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3CFEA5; color: #ffffff'>&nbsp;@&nbsp;</font>
     2358     * </pre>
     2359     */
    -2360    public static final float SEAFOAM = -0x1.0ed3a6p126F;
    -2361    static { NAMED.put("Seafoam", -0x1.0ed3a6p126F); LIST.add(-0x1.0ed3a6p126F); }
    +2360    public static final float SEAFOAM = -0x1.0ed3aap126F;
    +2361    static { NAMED.put("Seafoam", -0x1.0ed3aap126F); LIST.add(-0x1.0ed3aap126F); }
     2362
     2363    /**
    -2364     * This color constant "Variscite" has RGBA8888 code {@code 6AFFCDFF}, L 0.85490197, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47740343, saturation 0.80115366, and chroma 0.1381068.
    -2365     * It can be represented as a packed float with the constant {@code -0x1.04ddb4p126F}.
    +2364     * This color constant "Variscite" has RGBA8888 code {@code 6AFFCDFF}, L 0.8666667, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47218934, saturation 1.0154516, and chroma 0.1381068.
    +2365     * It can be represented as a packed float with the constant {@code -0x1.04ddbap126F}.
     2366     * <pre>
     2367     * <font style='background-color: #6AFFCD;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #6AFFCD; color: #000000'>&nbsp;@&nbsp;</font>
     2368     * <font style='background-color: #6AFFCD;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #6AFFCD'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #6AFFCD'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #6AFFCD'>&nbsp;@&nbsp;</font><font style='background-color: #6AFFCD; color: #888888'>&nbsp;@&nbsp;</font>
     2369     * <font style='background-color: #6AFFCD;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #6AFFCD; color: #ffffff'>&nbsp;@&nbsp;</font>
     2370     * </pre>
     2371     */
    -2372    public static final float VARISCITE = -0x1.04ddb4p126F;
    -2373    static { NAMED.put("Variscite", -0x1.04ddb4p126F); LIST.add(-0x1.04ddb4p126F); }
    +2372    public static final float VARISCITE = -0x1.04ddbap126F;
    +2373    static { NAMED.put("Variscite", -0x1.04ddbap126F); LIST.add(-0x1.04ddbap126F); }
     2374
     2375    /**
    -2376     * This color constant "Refreshing Mist" has RGBA8888 code {@code 91EBFFFF}, L 0.84313726, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59551346, saturation 0.88296545, and chroma 0.08992863.
    -2377     * It can be represented as a packed float with the constant {@code -0x1.f2edaep125F}.
    +2376     * This color constant "Refreshing Mist" has RGBA8888 code {@code 91EBFFFF}, L 0.8509804, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59359556, saturation 0.94057864, and chroma 0.08992863.
    +2377     * It can be represented as a packed float with the constant {@code -0x1.f2edb2p125F}.
     2378     * <pre>
     2379     * <font style='background-color: #91EBFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #91EBFF; color: #000000'>&nbsp;@&nbsp;</font>
     2380     * <font style='background-color: #91EBFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #91EBFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #91EBFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #91EBFF'>&nbsp;@&nbsp;</font><font style='background-color: #91EBFF; color: #888888'>&nbsp;@&nbsp;</font>
     2381     * <font style='background-color: #91EBFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #91EBFF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2382     * </pre>
     2383     */
    -2384    public static final float REFRESHING_MIST = -0x1.f2edaep125F;
    -2385    static { NAMED.put("Refreshing Mist", -0x1.f2edaep125F); LIST.add(-0x1.f2edaep125F); }
    +2384    public static final float REFRESHING_MIST = -0x1.f2edb2p125F;
    +2385    static { NAMED.put("Refreshing Mist", -0x1.f2edb2p125F); LIST.add(-0x1.f2edb2p125F); }
     2386
     2387    /**
    -2388     * This color constant "Shining Sky" has RGBA8888 code {@code 55E6FFFF}, L 0.8, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5843938, saturation 0.8966475, and chroma 0.13131043.
    -2389     * It can be represented as a packed float with the constant {@code -0x1.eee398p125F}.
    +2388     * This color constant "Shining Sky" has RGBA8888 code {@code 55E6FFFF}, L 0.80784315, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5826307, saturation 0.97724336, and chroma 0.13131043.
    +2389     * It can be represented as a packed float with the constant {@code -0x1.eee39cp125F}.
     2390     * <pre>
     2391     * <font style='background-color: #55E6FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #55E6FF; color: #000000'>&nbsp;@&nbsp;</font>
     2392     * <font style='background-color: #55E6FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #55E6FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #55E6FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #55E6FF'>&nbsp;@&nbsp;</font><font style='background-color: #55E6FF; color: #888888'>&nbsp;@&nbsp;</font>
     2393     * <font style='background-color: #55E6FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #55E6FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2394     * </pre>
     2395     */
    -2396    public static final float SHINING_SKY = -0x1.eee398p125F;
    -2397    static { NAMED.put("Shining Sky", -0x1.eee398p125F); LIST.add(-0x1.eee398p125F); }
    +2396    public static final float SHINING_SKY = -0x1.eee39cp125F;
    +2397    static { NAMED.put("Shining Sky", -0x1.eee39cp125F); LIST.add(-0x1.eee39cp125F); }
     2398
     2399    /**
    -2400     * This color constant "Steam" has RGBA8888 code {@code 7DD7F0FF}, L 0.7764706, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6063733, saturation 0.5221653, and chroma 0.0945603.
    -2401     * It can be represented as a packed float with the constant {@code -0x1.f0ed8cp125F}.
    +2400     * This color constant "Steam" has RGBA8888 code {@code 7DD7F0FF}, L 0.78431374, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6052204, saturation 0.71260965, and chroma 0.0945603.
    +2401     * It can be represented as a packed float with the constant {@code -0x1.f0ed9p125F}.
     2402     * <pre>
     2403     * <font style='background-color: #7DD7F0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DD7F0; color: #000000'>&nbsp;@&nbsp;</font>
     2404     * <font style='background-color: #7DD7F0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7DD7F0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7DD7F0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7DD7F0'>&nbsp;@&nbsp;</font><font style='background-color: #7DD7F0; color: #888888'>&nbsp;@&nbsp;</font>
     2405     * <font style='background-color: #7DD7F0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DD7F0; color: #ffffff'>&nbsp;@&nbsp;</font>
     2406     * </pre>
     2407     */
    -2408    public static final float STEAM = -0x1.f0ed8cp125F;
    -2409    static { NAMED.put("Steam", -0x1.f0ed8cp125F); LIST.add(-0x1.f0ed8cp125F); }
    +2408    public static final float STEAM = -0x1.f0ed9p125F;
    +2409    static { NAMED.put("Steam", -0x1.f0ed9p125F); LIST.add(-0x1.f0ed9p125F); }
     2410
     2411    /**
    -2412     * This color constant "Robin Egg Blue" has RGBA8888 code {@code 08DED5FF}, L 0.7490196, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5297675, saturation 0.90882874, and chroma 0.14709508.
    -2413     * It can be represented as a packed float with the constant {@code -0x1.f8db7ep125F}.
    +2412     * This color constant "Robin Egg Blue" has RGBA8888 code {@code 08DED5FF}, L 0.7529412, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5262961, saturation 0.96043617, and chroma 0.14709508.
    +2413     * It can be represented as a packed float with the constant {@code -0x1.f8db8p125F}.
     2414     * <pre>
     2415     * <font style='background-color: #08DED5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #08DED5; color: #000000'>&nbsp;@&nbsp;</font>
     2416     * <font style='background-color: #08DED5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #08DED5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #08DED5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #08DED5'>&nbsp;@&nbsp;</font><font style='background-color: #08DED5; color: #888888'>&nbsp;@&nbsp;</font>
     2417     * <font style='background-color: #08DED5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #08DED5; color: #ffffff'>&nbsp;@&nbsp;</font>
     2418     * </pre>
     2419     */
    -2420    public static final float ROBIN_EGG_BLUE = -0x1.f8db7ep125F;
    -2421    static { NAMED.put("Robin Egg Blue", -0x1.f8db7ep125F); LIST.add(-0x1.f8db7ep125F); }
    +2420    public static final float ROBIN_EGG_BLUE = -0x1.f8db8p125F;
    +2421    static { NAMED.put("Robin Egg Blue", -0x1.f8db8p125F); LIST.add(-0x1.f8db8p125F); }
     2422
     2423    /**
    -2424     * This color constant "Denim Blue" has RGBA8888 code {@code 109CDEFF}, L 0.57254905, A 0.45490196, B 0.4392157, alpha 1.0, hue 0.6483954, saturation 0.9083981, and chroma 0.15078327.
    -2425     * It can be represented as a packed float with the constant {@code -0x1.e0e924p125F}.
    +2424     * This color constant "Denim Blue" has RGBA8888 code {@code 109CDEFF}, L 0.57254905, A 0.45882353, B 0.4392157, alpha 1.0, hue 0.65640444, saturation 0.9013878, and chroma 0.14626285.
    +2425     * It can be represented as a packed float with the constant {@code -0x1.e0eb24p125F}.
     2426     * <pre>
     2427     * <font style='background-color: #109CDE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #109CDE; color: #000000'>&nbsp;@&nbsp;</font>
     2428     * <font style='background-color: #109CDE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #109CDE'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #109CDE'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #109CDE'>&nbsp;@&nbsp;</font><font style='background-color: #109CDE; color: #888888'>&nbsp;@&nbsp;</font>
     2429     * <font style='background-color: #109CDE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #109CDE; color: #ffffff'>&nbsp;@&nbsp;</font>
     2430     * </pre>
     2431     */
    -2432    public static final float DENIM_BLUE = -0x1.e0e924p125F;
    -2433    static { NAMED.put("Denim Blue", -0x1.e0e924p125F); LIST.add(-0x1.e0e924p125F); }
    +2432    public static final float DENIM_BLUE = -0x1.e0eb24p125F;
    +2433    static { NAMED.put("Denim Blue", -0x1.e0eb24p125F); LIST.add(-0x1.e0eb24p125F); }
     2434
     2435    /**
    -2436     * This color constant "Deep Teal" has RGBA8888 code {@code 055A5CFF}, L 0.30980393, A 0.4627451, B 0.4862745, alpha 1.0, hue 0.55616736, saturation 0.80987656, and chroma 0.079095535.
    -2437     * It can be represented as a packed float with the constant {@code -0x1.f8ec9ep125F}.
    +2436     * This color constant "Deep Teal" has RGBA8888 code {@code 055A5CFF}, L 0.30588236, A 0.4627451, B 0.4862745, alpha 1.0, hue 0.5511957, saturation 0.9035079, and chroma 0.079095535.
    +2437     * It can be represented as a packed float with the constant {@code -0x1.f8ec9cp125F}.
     2438     * <pre>
     2439     * <font style='background-color: #055A5C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #055A5C; color: #000000'>&nbsp;@&nbsp;</font>
     2440     * <font style='background-color: #055A5C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #055A5C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #055A5C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #055A5C'>&nbsp;@&nbsp;</font><font style='background-color: #055A5C; color: #888888'>&nbsp;@&nbsp;</font>
     2441     * <font style='background-color: #055A5C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #055A5C; color: #ffffff'>&nbsp;@&nbsp;</font>
     2442     * </pre>
     2443     */
    -2444    public static final float DEEP_TEAL = -0x1.f8ec9ep125F;
    -2445    static { NAMED.put("Deep Teal", -0x1.f8ec9ep125F); LIST.add(-0x1.f8ec9ep125F); }
    +2444    public static final float DEEP_TEAL = -0x1.f8ec9cp125F;
    +2445    static { NAMED.put("Deep Teal", -0x1.f8ec9cp125F); LIST.add(-0x1.f8ec9cp125F); }
     2446
     2447    /**
    -2448     * This color constant "Navy Blue" has RGBA8888 code {@code 162C52FF}, L 0.16862746, A 0.49019608, B 0.45882353, alpha 1.0, hue 0.7127991, saturation 0.3497842, and chroma 0.084324345.
    -2449     * It can be represented as a packed float with the constant {@code -0x1.eafa56p125F}.
    +2448     * This color constant "Navy Blue" has RGBA8888 code {@code 162C52FF}, L 0.16470589, A 0.49019608, B 0.45882353, alpha 1.0, hue 0.71857655, saturation 0.63737744, and chroma 0.084324345.
    +2449     * It can be represented as a packed float with the constant {@code -0x1.eafa54p125F}.
     2450     * <pre>
     2451     * <font style='background-color: #162C52;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #162C52; color: #000000'>&nbsp;@&nbsp;</font>
     2452     * <font style='background-color: #162C52;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #162C52'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #162C52'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #162C52'>&nbsp;@&nbsp;</font><font style='background-color: #162C52; color: #888888'>&nbsp;@&nbsp;</font>
     2453     * <font style='background-color: #162C52;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #162C52; color: #ffffff'>&nbsp;@&nbsp;</font>
     2454     * </pre>
     2455     */
    -2456    public static final float NAVY_BLUE = -0x1.eafa56p125F;
    -2457    static { NAMED.put("Navy Blue", -0x1.eafa56p125F); LIST.add(-0x1.eafa56p125F); }
    +2456    public static final float NAVY_BLUE = -0x1.eafa54p125F;
    +2457    static { NAMED.put("Navy Blue", -0x1.eafa54p125F); LIST.add(-0x1.eafa54p125F); }
     2458
     2459    /**
    -2460     * This color constant "Blueberry" has RGBA8888 code {@code 0F377DFF}, L 0.22745098, A 0.4862745, B 0.43137255, alpha 1.0, hue 0.71857655, saturation 0.5892011, and chroma 0.13942632.
    +2460     * This color constant "Blueberry" has RGBA8888 code {@code 0F377DFF}, L 0.22745098, A 0.4862745, B 0.43137255, alpha 1.0, hue 0.7221893, saturation 0.8420818, and chroma 0.13942632.
     2461     * It can be represented as a packed float with the constant {@code -0x1.dcf874p125F}.
     2462     * <pre>
     2463     * <font style='background-color: #0F377D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0F377D; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2482,7 +2482,7 @@
     2469    static { NAMED.put("Blueberry", -0x1.dcf874p125F); LIST.add(-0x1.dcf874p125F); }
     2470
     2471    /**
    -2472     * This color constant "Prussian Blue" has RGBA8888 code {@code 004A9CFF}, L 0.3019608, A 0.47843137, B 0.42352942, alpha 1.0, hue 0.70625466, saturation 0.86775005, and chroma 0.1582875.
    +2472     * This color constant "Prussian Blue" has RGBA8888 code {@code 004A9CFF}, L 0.3019608, A 0.47843137, B 0.42352942, alpha 1.0, hue 0.7090507, saturation 0.98234415, and chroma 0.1582875.
     2473     * It can be represented as a packed float with the constant {@code -0x1.d8f49ap125F}.
     2474     * <pre>
     2475     * <font style='background-color: #004A9C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #004A9C; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2494,7 +2494,7 @@
     2481    static { NAMED.put("Prussian Blue", -0x1.d8f49ap125F); LIST.add(-0x1.d8f49ap125F); }
     2482
     2483    /**
    -2484     * This color constant "Desert Rain" has RGBA8888 code {@code 326496FF}, L 0.38431373, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6840373, saturation 0.4548087, and chroma 0.106691405.
    +2484     * This color constant "Desert Rain" has RGBA8888 code {@code 326496FF}, L 0.38431373, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6871773, saturation 0.7027027, and chroma 0.106691405.
     2485     * It can be represented as a packed float with the constant {@code -0x1.e6f4c4p125F}.
     2486     * <pre>
     2487     * <font style='background-color: #326496;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #326496; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2506,7 +2506,7 @@
     2493    static { NAMED.put("Desert Rain", -0x1.e6f4c4p125F); LIST.add(-0x1.e6f4c4p125F); }
     2494
     2495    /**
    -2496     * This color constant "Electric Blue" has RGBA8888 code {@code 0052F6FF}, L 0.4, A 0.48235294, B 0.3764706, alpha 1.0, hue 0.72740346, saturation 0.8384659, and chroma 0.24859223.
    +2496     * This color constant "Electric Blue" has RGBA8888 code {@code 0052F6FF}, L 0.4, A 0.48235294, B 0.3764706, alpha 1.0, hue 0.72956455, saturation 0.9193235, and chroma 0.24859223.
     2497     * It can be represented as a packed float with the constant {@code -0x1.c0f6ccp125F}.
     2498     * <pre>
     2499     * <font style='background-color: #0052F6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0052F6; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2518,7 +2518,7 @@
     2505    static { NAMED.put("Electric Blue", -0x1.c0f6ccp125F); LIST.add(-0x1.c0f6ccp125F); }
     2506
     2507    /**
    -2508     * This color constant "Hidden Blue" has RGBA8888 code {@code 186ABDFF}, L 0.41568628, A 0.4745098, B 0.42745098, alpha 1.0, hue 0.696238, saturation 0.681662, and chroma 0.15319274.
    +2508     * This color constant "Hidden Blue" has RGBA8888 code {@code 186ABDFF}, L 0.41568628, A 0.4745098, B 0.42745098, alpha 1.0, hue 0.6988043, saturation 0.88249606, and chroma 0.15319274.
     2509     * It can be represented as a packed float with the constant {@code -0x1.daf2d4p125F}.
     2510     * <pre>
     2511     * <font style='background-color: #186ABD;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #186ABD; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2530,7 +2530,7 @@
     2517    static { NAMED.put("Hidden Blue", -0x1.daf2d4p125F); LIST.add(-0x1.daf2d4p125F); }
     2518
     2519    /**
    -2520     * This color constant "Dull Azure" has RGBA8888 code {@code 2378DCFF}, L 0.47843137, A 0.4745098, B 0.41960785, alpha 1.0, hue 0.70114374, saturation 0.6228432, and chroma 0.16801417.
    +2520     * This color constant "Dull Azure" has RGBA8888 code {@code 2378DCFF}, L 0.47843137, A 0.4745098, B 0.41960785, alpha 1.0, hue 0.7036233, saturation 0.8188476, and chroma 0.16801417.
     2521     * It can be represented as a packed float with the constant {@code -0x1.d6f2f4p125F}.
     2522     * <pre>
     2523     * <font style='background-color: #2378DC;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2378DC; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2542,91 +2542,91 @@
     2529    static { NAMED.put("Dull Azure", -0x1.d6f2f4p125F); LIST.add(-0x1.d6f2f4p125F); }
     2530
     2531    /**
    -2532     * This color constant "Ripped Denim" has RGBA8888 code {@code 699DC3FF}, L 0.59607846, A 0.47843137, B 0.46666667, alpha 1.0, hue 0.65858525, saturation 0.21667327, and chroma 0.079095535.
    -2533     * It can be represented as a packed float with the constant {@code -0x1.eef53p125F}.
    +2532     * This color constant "Ripped Denim" has RGBA8888 code {@code 699DC3FF}, L 0.6, A 0.47843137, B 0.46666667, alpha 1.0, hue 0.6610861, saturation 0.4492372, and chroma 0.079095535.
    +2533     * It can be represented as a packed float with the constant {@code -0x1.eef532p125F}.
     2534     * <pre>
     2535     * <font style='background-color: #699DC3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #699DC3; color: #000000'>&nbsp;@&nbsp;</font>
     2536     * <font style='background-color: #699DC3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #699DC3'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #699DC3'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #699DC3'>&nbsp;@&nbsp;</font><font style='background-color: #699DC3; color: #888888'>&nbsp;@&nbsp;</font>
     2537     * <font style='background-color: #699DC3;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #699DC3; color: #ffffff'>&nbsp;@&nbsp;</font>
     2538     * </pre>
     2539     */
    -2540    public static final float RIPPED_DENIM = -0x1.eef53p125F;
    -2541    static { NAMED.put("Ripped Denim", -0x1.eef53p125F); LIST.add(-0x1.eef53p125F); }
    +2540    public static final float RIPPED_DENIM = -0x1.eef532p125F;
    +2541    static { NAMED.put("Ripped Denim", -0x1.eef532p125F); LIST.add(-0x1.eef532p125F); }
     2542
     2543    /**
    -2544     * This color constant "Calm Sky" has RGBA8888 code {@code 4AA4FFFF}, L 0.627451, A 0.47058824, B 0.42745098, alpha 1.0, hue 0.6887114, saturation 0.9255335, and chroma 0.15595676.
    -2545     * It can be represented as a packed float with the constant {@code -0x1.daf14p125F}.
    +2544     * This color constant "Calm Sky" has RGBA8888 code {@code 4AA4FFFF}, L 0.6313726, A 0.47058824, B 0.42745098, alpha 1.0, hue 0.69098294, saturation 0.9656604, and chroma 0.15595676.
    +2545     * It can be represented as a packed float with the constant {@code -0x1.daf142p125F}.
     2546     * <pre>
     2547     * <font style='background-color: #4AA4FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4AA4FF; color: #000000'>&nbsp;@&nbsp;</font>
     2548     * <font style='background-color: #4AA4FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #4AA4FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #4AA4FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #4AA4FF'>&nbsp;@&nbsp;</font><font style='background-color: #4AA4FF; color: #888888'>&nbsp;@&nbsp;</font>
     2549     * <font style='background-color: #4AA4FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4AA4FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2550     * </pre>
     2551     */
    -2552    public static final float CALM_SKY = -0x1.daf14p125F;
    -2553    static { NAMED.put("Calm Sky", -0x1.daf14p125F); LIST.add(-0x1.daf14p125F); }
    +2552    public static final float CALM_SKY = -0x1.daf142p125F;
    +2553    static { NAMED.put("Calm Sky", -0x1.daf142p125F); LIST.add(-0x1.daf142p125F); }
     2554
     2555    /**
    -2556     * This color constant "Vapor" has RGBA8888 code {@code 90B0FFFF}, L 0.7019608, A 0.49411765, B 0.44313726, alpha 1.0, hue 0.7335864, saturation 0.9137329, and chroma 0.11388578.
    -2557     * It can be represented as a packed float with the constant {@code -0x1.e2fd66p125F}.
    +2556     * This color constant "Vapor" has RGBA8888 code {@code 90B0FFFF}, L 0.7058824, A 0.49411765, B 0.44313726, alpha 1.0, hue 0.73865414, saturation 0.9679771, and chroma 0.11388578.
    +2557     * It can be represented as a packed float with the constant {@code -0x1.e2fd68p125F}.
     2558     * <pre>
     2559     * <font style='background-color: #90B0FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #90B0FF; color: #000000'>&nbsp;@&nbsp;</font>
     2560     * <font style='background-color: #90B0FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #90B0FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #90B0FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #90B0FF'>&nbsp;@&nbsp;</font><font style='background-color: #90B0FF; color: #888888'>&nbsp;@&nbsp;</font>
     2561     * <font style='background-color: #90B0FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #90B0FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2562     * </pre>
     2563     */
    -2564    public static final float VAPOR = -0x1.e2fd66p125F;
    -2565    static { NAMED.put("Vapor", -0x1.e2fd66p125F); LIST.add(-0x1.e2fd66p125F); }
    +2564    public static final float VAPOR = -0x1.e2fd68p125F;
    +2565    static { NAMED.put("Vapor", -0x1.e2fd68p125F); LIST.add(-0x1.e2fd68p125F); }
     2566
     2567    /**
    -2568     * This color constant "Powder Blue" has RGBA8888 code {@code 5AC5FFFF}, L 0.72156864, A 0.4627451, B 0.4509804, alpha 1.0, hue 0.6465574, saturation 0.8283974, and chroma 0.12265874.
    -2569     * It can be represented as a packed float with the constant {@code -0x1.e6ed7p125F}.
    +2568     * This color constant "Powder Blue" has RGBA8888 code {@code 5AC5FFFF}, L 0.7254902, A 0.4627451, B 0.4509804, alpha 1.0, hue 0.6475709, saturation 0.90909094, and chroma 0.12265874.
    +2569     * It can be represented as a packed float with the constant {@code -0x1.e6ed72p125F}.
     2570     * <pre>
     2571     * <font style='background-color: #5AC5FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5AC5FF; color: #000000'>&nbsp;@&nbsp;</font>
     2572     * <font style='background-color: #5AC5FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #5AC5FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #5AC5FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #5AC5FF'>&nbsp;@&nbsp;</font><font style='background-color: #5AC5FF; color: #888888'>&nbsp;@&nbsp;</font>
     2573     * <font style='background-color: #5AC5FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5AC5FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2574     * </pre>
     2575     */
    -2576    public static final float POWDER_BLUE = -0x1.e6ed7p125F;
    -2577    static { NAMED.put("Powder Blue", -0x1.e6ed7p125F); LIST.add(-0x1.e6ed7p125F); }
    +2576    public static final float POWDER_BLUE = -0x1.e6ed72p125F;
    +2577    static { NAMED.put("Powder Blue", -0x1.e6ed72p125F); LIST.add(-0x1.e6ed72p125F); }
     2578
     2579    /**
    -2580     * This color constant "Suds" has RGBA8888 code {@code BEB9FAFF}, L 0.75686276, A 0.50980395, B 0.45882353, alpha 1.0, hue 0.7872009, saturation 0.71664745, and chroma 0.084324345.
    -2581     * It can be represented as a packed float with the constant {@code -0x1.eb0582p125F}.
    +2580     * This color constant "Suds" has RGBA8888 code {@code BEB9FAFF}, L 0.7647059, A 0.50980395, B 0.45882353, alpha 1.0, hue 0.7963767, saturation 0.8700256, and chroma 0.084324345.
    +2581     * It can be represented as a packed float with the constant {@code -0x1.eb0586p125F}.
     2582     * <pre>
     2583     * <font style='background-color: #BEB9FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BEB9FA; color: #000000'>&nbsp;@&nbsp;</font>
     2584     * <font style='background-color: #BEB9FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BEB9FA'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BEB9FA'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BEB9FA'>&nbsp;@&nbsp;</font><font style='background-color: #BEB9FA; color: #888888'>&nbsp;@&nbsp;</font>
     2585     * <font style='background-color: #BEB9FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BEB9FA; color: #ffffff'>&nbsp;@&nbsp;</font>
     2586     * </pre>
     2587     */
    -2588    public static final float SUDS = -0x1.eb0582p125F;
    -2589    static { NAMED.put("Suds", -0x1.eb0582p125F); LIST.add(-0x1.eb0582p125F); }
    +2588    public static final float SUDS = -0x1.eb0586p125F;
    +2589    static { NAMED.put("Suds", -0x1.eb0586p125F); LIST.add(-0x1.eb0586p125F); }
     2590
     2591    /**
    -2592     * This color constant "Strong Cyan" has RGBA8888 code {@code 00BFFFFF}, L 0.68235296, A 0.44705883, B 0.44313726, alpha 1.0, hue 0.63067734, saturation 0.9115982, and chroma 0.15477823.
    -2593     * It can be represented as a packed float with the constant {@code -0x1.e2e55cp125F}.
    +2592     * This color constant "Strong Cyan" has RGBA8888 code {@code 00BFFFFF}, L 0.6862745, A 0.44705883, B 0.44313726, alpha 1.0, hue 0.6308874, saturation 0.95524865, and chroma 0.15477823.
    +2593     * It can be represented as a packed float with the constant {@code -0x1.e2e55ep125F}.
     2594     * <pre>
     2595     * <font style='background-color: #00BFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00BFFF; color: #000000'>&nbsp;@&nbsp;</font>
     2596     * <font style='background-color: #00BFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00BFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00BFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00BFFF'>&nbsp;@&nbsp;</font><font style='background-color: #00BFFF; color: #888888'>&nbsp;@&nbsp;</font>
     2597     * <font style='background-color: #00BFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00BFFF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2598     * </pre>
     2599     */
    -2600    public static final float STRONG_CYAN = -0x1.e2e55cp125F;
    -2601    static { NAMED.put("Strong Cyan", -0x1.e2e55cp125F); LIST.add(-0x1.e2e55cp125F); }
    +2600    public static final float STRONG_CYAN = -0x1.e2e55ep125F;
    +2601    static { NAMED.put("Strong Cyan", -0x1.e2e55ep125F); LIST.add(-0x1.e2e55ep125F); }
     2602
     2603    /**
    -2604     * This color constant "Sharp Azure" has RGBA8888 code {@code 007FFFFF}, L 0.5137255, A 0.47058824, B 0.4, alpha 1.0, hue 0.704483, saturation 0.9514351, and chroma 0.20765679.
    -2605     * It can be represented as a packed float with the constant {@code -0x1.ccf106p125F}.
    +2604     * This color constant "Sharp Azure" has RGBA8888 code {@code 007FFFFF}, L 0.5176471, A 0.47058824, B 0.4, alpha 1.0, hue 0.706557, saturation 0.9796796, and chroma 0.20765679.
    +2605     * It can be represented as a packed float with the constant {@code -0x1.ccf108p125F}.
     2606     * <pre>
     2607     * <font style='background-color: #007FFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007FFF; color: #000000'>&nbsp;@&nbsp;</font>
     2608     * <font style='background-color: #007FFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #007FFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #007FFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #007FFF'>&nbsp;@&nbsp;</font><font style='background-color: #007FFF; color: #888888'>&nbsp;@&nbsp;</font>
     2609     * <font style='background-color: #007FFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007FFF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2610     * </pre>
     2611     */
    -2612    public static final float SHARP_AZURE = -0x1.ccf106p125F;
    -2613    static { NAMED.put("Sharp Azure", -0x1.ccf106p125F); LIST.add(-0x1.ccf106p125F); }
    +2612    public static final float SHARP_AZURE = -0x1.ccf108p125F;
    +2613    static { NAMED.put("Sharp Azure", -0x1.ccf108p125F); LIST.add(-0x1.ccf108p125F); }
     2614
     2615    /**
    -2616     * This color constant "Blue Eye" has RGBA8888 code {@code 4B7DC8FF}, L 0.49803922, A 0.48235294, B 0.4392157, alpha 1.0, hue 0.70503896, saturation 0.32641554, and chroma 0.12609385.
    +2616     * This color constant "Blue Eye" has RGBA8888 code {@code 4B7DC8FF}, L 0.49803922, A 0.48235294, B 0.4392157, alpha 1.0, hue 0.7085295, saturation 0.5645155, and chroma 0.12609385.
     2617     * It can be represented as a packed float with the constant {@code -0x1.e0f6fep125F}.
     2618     * <pre>
     2619     * <font style='background-color: #4B7DC8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4B7DC8; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2638,7 +2638,7 @@
     2625    static { NAMED.put("Blue Eye", -0x1.e0f6fep125F); LIST.add(-0x1.e0f6fep125F); }
     2626
     2627    /**
    -2628     * This color constant "Subtlety" has RGBA8888 code {@code 786EF0FF}, L 0.52156866, A 0.5176471, B 0.4117647, alpha 1.0, hue 0.78142345, saturation 0.68371075, and chroma 0.1792624.
    +2628     * This color constant "Subtlety" has RGBA8888 code {@code 786EF0FF}, L 0.52156866, A 0.5176471, B 0.4117647, alpha 1.0, hue 0.7855691, saturation 0.85135955, and chroma 0.1792624.
     2629     * It can be represented as a packed float with the constant {@code -0x1.d3090ap125F}.
     2630     * <pre>
     2631     * <font style='background-color: #786EF0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #786EF0; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2650,7 +2650,7 @@
     2637    static { NAMED.put("Subtlety", -0x1.d3090ap125F); LIST.add(-0x1.d3090ap125F); }
     2638
     2639    /**
    -2640     * This color constant "Rough Sapphire" has RGBA8888 code {@code 4A5AFFFF}, L 0.45490196, A 0.5019608, B 0.38431373, alpha 1.0, hue 0.75268954, saturation 0.891392, and chroma 0.23050185.
    +2640     * This color constant "Rough Sapphire" has RGBA8888 code {@code 4A5AFFFF}, L 0.45490196, A 0.5019608, B 0.38431373, alpha 1.0, hue 0.75547296, saturation 0.9672412, and chroma 0.23050185.
     2641     * It can be represented as a packed float with the constant {@code -0x1.c500e8p125F}.
     2642     * <pre>
     2643     * <font style='background-color: #4A5AFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4A5AFF; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2662,7 +2662,7 @@
     2649    static { NAMED.put("Rough Sapphire", -0x1.c500e8p125F); LIST.add(-0x1.c500e8p125F); }
     2650
     2651    /**
    -2652     * This color constant "Iris" has RGBA8888 code {@code 6241F6FF}, L 0.41960785, A 0.5294118, B 0.38039216, alpha 1.0, hue 0.7883731, saturation 0.79392385, and chroma 0.24537967.
    +2652     * This color constant "Iris" has RGBA8888 code {@code 6241F6FF}, L 0.41960785, A 0.5294118, B 0.38039216, alpha 1.0, hue 0.7914705, saturation 0.8999522, and chroma 0.24537967.
     2653     * It can be represented as a packed float with the constant {@code -0x1.c30ed6p125F}.
     2654     * <pre>
     2655     * <font style='background-color: #6241F6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #6241F6; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2674,7 +2674,7 @@
     2661    static { NAMED.put("Iris", -0x1.c30ed6p125F); LIST.add(-0x1.c30ed6p125F); }
     2662
     2663    /**
    -2664     * This color constant "Cornflower Blue" has RGBA8888 code {@code 3C3CF5FF}, L 0.3764706, A 0.5058824, B 0.36862746, alpha 1.0, hue 0.75710976, saturation 0.83261603, and chroma 0.26198098.
    +2664     * This color constant "Cornflower Blue" has RGBA8888 code {@code 3C3CF5FF}, L 0.3764706, A 0.5058824, B 0.36862746, alpha 1.0, hue 0.75962687, saturation 0.9183486, and chroma 0.26198098.
     2665     * It can be represented as a packed float with the constant {@code -0x1.bd02cp125F}.
     2666     * <pre>
     2667     * <font style='background-color: #3C3CF5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3C3CF5; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2686,19 +2686,19 @@
     2673    static { NAMED.put("Cornflower Blue", -0x1.bd02cp125F); LIST.add(-0x1.bd02cp125F); }
     2674
     2675    /**
    -2676     * This color constant "Polished Sapphire" has RGBA8888 code {@code 101CDAFF}, L 0.2784314, A 0.4862745, B 0.3647059, alpha 1.0, hue 0.73390174, saturation 0.80083245, and chroma 0.2709147.
    -2677     * It can be represented as a packed float with the constant {@code -0x1.baf88ep125F}.
    +2676     * This color constant "Polished Sapphire" has RGBA8888 code {@code 101CDAFF}, L 0.27450982, A 0.4862745, B 0.3647059, alpha 1.0, hue 0.73599005, saturation 0.898213, and chroma 0.2709147.
    +2677     * It can be represented as a packed float with the constant {@code -0x1.baf88cp125F}.
     2678     * <pre>
     2679     * <font style='background-color: #101CDA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #101CDA; color: #000000'>&nbsp;@&nbsp;</font>
     2680     * <font style='background-color: #101CDA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #101CDA'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #101CDA'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #101CDA'>&nbsp;@&nbsp;</font><font style='background-color: #101CDA; color: #888888'>&nbsp;@&nbsp;</font>
     2681     * <font style='background-color: #101CDA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #101CDA; color: #ffffff'>&nbsp;@&nbsp;</font>
     2682     * </pre>
     2683     */
    -2684    public static final float POLISHED_SAPPHIRE = -0x1.baf88ep125F;
    -2685    static { NAMED.put("Polished Sapphire", -0x1.baf88ep125F); LIST.add(-0x1.baf88ep125F); }
    +2684    public static final float POLISHED_SAPPHIRE = -0x1.baf88cp125F;
    +2685    static { NAMED.put("Polished Sapphire", -0x1.baf88cp125F); LIST.add(-0x1.baf88cp125F); }
     2686
     2687    /**
    -2688     * This color constant "Royal Blue" has RGBA8888 code {@code 0010BDFF}, L 0.22745098, A 0.4862745, B 0.37254903, alpha 1.0, hue 0.7329173, saturation 0.8848403, and chroma 0.25537437.
    +2688     * This color constant "Royal Blue" has RGBA8888 code {@code 0010BDFF}, L 0.22745098, A 0.4862745, B 0.37254903, alpha 1.0, hue 0.7351178, saturation 0.94530344, and chroma 0.25537437.
     2689     * It can be represented as a packed float with the constant {@code -0x1.bef874p125F}.
     2690     * <pre>
     2691     * <font style='background-color: #0010BD;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0010BD; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2710,19 +2710,19 @@
     2697    static { NAMED.put("Royal Blue", -0x1.bef874p125F); LIST.add(-0x1.bef874p125F); }
     2698
     2699    /**
    -2700     * This color constant "Indigo" has RGBA8888 code {@code 231094FF}, L 0.19215687, A 0.5058824, B 0.39607844, alpha 1.0, hue 0.75899065, saturation 0.85232514, and chroma 0.20736265.
    -2701     * It can be represented as a packed float with the constant {@code -0x1.cb0262p125F}.
    +2700     * This color constant "Indigo" has RGBA8888 code {@code 231094FF}, L 0.1882353, A 0.5058824, B 0.39607844, alpha 1.0, hue 0.76221764, saturation 0.9313146, and chroma 0.20736265.
    +2701     * It can be represented as a packed float with the constant {@code -0x1.cb026p125F}.
     2702     * <pre>
     2703     * <font style='background-color: #231094;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #231094; color: #000000'>&nbsp;@&nbsp;</font>
     2704     * <font style='background-color: #231094;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #231094'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #231094'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #231094'>&nbsp;@&nbsp;</font><font style='background-color: #231094; color: #888888'>&nbsp;@&nbsp;</font>
     2705     * <font style='background-color: #231094;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #231094; color: #ffffff'>&nbsp;@&nbsp;</font>
     2706     * </pre>
     2707     */
    -2708    public static final float INDIGO = -0x1.cb0262p125F;
    -2709    static { NAMED.put("Indigo", -0x1.cb0262p125F); LIST.add(-0x1.cb0262p125F); }
    +2708    public static final float INDIGO = -0x1.cb026p125F;
    +2709    static { NAMED.put("Indigo", -0x1.cb026p125F); LIST.add(-0x1.cb026p125F); }
     2710
     2711    /**
    -2712     * This color constant "Space Blue" has RGBA8888 code {@code 0C2148FF}, L 0.1254902, A 0.49019608, B 0.45490196, alpha 1.0, hue 0.7159276, saturation 0.49365115, and chroma 0.091942206.
    +2712     * This color constant "Space Blue" has RGBA8888 code {@code 0C2148FF}, L 0.1254902, A 0.49019608, B 0.45490196, alpha 1.0, hue 0.72136545, saturation 0.7710579, and chroma 0.091942206.
     2713     * It can be represented as a packed float with the constant {@code -0x1.e8fa4p125F}.
     2714     * <pre>
     2715     * <font style='background-color: #0C2148;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0C2148; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2734,19 +2734,19 @@
     2721    static { NAMED.put("Space Blue", -0x1.e8fa4p125F); LIST.add(-0x1.e8fa4p125F); }
     2722
     2723    /**
    -2724     * This color constant "Thick Amethyst" has RGBA8888 code {@code 5010B0FF}, L 0.27058825, A 0.5411765, B 0.39215687, alpha 1.0, hue 0.8080369, saturation 0.887296, and chroma 0.22997166.
    -2725     * It can be represented as a packed float with the constant {@code -0x1.c9148ap125F}.
    +2724     * This color constant "Thick Amethyst" has RGBA8888 code {@code 5010B0FF}, L 0.26666668, A 0.5411765, B 0.39607844, alpha 1.0, hue 0.81369054, saturation 0.9256127, and chroma 0.22269051.
    +2725     * It can be represented as a packed float with the constant {@code -0x1.cb1488p125F}.
     2726     * <pre>
     2727     * <font style='background-color: #5010B0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5010B0; color: #000000'>&nbsp;@&nbsp;</font>
     2728     * <font style='background-color: #5010B0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #5010B0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #5010B0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #5010B0'>&nbsp;@&nbsp;</font><font style='background-color: #5010B0; color: #888888'>&nbsp;@&nbsp;</font>
     2729     * <font style='background-color: #5010B0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5010B0; color: #ffffff'>&nbsp;@&nbsp;</font>
     2730     * </pre>
     2731     */
    -2732    public static final float THICK_AMETHYST = -0x1.c9148ap125F;
    -2733    static { NAMED.put("Thick Amethyst", -0x1.c9148ap125F); LIST.add(-0x1.c9148ap125F); }
    +2732    public static final float THICK_AMETHYST = -0x1.cb1488p125F;
    +2733    static { NAMED.put("Thick Amethyst", -0x1.cb1488p125F); LIST.add(-0x1.cb1488p125F); }
     2734
     2735    /**
    -2736     * This color constant "Juicy Grape" has RGBA8888 code {@code 6010D0FF}, L 0.32156864, A 0.54901963, B 0.38039216, alpha 1.0, hue 0.81189364, saturation 0.8997464, and chroma 0.2575164.
    +2736     * This color constant "Juicy Grape" has RGBA8888 code {@code 6010D0FF}, L 0.32156864, A 0.54901963, B 0.38039216, alpha 1.0, hue 0.8150709, saturation 0.9616342, and chroma 0.2575164.
     2737     * It can be represented as a packed float with the constant {@code -0x1.c318a4p125F}.
     2738     * <pre>
     2739     * <font style='background-color: #6010D0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #6010D0; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2758,7 +2758,7 @@
     2745    static { NAMED.put("Juicy Grape", -0x1.c318a4p125F); LIST.add(-0x1.c318a4p125F); }
     2746
     2747    /**
    -2748     * This color constant "Blacklight Glow" has RGBA8888 code {@code 8732D2FF}, L 0.40784314, A 0.5647059, B 0.40392157, alpha 1.0, hue 0.84434295, saturation 0.6288005, and chroma 0.23076649.
    +2748     * This color constant "Blacklight Glow" has RGBA8888 code {@code 8732D2FF}, L 0.40784314, A 0.5647059, B 0.40392157, alpha 1.0, hue 0.8480996, saturation 0.79488873, and chroma 0.23076649.
     2749     * It can be represented as a packed float with the constant {@code -0x1.cf20dp125F}.
     2750     * <pre>
     2751     * <font style='background-color: #8732D2;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8732D2; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2770,115 +2770,115 @@
     2757    static { NAMED.put("Blacklight Glow", -0x1.cf20dp125F); LIST.add(-0x1.cf20dp125F); }
     2758
     2759    /**
    -2760     * This color constant "Purple Freesia" has RGBA8888 code {@code 9C41FFFF}, L 0.49411765, A 0.5686275, B 0.3882353, alpha 1.0, hue 0.83765215, saturation 0.9001559, and chroma 0.2612811.
    -2761     * It can be represented as a packed float with the constant {@code -0x1.c722fcp125F}.
    +2760     * This color constant "Purple Freesia" has RGBA8888 code {@code 9C41FFFF}, L 0.49411765, A 0.5647059, B 0.39215687, alpha 1.0, hue 0.83944297, saturation 0.95242125, and chroma 0.25054872.
    +2761     * It can be represented as a packed float with the constant {@code -0x1.c920fcp125F}.
     2762     * <pre>
     2763     * <font style='background-color: #9C41FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9C41FF; color: #000000'>&nbsp;@&nbsp;</font>
     2764     * <font style='background-color: #9C41FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #9C41FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #9C41FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #9C41FF'>&nbsp;@&nbsp;</font><font style='background-color: #9C41FF; color: #888888'>&nbsp;@&nbsp;</font>
     2765     * <font style='background-color: #9C41FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9C41FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2766     * </pre>
     2767     */
    -2768    public static final float PURPLE_FREESIA = -0x1.c722fcp125F;
    -2769    static { NAMED.put("Purple Freesia", -0x1.c722fcp125F); LIST.add(-0x1.c722fcp125F); }
    +2768    public static final float PURPLE_FREESIA = -0x1.c920fcp125F;
    +2769    static { NAMED.put("Purple Freesia", -0x1.c920fcp125F); LIST.add(-0x1.c920fcp125F); }
     2770
     2771    /**
    -2772     * This color constant "Thin Amethyst" has RGBA8888 code {@code 7F00FFFF}, L 0.40784314, A 0.5647059, B 0.3647059, alpha 1.0, hue 0.8209959, saturation 0.97398543, and chroma 0.29877067.
    -2773     * It can be represented as a packed float with the constant {@code -0x1.bb20dp125F}.
    +2772     * This color constant "Thin Amethyst" has RGBA8888 code {@code 7F00FFFF}, L 0.40392157, A 0.5647059, B 0.36862746, alpha 1.0, hue 0.82570946, saturation 0.97687954, and chroma 0.29174224.
    +2773     * It can be represented as a packed float with the constant {@code -0x1.bd20cep125F}.
     2774     * <pre>
     2775     * <font style='background-color: #7F00FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F00FF; color: #000000'>&nbsp;@&nbsp;</font>
     2776     * <font style='background-color: #7F00FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7F00FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7F00FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7F00FF'>&nbsp;@&nbsp;</font><font style='background-color: #7F00FF; color: #888888'>&nbsp;@&nbsp;</font>
     2777     * <font style='background-color: #7F00FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7F00FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2778     * </pre>
     2779     */
    -2780    public static final float THIN_AMETHYST = -0x1.bb20dp125F;
    -2781    static { NAMED.put("Thin Amethyst", -0x1.bb20dp125F); LIST.add(-0x1.bb20dp125F); }
    +2780    public static final float THIN_AMETHYST = -0x1.bd20cep125F;
    +2781    static { NAMED.put("Thin Amethyst", -0x1.bd20cep125F); LIST.add(-0x1.bd20cep125F); }
     2782
     2783    /**
    -2784     * This color constant "Orchid" has RGBA8888 code {@code BD62FFFF}, L 0.58431375, A 0.5686275, B 0.4117647, alpha 1.0, hue 0.8552204, saturation 0.9180143, and chroma 0.22269051.
    -2785     * It can be represented as a packed float with the constant {@code -0x1.d3232ap125F}.
    +2784     * This color constant "Orchid" has RGBA8888 code {@code BD62FFFF}, L 0.5882353, A 0.5686275, B 0.4117647, alpha 1.0, hue 0.8591479, saturation 0.9973804, and chroma 0.22269051.
    +2785     * It can be represented as a packed float with the constant {@code -0x1.d3232cp125F}.
     2786     * <pre>
     2787     * <font style='background-color: #BD62FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BD62FF; color: #000000'>&nbsp;@&nbsp;</font>
     2788     * <font style='background-color: #BD62FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BD62FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BD62FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BD62FF'>&nbsp;@&nbsp;</font><font style='background-color: #BD62FF; color: #888888'>&nbsp;@&nbsp;</font>
     2789     * <font style='background-color: #BD62FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BD62FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2790     * </pre>
     2791     */
    -2792    public static final float ORCHID = -0x1.d3232ap125F;
    -2793    static { NAMED.put("Orchid", -0x1.d3232ap125F); LIST.add(-0x1.d3232ap125F); }
    +2792    public static final float ORCHID = -0x1.d3232cp125F;
    +2793    static { NAMED.put("Orchid", -0x1.d3232cp125F); LIST.add(-0x1.d3232cp125F); }
     2794
     2795    /**
    -2796     * This color constant "Lavender" has RGBA8888 code {@code B991FFFF}, L 0.67058825, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.82570946, saturation 0.84011585, and chroma 0.14500555.
    -2797     * It can be represented as a packed float with the constant {@code -0x1.df1156p125F}.
    +2796     * This color constant "Lavender" has RGBA8888 code {@code B991FFFF}, L 0.6745098, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.83155453, saturation 0.9661873, and chroma 0.14500555.
    +2797     * It can be represented as a packed float with the constant {@code -0x1.df1158p125F}.
     2798     * <pre>
     2799     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #000000'>&nbsp;@&nbsp;</font>
     2800     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #B991FF; color: #888888'>&nbsp;@&nbsp;</font>
     2801     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2802     * </pre>
     2803     */
    -2804    public static final float LAVENDER = -0x1.df1156p125F;
    -2805    static { NAMED.put("Lavender", -0x1.df1156p125F); LIST.add(-0x1.df1156p125F); }
    +2804    public static final float LAVENDER = -0x1.df1158p125F;
    +2805    static { NAMED.put("Lavender", -0x1.df1158p125F); LIST.add(-0x1.df1158p125F); }
     2806
     2807    /**
    -2808     * This color constant "Lilac" has RGBA8888 code {@code D7A5FFFF}, L 0.7411765, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.8534426, saturation 0.8283974, and chroma 0.12265874.
    -2809     * It can be represented as a packed float with the constant {@code -0x1.e7137ap125F}.
    +2808     * This color constant "Lilac" has RGBA8888 code {@code D7A5FFFF}, L 0.7490196, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.860581, saturation 0.9762812, and chroma 0.12265874.
    +2809     * It can be represented as a packed float with the constant {@code -0x1.e7137ep125F}.
     2810     * <pre>
     2811     * <font style='background-color: #D7A5FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D7A5FF; color: #000000'>&nbsp;@&nbsp;</font>
     2812     * <font style='background-color: #D7A5FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D7A5FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D7A5FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D7A5FF'>&nbsp;@&nbsp;</font><font style='background-color: #D7A5FF; color: #888888'>&nbsp;@&nbsp;</font>
     2813     * <font style='background-color: #D7A5FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D7A5FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2814     * </pre>
     2815     */
    -2816    public static final float LILAC = -0x1.e7137ap125F;
    -2817    static { NAMED.put("Lilac", -0x1.e7137ap125F); LIST.add(-0x1.e7137ap125F); }
    +2816    public static final float LILAC = -0x1.e7137ep125F;
    +2817    static { NAMED.put("Lilac", -0x1.e7137ep125F); LIST.add(-0x1.e7137ep125F); }
     2818
     2819    /**
    -2820     * This color constant "Soap" has RGBA8888 code {@code D7C3FAFF}, L 0.8, A 0.5176471, B 0.46666667, alpha 1.0, hue 0.8274942, saturation 0.6699864, and chroma 0.07513822.
    -2821     * It can be represented as a packed float with the constant {@code -0x1.ef0998p125F}.
    +2820     * This color constant "Soap" has RGBA8888 code {@code D7C3FAFF}, L 0.8117647, A 0.5176471, B 0.46666667, alpha 1.0, hue 0.8389139, saturation 0.8984744, and chroma 0.07513822.
    +2821     * It can be represented as a packed float with the constant {@code -0x1.ef099ep125F}.
     2822     * <pre>
     2823     * <font style='background-color: #D7C3FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D7C3FA; color: #000000'>&nbsp;@&nbsp;</font>
     2824     * <font style='background-color: #D7C3FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D7C3FA'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D7C3FA'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D7C3FA'>&nbsp;@&nbsp;</font><font style='background-color: #D7C3FA; color: #888888'>&nbsp;@&nbsp;</font>
     2825     * <font style='background-color: #D7C3FA;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D7C3FA; color: #ffffff'>&nbsp;@&nbsp;</font>
     2826     * </pre>
     2827     */
    -2828    public static final float SOAP = -0x1.ef0998p125F;
    -2829    static { NAMED.put("Soap", -0x1.ef0998p125F); LIST.add(-0x1.ef0998p125F); }
    +2828    public static final float SOAP = -0x1.ef099ep125F;
    +2829    static { NAMED.put("Soap", -0x1.ef099ep125F); LIST.add(-0x1.ef099ep125F); }
     2830
     2831    /**
    -2832     * This color constant "Pink Tutu" has RGBA8888 code {@code F8C6FCFF}, L 0.8392157, A 0.5294118, B 0.4745098, alpha 1.0, hue 0.88634074, saturation 0.6563932, and chroma 0.07753685.
    -2833     * It can be represented as a packed float with the constant {@code -0x1.f30facp125F}.
    +2832     * This color constant "Pink Tutu" has RGBA8888 code {@code F8C6FCFF}, L 0.8509804, A 0.5294118, B 0.4745098, alpha 1.0, hue 0.8975709, saturation 0.90909094, and chroma 0.07753685.
    +2833     * It can be represented as a packed float with the constant {@code -0x1.f30fb2p125F}.
     2834     * <pre>
     2835     * <font style='background-color: #F8C6FC;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F8C6FC; color: #000000'>&nbsp;@&nbsp;</font>
     2836     * <font style='background-color: #F8C6FC;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F8C6FC'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F8C6FC'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F8C6FC'>&nbsp;@&nbsp;</font><font style='background-color: #F8C6FC; color: #888888'>&nbsp;@&nbsp;</font>
     2837     * <font style='background-color: #F8C6FC;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F8C6FC; color: #ffffff'>&nbsp;@&nbsp;</font>
     2838     * </pre>
     2839     */
    -2840    public static final float PINK_TUTU = -0x1.f30facp125F;
    -2841    static { NAMED.put("Pink Tutu", -0x1.f30facp125F); LIST.add(-0x1.f30facp125F); }
    +2840    public static final float PINK_TUTU = -0x1.f30fb2p125F;
    +2841    static { NAMED.put("Pink Tutu", -0x1.f30fb2p125F); LIST.add(-0x1.f30fb2p125F); }
     2842
     2843    /**
    -2844     * This color constant "Thistle" has RGBA8888 code {@code E673FFFF}, L 0.6666667, A 0.5803922, B 0.43137255, alpha 1.0, hue 0.8875299, saturation 0.8491489, and chroma 0.2105755.
    -2845     * It can be represented as a packed float with the constant {@code -0x1.dd2954p125F}.
    +2844     * This color constant "Thistle" has RGBA8888 code {@code E673FFFF}, L 0.67058825, A 0.5764706, B 0.43137255, alpha 1.0, hue 0.88786715, saturation 0.97217816, and chroma 0.20469645.
    +2845     * It can be represented as a packed float with the constant {@code -0x1.dd2756p125F}.
     2846     * <pre>
     2847     * <font style='background-color: #E673FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E673FF; color: #000000'>&nbsp;@&nbsp;</font>
     2848     * <font style='background-color: #E673FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E673FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E673FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E673FF'>&nbsp;@&nbsp;</font><font style='background-color: #E673FF; color: #888888'>&nbsp;@&nbsp;</font>
     2849     * <font style='background-color: #E673FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E673FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2850     * </pre>
     2851     */
    -2852    public static final float THISTLE = -0x1.dd2954p125F;
    -2853    static { NAMED.put("Thistle", -0x1.dd2954p125F); LIST.add(-0x1.dd2954p125F); }
    +2852    public static final float THISTLE = -0x1.dd2756p125F;
    +2853    static { NAMED.put("Thistle", -0x1.dd2756p125F); LIST.add(-0x1.dd2756p125F); }
     2854
     2855    /**
    -2856     * This color constant "Heliotrope" has RGBA8888 code {@code FF52FFFF}, L 0.6509804, A 0.6117647, B 0.42745098, alpha 1.0, hue 0.90835387, saturation 0.90332043, and chroma 0.26545262.
    -2857     * It can be represented as a packed float with the constant {@code -0x1.db394cp125F}.
    +2856     * This color constant "Heliotrope" has RGBA8888 code {@code FF52FFFF}, L 0.654902, A 0.6117647, B 0.42745098, alpha 1.0, hue 0.91158056, saturation 0.9893361, and chroma 0.26545262.
    +2857     * It can be represented as a packed float with the constant {@code -0x1.db394ep125F}.
     2858     * <pre>
     2859     * <font style='background-color: #FF52FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF52FF; color: #000000'>&nbsp;@&nbsp;</font>
     2860     * <font style='background-color: #FF52FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF52FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF52FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF52FF'>&nbsp;@&nbsp;</font><font style='background-color: #FF52FF; color: #888888'>&nbsp;@&nbsp;</font>
     2861     * <font style='background-color: #FF52FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF52FF; color: #ffffff'>&nbsp;@&nbsp;</font>
     2862     * </pre>
     2863     */
    -2864    public static final float HELIOTROPE = -0x1.db394cp125F;
    -2865    static { NAMED.put("Heliotrope", -0x1.db394cp125F); LIST.add(-0x1.db394cp125F); }
    +2864    public static final float HELIOTROPE = -0x1.db394ep125F;
    +2865    static { NAMED.put("Heliotrope", -0x1.db394ep125F); LIST.add(-0x1.db394ep125F); }
     2866
     2867    /**
    -2868     * This color constant "Purple" has RGBA8888 code {@code DA20E0FF}, L 0.5294118, A 0.6156863, B 0.41960785, alpha 1.0, hue 0.90333164, saturation 0.81673986, and chroma 0.28065258.
    +2868     * This color constant "Purple" has RGBA8888 code {@code DA20E0FF}, L 0.5294118, A 0.6156863, B 0.41960785, alpha 1.0, hue 0.90640444, saturation 0.91279775, and chroma 0.28065258.
     2869     * It can be represented as a packed float with the constant {@code -0x1.d73b0ep125F}.
     2870     * <pre>
     2871     * <font style='background-color: #DA20E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #DA20E0; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2890,7 +2890,7 @@
     2877    static { NAMED.put("Purple", -0x1.d73b0ep125F); LIST.add(-0x1.d73b0ep125F); }
     2878
     2879    /**
    -2880     * This color constant "Wisteria" has RGBA8888 code {@code BD29FFFF}, L 0.5137255, A 0.59607846, B 0.39215687, alpha 1.0, hue 0.865835, saturation 0.9033923, and chroma 0.28773978.
    +2880     * This color constant "Wisteria" has RGBA8888 code {@code BD29FFFF}, L 0.5137255, A 0.59607846, B 0.39215687, alpha 1.0, hue 0.86888635, saturation 0.98124635, and chroma 0.28773978.
     2881     * It can be represented as a packed float with the constant {@code -0x1.c93106p125F}.
     2882     * <pre>
     2883     * <font style='background-color: #BD29FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BD29FF; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2902,7 +2902,7 @@
     2889    static { NAMED.put("Wisteria", -0x1.c93106p125F); LIST.add(-0x1.c93106p125F); }
     2890
     2891    /**
    -2892     * This color constant "Medium Plum" has RGBA8888 code {@code BD10C5FF}, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9018202, saturation 0.86487514, and chroma 0.26337513.
    +2892     * This color constant "Medium Plum" has RGBA8888 code {@code BD10C5FF}, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9050996, saturation 0.9399402, and chroma 0.26337513.
     2893     * It can be represented as a packed float with the constant {@code -0x1.d936e8p125F}.
     2894     * <pre>
     2895     * <font style='background-color: #BD10C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BD10C5; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2914,43 +2914,43 @@
     2901    static { NAMED.put("Medium Plum", -0x1.d936e8p125F); LIST.add(-0x1.d936e8p125F); }
     2902
     2903    /**
    -2904     * This color constant "Violet" has RGBA8888 code {@code 8C14BEFF}, L 0.37254903, A 0.58431375, B 0.40784314, alpha 1.0, hue 0.8679365, saturation 0.8906447, and chroma 0.24883763.
    -2905     * It can be represented as a packed float with the constant {@code -0x1.d12abep125F}.
    +2904     * This color constant "Violet" has RGBA8888 code {@code 8C14BEFF}, L 0.36862746, A 0.5803922, B 0.40784314, alpha 1.0, hue 0.86777616, saturation 0.9296962, and chroma 0.24363229.
    +2905     * It can be represented as a packed float with the constant {@code -0x1.d128bcp125F}.
     2906     * <pre>
     2907     * <font style='background-color: #8C14BE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8C14BE; color: #000000'>&nbsp;@&nbsp;</font>
     2908     * <font style='background-color: #8C14BE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8C14BE'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8C14BE'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8C14BE'>&nbsp;@&nbsp;</font><font style='background-color: #8C14BE; color: #888888'>&nbsp;@&nbsp;</font>
     2909     * <font style='background-color: #8C14BE;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8C14BE; color: #ffffff'>&nbsp;@&nbsp;</font>
     2910     * </pre>
     2911     */
    -2912    public static final float VIOLET = -0x1.d12abep125F;
    -2913    static { NAMED.put("Violet", -0x1.d12abep125F); LIST.add(-0x1.d12abep125F); }
    +2912    public static final float VIOLET = -0x1.d128bcp125F;
    +2913    static { NAMED.put("Violet", -0x1.d128bcp125F); LIST.add(-0x1.d128bcp125F); }
     2914
     2915    /**
    -2916     * This color constant "Grape Lollipop" has RGBA8888 code {@code 5A187BFF}, L 0.24313726, A 0.5568628, B 0.43529412, alpha 1.0, hue 0.8647537, saturation 0.7002268, and chroma 0.17160846.
    -2917     * It can be represented as a packed float with the constant {@code -0x1.df1c7cp125F}.
    +2916     * This color constant "Grape Lollipop" has RGBA8888 code {@code 5A187BFF}, L 0.23921569, A 0.5568628, B 0.43529412, alpha 1.0, hue 0.86987174, saturation 0.8600672, and chroma 0.17160846.
    +2917     * It can be represented as a packed float with the constant {@code -0x1.df1c7ap125F}.
     2918     * <pre>
     2919     * <font style='background-color: #5A187B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5A187B; color: #000000'>&nbsp;@&nbsp;</font>
     2920     * <font style='background-color: #5A187B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #5A187B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #5A187B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #5A187B'>&nbsp;@&nbsp;</font><font style='background-color: #5A187B; color: #888888'>&nbsp;@&nbsp;</font>
     2921     * <font style='background-color: #5A187B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #5A187B; color: #ffffff'>&nbsp;@&nbsp;</font>
     2922     * </pre>
     2923     */
    -2924    public static final float GRAPE_LOLLIPOP = -0x1.df1c7cp125F;
    -2925    static { NAMED.put("Grape Lollipop", -0x1.df1c7cp125F); LIST.add(-0x1.df1c7cp125F); }
    +2924    public static final float GRAPE_LOLLIPOP = -0x1.df1c7ap125F;
    +2925    static { NAMED.put("Grape Lollipop", -0x1.df1c7ap125F); LIST.add(-0x1.df1c7ap125F); }
     2926
     2927    /**
    -2928     * This color constant "Mulberry" has RGBA8888 code {@code 641464FF}, L 0.23921569, A 0.5647059, B 0.45490196, alpha 1.0, hue 0.90311134, saturation 0.6878521, and chroma 0.15712644.
    -2929     * It can be represented as a packed float with the constant {@code -0x1.e9207ap125F}.
    +2928     * This color constant "Mulberry" has RGBA8888 code {@code 641464FF}, L 0.23529412, A 0.5647059, B 0.45490196, alpha 1.0, hue 0.90858525, saturation 0.86163646, and chroma 0.15712644.
    +2929     * It can be represented as a packed float with the constant {@code -0x1.e92078p125F}.
     2930     * <pre>
     2931     * <font style='background-color: #641464;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #641464; color: #000000'>&nbsp;@&nbsp;</font>
     2932     * <font style='background-color: #641464;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #641464'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #641464'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #641464'>&nbsp;@&nbsp;</font><font style='background-color: #641464; color: #888888'>&nbsp;@&nbsp;</font>
     2933     * <font style='background-color: #641464;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #641464; color: #ffffff'>&nbsp;@&nbsp;</font>
     2934     * </pre>
     2935     */
    -2936    public static final float MULBERRY = -0x1.e9207ap125F;
    -2937    static { NAMED.put("Mulberry", -0x1.e9207ap125F); LIST.add(-0x1.e9207ap125F); }
    +2936    public static final float MULBERRY = -0x1.e92078p125F;
    +2937    static { NAMED.put("Mulberry", -0x1.e92078p125F); LIST.add(-0x1.e92078p125F); }
     2938
     2939    /**
    -2940     * This color constant "Grape Soda" has RGBA8888 code {@code 410062FF}, L 0.16470589, A 0.54901963, B 0.43529412, alpha 1.0, hue 0.8531978, saturation 0.9058, and chroma 0.16172063.
    +2940     * This color constant "Grape Soda" has RGBA8888 code {@code 410062FF}, L 0.16470589, A 0.54901963, B 0.43529412, alpha 1.0, hue 0.8586049, saturation 0.98169184, and chroma 0.16172063.
     2941     * It can be represented as a packed float with the constant {@code -0x1.df1854p125F}.
     2942     * <pre>
     2943     * <font style='background-color: #410062;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #410062; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2962,7 +2962,7 @@
     2949    static { NAMED.put("Grape Soda", -0x1.df1854p125F); LIST.add(-0x1.df1854p125F); }
     2950
     2951    /**
    -2952     * This color constant "Eggplant" has RGBA8888 code {@code 320A46FF}, L 0.12156863, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.8534426, saturation 0.74010134, and chroma 0.12265874.
    +2952     * This color constant "Eggplant" has RGBA8888 code {@code 320A46FF}, L 0.12156863, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.860581, saturation 0.8926, and chroma 0.12265874.
     2953     * It can be represented as a packed float with the constant {@code -0x1.e7123ep125F}.
     2954     * <pre>
     2955     * <font style='background-color: #320A46;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #320A46; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -2974,31 +2974,31 @@
     2961    static { NAMED.put("Eggplant", -0x1.e7123ep125F); LIST.add(-0x1.e7123ep125F); }
     2962
     2963    /**
    -2964     * This color constant "Cherry Syrup" has RGBA8888 code {@code 551937FF}, L 0.19215687, A 0.5529412, B 0.49019608, alpha 1.0, hue 0.97084755, saturation 0.4832559, and chroma 0.107261956.
    -2965     * It can be represented as a packed float with the constant {@code -0x1.fb1a62p125F}.
    +2964     * This color constant "Cherry Syrup" has RGBA8888 code {@code 551937FF}, L 0.1882353, A 0.5529412, B 0.49019608, alpha 1.0, hue 0.97740346, saturation 0.76443976, and chroma 0.107261956.
    +2965     * It can be represented as a packed float with the constant {@code -0x1.fb1a6p125F}.
     2966     * <pre>
     2967     * <font style='background-color: #551937;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #551937; color: #000000'>&nbsp;@&nbsp;</font>
     2968     * <font style='background-color: #551937;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #551937'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #551937'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #551937'>&nbsp;@&nbsp;</font><font style='background-color: #551937; color: #888888'>&nbsp;@&nbsp;</font>
     2969     * <font style='background-color: #551937;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #551937; color: #ffffff'>&nbsp;@&nbsp;</font>
     2970     * </pre>
     2971     */
    -2972    public static final float CHERRY_SYRUP = -0x1.fb1a62p125F;
    -2973    static { NAMED.put("Cherry Syrup", -0x1.fb1a62p125F); LIST.add(-0x1.fb1a62p125F); }
    +2972    public static final float CHERRY_SYRUP = -0x1.fb1a6p125F;
    +2973    static { NAMED.put("Cherry Syrup", -0x1.fb1a6p125F); LIST.add(-0x1.fb1a6p125F); }
     2974
     2975    /**
    -2976     * This color constant "Plum Juice" has RGBA8888 code {@code A01982FF}, L 0.36862746, A 0.59607846, B 0.45882353, alpha 1.0, hue 0.9355687, saturation 0.8027682, and chroma 0.2082438.
    -2977     * It can be represented as a packed float with the constant {@code -0x1.eb30bcp125F}.
    +2976     * This color constant "Plum Juice" has RGBA8888 code {@code A01982FF}, L 0.3647059, A 0.5921569, B 0.45882353, alpha 1.0, hue 0.9371773, saturation 0.88135594, and chroma 0.20108652.
    +2977     * It can be represented as a packed float with the constant {@code -0x1.eb2ebap125F}.
     2978     * <pre>
     2979     * <font style='background-color: #A01982;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A01982; color: #000000'>&nbsp;@&nbsp;</font>
     2980     * <font style='background-color: #A01982;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #A01982'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #A01982'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #A01982'>&nbsp;@&nbsp;</font><font style='background-color: #A01982; color: #888888'>&nbsp;@&nbsp;</font>
     2981     * <font style='background-color: #A01982;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #A01982; color: #ffffff'>&nbsp;@&nbsp;</font>
     2982     * </pre>
     2983     */
    -2984    public static final float PLUM_JUICE = -0x1.eb30bcp125F;
    -2985    static { NAMED.put("Plum Juice", -0x1.eb30bcp125F); LIST.add(-0x1.eb30bcp125F); }
    +2984    public static final float PLUM_JUICE = -0x1.eb2ebap125F;
    +2985    static { NAMED.put("Plum Juice", -0x1.eb2ebap125F); LIST.add(-0x1.eb2ebap125F); }
     2986
     2987    /**
    -2988     * This color constant "Fruit Punch" has RGBA8888 code {@code C80078FF}, L 0.42745098, A 0.6117647, B 0.48235294, alpha 1.0, hue 0.9750635, saturation 0.85248, and chroma 0.22541466.
    +2988     * This color constant "Fruit Punch" has RGBA8888 code {@code C80078FF}, L 0.42745098, A 0.6117647, B 0.48235294, alpha 1.0, hue 0.9781724, saturation 0.95982176, and chroma 0.22541466.
     2989     * It can be represented as a packed float with the constant {@code -0x1.f738dap125F}.
     2990     * <pre>
     2991     * <font style='background-color: #C80078;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C80078; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -3010,55 +3010,55 @@
     2997    static { NAMED.put("Fruit Punch", -0x1.f738dap125F); LIST.add(-0x1.f738dap125F); }
     2998
     2999    /**
    -3000     * This color constant "Bubble Gum" has RGBA8888 code {@code FF50BFFF}, L 0.6156863, A 0.60784316, B 0.46666667, alpha 1.0, hue 0.95230013, saturation 0.79658675, and chroma 0.22487247.
    -3001     * It can be represented as a packed float with the constant {@code -0x1.ef373ap125F}.
    +3000     * This color constant "Bubble Gum" has RGBA8888 code {@code FF50BFFF}, L 0.61960787, A 0.60784316, B 0.46666667, alpha 1.0, hue 0.95571566, saturation 0.939369, and chroma 0.22487247.
    +3001     * It can be represented as a packed float with the constant {@code -0x1.ef373cp125F}.
     3002     * <pre>
     3003     * <font style='background-color: #FF50BF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF50BF; color: #000000'>&nbsp;@&nbsp;</font>
     3004     * <font style='background-color: #FF50BF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF50BF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF50BF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF50BF'>&nbsp;@&nbsp;</font><font style='background-color: #FF50BF; color: #888888'>&nbsp;@&nbsp;</font>
     3005     * <font style='background-color: #FF50BF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF50BF; color: #ffffff'>&nbsp;@&nbsp;</font>
     3006     * </pre>
     3007     */
    -3008    public static final float BUBBLE_GUM = -0x1.ef373ap125F;
    -3009    static { NAMED.put("Bubble Gum", -0x1.ef373ap125F); LIST.add(-0x1.ef373ap125F); }
    +3008    public static final float BUBBLE_GUM = -0x1.ef373cp125F;
    +3009    static { NAMED.put("Bubble Gum", -0x1.ef373cp125F); LIST.add(-0x1.ef373cp125F); }
     3010
     3011    /**
    -3012     * This color constant "Pink Lemonade" has RGBA8888 code {@code FF6AC5FF}, L 0.654902, A 0.5921569, B 0.47058824, alpha 1.0, hue 0.95084393, saturation 0.7901956, and chroma 0.19271713.
    -3013     * It can be represented as a packed float with the constant {@code -0x1.f12f4ep125F}.
    +3012     * This color constant "Pink Lemonade" has RGBA8888 code {@code FF6AC5FF}, L 0.65882355, A 0.5921569, B 0.47058824, alpha 1.0, hue 0.954842, saturation 0.9433962, and chroma 0.19271713.
    +3013     * It can be represented as a packed float with the constant {@code -0x1.f12f5p125F}.
     3014     * <pre>
     3015     * <font style='background-color: #FF6AC5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6AC5; color: #000000'>&nbsp;@&nbsp;</font>
     3016     * <font style='background-color: #FF6AC5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF6AC5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF6AC5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF6AC5'>&nbsp;@&nbsp;</font><font style='background-color: #FF6AC5; color: #888888'>&nbsp;@&nbsp;</font>
     3017     * <font style='background-color: #FF6AC5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6AC5; color: #ffffff'>&nbsp;@&nbsp;</font>
     3018     * </pre>
     3019     */
    -3020    public static final float PINK_LEMONADE = -0x1.f12f4ep125F;
    -3021    static { NAMED.put("Pink Lemonade", -0x1.f12f4ep125F); LIST.add(-0x1.f12f4ep125F); }
    +3020    public static final float PINK_LEMONADE = -0x1.f12f5p125F;
    +3021    static { NAMED.put("Pink Lemonade", -0x1.f12f5p125F); LIST.add(-0x1.f12f5p125F); }
     3022
     3023    /**
    -3024     * This color constant "Shrimp" has RGBA8888 code {@code FAA0B9FF}, L 0.7411765, A 0.54901963, B 0.49803922, alpha 1.0, hue 0.99364984, saturation 0.59266275, and chroma 0.09773435.
    -3025     * It can be represented as a packed float with the constant {@code -0x1.ff197ap125F}.
    +3024     * This color constant "Shrimp" has RGBA8888 code {@code FAA0B9FF}, L 0.7490196, A 0.54901963, B 0.49803922, alpha 1.0, hue 1.2950972E-5, saturation 0.8965517, and chroma 0.09773435.
    +3025     * It can be represented as a packed float with the constant {@code -0x1.ff197ep125F}.
     3026     * <pre>
     3027     * <font style='background-color: #FAA0B9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FAA0B9; color: #000000'>&nbsp;@&nbsp;</font>
     3028     * <font style='background-color: #FAA0B9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FAA0B9'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FAA0B9'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FAA0B9'>&nbsp;@&nbsp;</font><font style='background-color: #FAA0B9; color: #888888'>&nbsp;@&nbsp;</font>
     3029     * <font style='background-color: #FAA0B9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FAA0B9; color: #ffffff'>&nbsp;@&nbsp;</font>
     3030     * </pre>
     3031     */
    -3032    public static final float SHRIMP = -0x1.ff197ap125F;
    -3033    static { NAMED.put("Shrimp", -0x1.ff197ap125F); LIST.add(-0x1.ff197ap125F); }
    +3032    public static final float SHRIMP = -0x1.ff197ep125F;
    +3033    static { NAMED.put("Shrimp", -0x1.ff197ep125F); LIST.add(-0x1.ff197ep125F); }
     3034
     3035    /**
    -3036     * This color constant "Flamingo" has RGBA8888 code {@code FC3A8CFF}, L 0.5647059, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.8134724, and chroma 0.23076649.
    -3037     * It can be represented as a packed float with the constant {@code -0x1.fd3b2p125F}.
    +3036     * This color constant "Flamingo" has RGBA8888 code {@code FC3A8CFF}, L 0.5647059, A 0.6117647, B 0.49411765, alpha 1.0, hue 0.99452704, saturation 0.90678865, and chroma 0.22296442.
    +3037     * It can be represented as a packed float with the constant {@code -0x1.fd392p125F}.
     3038     * <pre>
     3039     * <font style='background-color: #FC3A8C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FC3A8C; color: #000000'>&nbsp;@&nbsp;</font>
     3040     * <font style='background-color: #FC3A8C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FC3A8C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FC3A8C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FC3A8C'>&nbsp;@&nbsp;</font><font style='background-color: #FC3A8C; color: #888888'>&nbsp;@&nbsp;</font>
     3041     * <font style='background-color: #FC3A8C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FC3A8C; color: #ffffff'>&nbsp;@&nbsp;</font>
     3042     * </pre>
     3043     */
    -3044    public static final float FLAMINGO = -0x1.fd3b2p125F;
    -3045    static { NAMED.put("Flamingo", -0x1.fd3b2p125F); LIST.add(-0x1.fd3b2p125F); }
    +3044    public static final float FLAMINGO = -0x1.fd392p125F;
    +3045    static { NAMED.put("Flamingo", -0x1.fd392p125F); LIST.add(-0x1.fd392p125F); }
     3046
     3047    /**
    -3048     * This color constant "Rose" has RGBA8888 code {@code E61E78FF}, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.7659808, and chroma 0.23076649.
    +3048     * This color constant "Rose" has RGBA8888 code {@code E61E78FF}, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99470973, saturation 0.90959585, and chroma 0.23076649.
     3049     * It can be represented as a packed float with the constant {@code -0x1.fd3afcp125F}.
     3050     * <pre>
     3051     * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #000000'>&nbsp;@&nbsp;</font>
    @@ -3070,40 +3070,40 @@
     3057    static { NAMED.put("Rose", -0x1.fd3afcp125F); LIST.add(-0x1.fd3afcp125F); }
     3058
     3059    /**
    -3060     * This color constant "Carmine" has RGBA8888 code {@code BD1039FF}, L 0.3882353, A 0.59607846, B 0.5254902, alpha 1.0, hue 0.04126853, saturation 0.8050748, and chroma 0.198028.
    -3061     * It can be represented as a packed float with the constant {@code -0x1.0d30c6p126F}.
    +3060     * This color constant "Carmine" has RGBA8888 code {@code BD1039FF}, L 0.38431373, A 0.59607846, B 0.5254902, alpha 1.0, hue 0.043443024, saturation 0.9440549, and chroma 0.198028.
    +3061     * It can be represented as a packed float with the constant {@code -0x1.0d30c4p126F}.
     3062     * <pre>
     3063     * <font style='background-color: #BD1039;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BD1039; color: #000000'>&nbsp;@&nbsp;</font>
     3064     * <font style='background-color: #BD1039;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BD1039'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BD1039'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BD1039'>&nbsp;@&nbsp;</font><font style='background-color: #BD1039; color: #888888'>&nbsp;@&nbsp;</font>
     3065     * <font style='background-color: #BD1039;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BD1039; color: #ffffff'>&nbsp;@&nbsp;</font>
     3066     * </pre>
     3067     */
    -3068    public static final float CARMINE = -0x1.0d30c6p126F;
    -3069    static { NAMED.put("Carmine", -0x1.0d30c6p126F); LIST.add(-0x1.0d30c6p126F); }
    +3068    public static final float CARMINE = -0x1.0d30c4p126F;
    +3069    static { NAMED.put("Carmine", -0x1.0d30c4p126F); LIST.add(-0x1.0d30c4p126F); }
     3070
     3071    /**
    -3072     * This color constant "Bologna" has RGBA8888 code {@code 98344DFF}, L 0.36078432, A 0.5686275, B 0.5058824, alpha 1.0, hue 0.01361084, saturation 0.41545326, and chroma 0.13722007.
    -3073     * It can be represented as a packed float with the constant {@code -0x1.0322b8p126F}.
    +3072     * This color constant "Bologna" has RGBA8888 code {@code 98344DFF}, L 0.35686275, A 0.5647059, B 0.5058824, alpha 1.0, hue 0.018649152, saturation 0.6583555, and chroma 0.12943782.
    +3073     * It can be represented as a packed float with the constant {@code -0x1.0320b6p126F}.
     3074     * <pre>
     3075     * <font style='background-color: #98344D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #98344D; color: #000000'>&nbsp;@&nbsp;</font>
     3076     * <font style='background-color: #98344D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #98344D'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #98344D'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #98344D'>&nbsp;@&nbsp;</font><font style='background-color: #98344D; color: #888888'>&nbsp;@&nbsp;</font>
     3077     * <font style='background-color: #98344D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #98344D; color: #ffffff'>&nbsp;@&nbsp;</font>
     3078     * </pre>
     3079     */
    -3080    public static final float BOLOGNA = -0x1.0322b8p126F;
    -3081    static { NAMED.put("Bologna", -0x1.0322b8p126F); LIST.add(-0x1.0322b8p126F); }
    +3080    public static final float BOLOGNA = -0x1.0320b6p126F;
    +3081    static { NAMED.put("Bologna", -0x1.0320b6p126F); LIST.add(-0x1.0320b6p126F); }
     3082
     3083    /**
    -3084     * This color constant "Raspberry" has RGBA8888 code {@code 911437FF}, L 0.3019608, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.02692472, saturation 0.73546606, and chroma 0.16247371.
    -3085     * It can be represented as a packed float with the constant {@code -0x1.07289ap126F}.
    +3084     * This color constant "Raspberry" has RGBA8888 code {@code 911437FF}, L 0.29803923, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.029965011, saturation 0.9096833, and chroma 0.16247371.
    +3085     * It can be represented as a packed float with the constant {@code -0x1.072898p126F}.
     3086     * <pre>
     3087     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #000000'>&nbsp;@&nbsp;</font>
     3088     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #911437; color: #888888'>&nbsp;@&nbsp;</font>
     3089     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #ffffff'>&nbsp;@&nbsp;</font>
     3090     * </pre>
     3091     */
    -3092    public static final float RASPBERRY = -0x1.07289ap126F;
    -3093    static { NAMED.put("Raspberry", -0x1.07289ap126F); LIST.add(-0x1.07289ap126F); }
    +3092    public static final float RASPBERRY = -0x1.072898p126F;
    +3093    static { NAMED.put("Raspberry", -0x1.072898p126F); LIST.add(-0x1.072898p126F); }
     3094
     3095    /**
     3096     * All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html
    index 68cbc10d..6c7ea1c5 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/oklab/SimplePalette.html
    @@ -71,840 +71,841 @@
     058     */
     059    public static final FloatList LIST = new FloatList(50);
     060
    -061    /**
    -062     * This color constant "transparent" has RGBA8888 code {@code 00000000}, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    -063     * It can be represented as a packed float with the constant {@code 0x0.fefep-126F}.
    -064     * <pre>
    -065     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font>
    -066     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font>
    -067     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font>
    -068     * </pre>
    -069     */
    -070    public static final float TRANSPARENT = 0x0.fefep-126F;
    -071    static { NAMED.put("transparent", 0x0.fefep-126F); LIST.add(0x0.fefep-126F); }
    -072
    -073    /**
    -074     * This color constant "black" has RGBA8888 code {@code 000000FF}, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    -075     * It can be represented as a packed float with the constant {@code -0x1.fefep125F}.
    -076     * <pre>
    -077     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font>
    -078     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font>
    -079     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font>
    -080     * </pre>
    -081     */
    -082    public static final float BLACK = -0x1.fefep125F;
    -083    static { NAMED.put("black", -0x1.fefep125F); LIST.add(-0x1.fefep125F); }
    -084
    -085    /**
    -086     * This color constant "gray" has RGBA8888 code {@code 808080FF}, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0016803193, and chroma 0.0055242716.
    -087     * It can be represented as a packed float with the constant {@code -0x1.feff06p125F}.
    -088     * <pre>
    -089     * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #000000'>&nbsp;@&nbsp;</font>
    -090     * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #808080; color: #888888'>&nbsp;@&nbsp;</font>
    -091     * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #ffffff'>&nbsp;@&nbsp;</font>
    -092     * </pre>
    -093     */
    -094    public static final float GRAY = -0x1.feff06p125F;
    -095    static { NAMED.put("gray", -0x1.feff06p125F); LIST.add(-0x1.feff06p125F); }
    -096
    -097    /**
    -098     * This color constant "silver" has RGBA8888 code {@code B6B6B6FF}, L 0.7176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0013493, and chroma 0.0055242716.
    -099     * It can be represented as a packed float with the constant {@code -0x1.feff6ep125F}.
    -100     * <pre>
    -101     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #000000'>&nbsp;@&nbsp;</font>
    -102     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #B6B6B6; color: #888888'>&nbsp;@&nbsp;</font>
    -103     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #ffffff'>&nbsp;@&nbsp;</font>
    -104     * </pre>
    -105     */
    -106    public static final float SILVER = -0x1.feff6ep125F;
    -107    static { NAMED.put("silver", -0x1.feff6ep125F); LIST.add(-0x1.feff6ep125F); }
    -108
    -109    /**
    -110     * This color constant "white" has RGBA8888 code {@code FFFFFFFF}, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    -111     * It can be represented as a packed float with the constant {@code -0x1.fefffep125F}.
    -112     * <pre>
    -113     * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #000000'>&nbsp;@&nbsp;</font>
    -114     * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #FFFFFF; color: #888888'>&nbsp;@&nbsp;</font>
    -115     * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #ffffff'>&nbsp;@&nbsp;</font>
    -116     * </pre>
    -117     */
    -118    public static final float WHITE = -0x1.fefffep125F;
    -119    static { NAMED.put("white", -0x1.fefffep125F); LIST.add(-0x1.fefffep125F); }
    -120
    -121    /**
    -122     * This color constant "red" has RGBA8888 code {@code FF0000FF}, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.07928106, saturation 0.8972241, and chroma 0.25345513.
    -123     * It can be represented as a packed float with the constant {@code -0x1.1f3904p126F}.
    -124     * <pre>
    -125     * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #000000'>&nbsp;@&nbsp;</font>
    -126     * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #FF0000; color: #888888'>&nbsp;@&nbsp;</font>
    -127     * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #ffffff'>&nbsp;@&nbsp;</font>
    -128     * </pre>
    -129     */
    -130    public static final float RED = -0x1.1f3904p126F;
    -131    static { NAMED.put("red", -0x1.1f3904p126F); LIST.add(-0x1.1f3904p126F); }
    -132
    -133    /**
    -134     * This color constant "orange" has RGBA8888 code {@code FF7F00FF}, L 0.6509804, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.15541562, saturation 0.8137945, and chroma 0.17443058.
    -135     * It can be represented as a packed float with the constant {@code -0x1.25194cp126F}.
    -136     * <pre>
    -137     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #000000'>&nbsp;@&nbsp;</font>
    -138     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #FF7F00; color: #888888'>&nbsp;@&nbsp;</font>
    -139     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #ffffff'>&nbsp;@&nbsp;</font>
    -140     * </pre>
    -141     */
    -142    public static final float ORANGE = -0x1.25194cp126F;
    -143    static { NAMED.put("orange", -0x1.25194cp126F); LIST.add(-0x1.25194cp126F); }
    -144
    -145    /**
    -146     * This color constant "yellow" has RGBA8888 code {@code FFFF00FF}, L 0.92941177, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.30886024, saturation 0.92988807, and chroma 0.20529193.
    -147     * It can be represented as a packed float with the constant {@code -0x1.30eddap126F}.
    -148     * <pre>
    -149     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #000000'>&nbsp;@&nbsp;</font>
    -150     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #FFFF00; color: #888888'>&nbsp;@&nbsp;</font>
    -151     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #ffffff'>&nbsp;@&nbsp;</font>
    -152     * </pre>
    -153     */
    -154    public static final float YELLOW = -0x1.30eddap126F;
    -155    static { NAMED.put("yellow", -0x1.30eddap126F); LIST.add(-0x1.30eddap126F); }
    -156
    -157    /**
    -158     * This color constant "green" has RGBA8888 code {@code 00FF00FF}, L 0.8, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39883053, saturation 0.9818446, and chroma 0.29610303.
    -159     * It can be represented as a packed float with the constant {@code -0x1.2cc398p126F}.
    -160     * <pre>
    -161     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #000000'>&nbsp;@&nbsp;</font>
    -162     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #00FF00; color: #888888'>&nbsp;@&nbsp;</font>
    -163     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #ffffff'>&nbsp;@&nbsp;</font>
    -164     * </pre>
    -165     */
    -166    public static final float GREEN = -0x1.2cc398p126F;
    -167    static { NAMED.put("green", -0x1.2cc398p126F); LIST.add(-0x1.2cc398p126F); }
    -168
    -169    /**
    -170     * This color constant "blue" has RGBA8888 code {@code 0000FFFF}, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.7323789, saturation 0.97586775, and chroma 0.31835338.
    -171     * It can be represented as a packed float with the constant {@code -0x1.aef69cp125F}.
    -172     * <pre>
    -173     * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #000000'>&nbsp;@&nbsp;</font>
    -174     * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #0000FF; color: #888888'>&nbsp;@&nbsp;</font>
    -175     * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #ffffff'>&nbsp;@&nbsp;</font>
    -176     * </pre>
    -177     */
    -178    public static final float BLUE = -0x1.aef69cp125F;
    -179    static { NAMED.put("blue", -0x1.aef69cp125F); LIST.add(-0x1.aef69cp125F); }
    -180
    -181    /**
    -182     * This color constant "indigo" has RGBA8888 code {@code 520FE0FF}, L 0.32156864, A 0.53333336, B 0.36862746, alpha 1.0, hue 0.7895446, saturation 0.9090131, and chroma 0.27001202.
    -183     * It can be represented as a packed float with the constant {@code -0x1.bd10a4p125F}.
    -184     * <pre>
    -185     * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #000000'>&nbsp;@&nbsp;</font>
    -186     * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #520FE0; color: #888888'>&nbsp;@&nbsp;</font>
    -187     * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #ffffff'>&nbsp;@&nbsp;</font>
    -188     * </pre>
    -189     */
    -190    public static final float INDIGO = -0x1.bd10a4p125F;
    -191    static { NAMED.put("indigo", -0x1.bd10a4p125F); LIST.add(-0x1.bd10a4p125F); }
    -192
    -193    /**
    -194     * This color constant "violet" has RGBA8888 code {@code 9040EFFF}, L 0.4627451, A 0.56078434, B 0.39607844, alpha 1.0, hue 0.8342395, saturation 0.6792487, and chroma 0.23984502.
    -195     * It can be represented as a packed float with the constant {@code -0x1.cb1eecp125F}.
    -196     * <pre>
    -197     * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #000000'>&nbsp;@&nbsp;</font>
    -198     * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #9040EF; color: #888888'>&nbsp;@&nbsp;</font>
    -199     * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #ffffff'>&nbsp;@&nbsp;</font>
    -200     * </pre>
    -201     */
    -202    public static final float VIOLET = -0x1.cb1eecp125F;
    -203    static { NAMED.put("violet", -0x1.cb1eecp125F); LIST.add(-0x1.cb1eecp125F); }
    -204
    -205    /**
    -206     * This color constant "purple" has RGBA8888 code {@code C000FFFF}, L 0.49803922, A 0.60784316, B 0.3882353, alpha 1.0, hue 0.8721605, saturation 0.96817255, and chroma 0.30940855.
    -207     * It can be represented as a packed float with the constant {@code -0x1.c736fep125F}.
    -208     * <pre>
    -209     * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #000000'>&nbsp;@&nbsp;</font>
    -210     * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #C000FF; color: #888888'>&nbsp;@&nbsp;</font>
    -211     * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #ffffff'>&nbsp;@&nbsp;</font>
    -212     * </pre>
    -213     */
    -214    public static final float PURPLE = -0x1.c736fep125F;
    -215    static { NAMED.put("purple", -0x1.c736fep125F); LIST.add(-0x1.c736fep125F); }
    -216
    -217    /**
    -218     * This color constant "brown" has RGBA8888 code {@code 8F573BFF}, L 0.4117647, A 0.5254902, B 0.5294118, alpha 1.0, hue 0.13634071, saturation 0.24020728, and chroma 0.07753685.
    -219     * It can be represented as a packed float with the constant {@code -0x1.0f0cd2p126F}.
    -220     * <pre>
    -221     * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #000000'>&nbsp;@&nbsp;</font>
    -222     * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #8F573B; color: #888888'>&nbsp;@&nbsp;</font>
    -223     * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #ffffff'>&nbsp;@&nbsp;</font>
    -224     * </pre>
    -225     */
    -226    public static final float BROWN = -0x1.0f0cd2p126F;
    -227    static { NAMED.put("brown", -0x1.0f0cd2p126F); LIST.add(-0x1.0f0cd2p126F); }
    -228
    -229    /**
    -230     * This color constant "pink" has RGBA8888 code {@code FFA0E0FF}, L 0.7607843, A 0.5568628, B 0.4745098, alpha 1.0, hue 0.9329364, saturation 0.68139654, and chroma 0.124142565.
    -231     * It can be represented as a packed float with the constant {@code -0x1.f31d84p125F}.
    -232     * <pre>
    -233     * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #000000'>&nbsp;@&nbsp;</font>
    -234     * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #FFA0E0; color: #888888'>&nbsp;@&nbsp;</font>
    -235     * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #ffffff'>&nbsp;@&nbsp;</font>
    -236     * </pre>
    -237     */
    -238    public static final float PINK = -0x1.f31d84p125F;
    -239    static { NAMED.put("pink", -0x1.f31d84p125F); LIST.add(-0x1.f31d84p125F); }
    -240
    -241    /**
    -242     * This color constant "magenta" has RGBA8888 code {@code F500F5FF}, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9091779, saturation 0.9090322, and chroma 0.31098264.
    -243     * It can be represented as a packed float with the constant {@code -0x1.d54326p125F}.
    -244     * <pre>
    -245     * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #000000'>&nbsp;@&nbsp;</font>
    -246     * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #F500F5; color: #888888'>&nbsp;@&nbsp;</font>
    -247     * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #ffffff'>&nbsp;@&nbsp;</font>
    -248     * </pre>
    -249     */
    -250    public static final float MAGENTA = -0x1.d54326p125F;
    -251    static { NAMED.put("magenta", -0x1.d54326p125F); LIST.add(-0x1.d54326p125F); }
    -252
    -253    /**
    -254     * This color constant "brick" has RGBA8888 code {@code D5524AFF}, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.07195936, saturation 0.3226597, and chroma 0.15199278.
    -255     * It can be represented as a packed float with the constant {@code -0x1.112306p126F}.
    -256     * <pre>
    -257     * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #000000'>&nbsp;@&nbsp;</font>
    -258     * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #D5524A; color: #888888'>&nbsp;@&nbsp;</font>
    -259     * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #ffffff'>&nbsp;@&nbsp;</font>
    -260     * </pre>
    -261     */
    -262    public static final float BRICK = -0x1.112306p126F;
    -263    static { NAMED.put("brick", -0x1.112306p126F); LIST.add(-0x1.112306p126F); }
    -264
    -265    /**
    -266     * This color constant "ember" has RGBA8888 code {@code F55A32FF}, L 0.57254905, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10581406, saturation 0.668431, and chroma 0.1836353.
    -267     * It can be represented as a packed float with the constant {@code -0x1.1d2524p126F}.
    -268     * <pre>
    -269     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #000000'>&nbsp;@&nbsp;</font>
    -270     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #F55A32; color: #888888'>&nbsp;@&nbsp;</font>
    -271     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #ffffff'>&nbsp;@&nbsp;</font>
    -272     * </pre>
    -273     */
    -274    public static final float EMBER = -0x1.1d2524p126F;
    -275    static { NAMED.put("ember", -0x1.1d2524p126F); LIST.add(-0x1.1d2524p126F); }
    -276
    -277    /**
    -278     * This color constant "salmon" has RGBA8888 code {@code FF6262FF}, L 0.6117647, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06254671, saturation 0.8039996, and chroma 0.17337766.
    -279     * It can be represented as a packed float with the constant {@code -0x1.112938p126F}.
    -280     * <pre>
    -281     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #000000'>&nbsp;@&nbsp;</font>
    -282     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #FF6262; color: #888888'>&nbsp;@&nbsp;</font>
    -283     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #ffffff'>&nbsp;@&nbsp;</font>
    -284     * </pre>
    -285     */
    -286    public static final float SALMON = -0x1.112938p126F;
    -287    static { NAMED.put("salmon", -0x1.112938p126F); LIST.add(-0x1.112938p126F); }
    -288
    -289    /**
    -290     * This color constant "chocolate" has RGBA8888 code {@code 683818FF}, L 0.27450982, A 0.5254902, B 0.53333336, alpha 1.0, hue 0.14608382, saturation 0.49234077, and chroma 0.0835974.
    -291     * It can be represented as a packed float with the constant {@code -0x1.110c8cp126F}.
    -292     * <pre>
    -293     * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #000000'>&nbsp;@&nbsp;</font>
    -294     * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #683818; color: #888888'>&nbsp;@&nbsp;</font>
    -295     * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #ffffff'>&nbsp;@&nbsp;</font>
    -296     * </pre>
    -297     */
    -298    public static final float CHOCOLATE = -0x1.110c8cp126F;
    -299    static { NAMED.put("chocolate", -0x1.110c8cp126F); LIST.add(-0x1.110c8cp126F); }
    -300
    -301    /**
    -302     * This color constant "tan" has RGBA8888 code {@code D2B48CFF}, L 0.7294118, A 0.5058824, B 0.5254902, alpha 1.0, hue 0.21390288, saturation 0.08232166, and chroma 0.052115876.
    -303     * It can be represented as a packed float with the constant {@code -0x1.0d0374p126F}.
    -304     * <pre>
    -305     * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #000000'>&nbsp;@&nbsp;</font>
    -306     * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #D2B48C; color: #888888'>&nbsp;@&nbsp;</font>
    -307     * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #ffffff'>&nbsp;@&nbsp;</font>
    -308     * </pre>
    -309     */
    -310    public static final float TAN = -0x1.0d0374p126F;
    -311    static { NAMED.put("tan", -0x1.0d0374p126F); LIST.add(-0x1.0d0374p126F); }
    -312
    -313    /**
    -314     * This color constant "bronze" has RGBA8888 code {@code CE8E31FF}, L 0.61960787, A 0.5137255, B 0.56078434, alpha 1.0, hue 0.21465261, saturation 0.5864422, and chroma 0.124142565.
    -315     * It can be represented as a packed float with the constant {@code -0x1.1f073cp126F}.
    -316     * <pre>
    -317     * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #000000'>&nbsp;@&nbsp;</font>
    -318     * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #CE8E31; color: #888888'>&nbsp;@&nbsp;</font>
    -319     * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #ffffff'>&nbsp;@&nbsp;</font>
    -320     * </pre>
    -321     */
    -322    public static final float BRONZE = -0x1.1f073cp126F;
    -323    static { NAMED.put("bronze", -0x1.1f073cp126F); LIST.add(-0x1.1f073cp126F); }
    -324
    -325    /**
    -326     * This color constant "cinnamon" has RGBA8888 code {@code D2691DFF}, L 0.54509807, A 0.54509807, B 0.56078434, alpha 1.0, hue 0.14839543, saturation 0.7197198, and chroma 0.15078327.
    -327     * It can be represented as a packed float with the constant {@code -0x1.1f1716p126F}.
    -328     * <pre>
    -329     * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #000000'>&nbsp;@&nbsp;</font>
    -330     * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #D2691D; color: #888888'>&nbsp;@&nbsp;</font>
    -331     * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #ffffff'>&nbsp;@&nbsp;</font>
    -332     * </pre>
    -333     */
    -334    public static final float CINNAMON = -0x1.1f1716p126F;
    -335    static { NAMED.put("cinnamon", -0x1.1f1716p126F); LIST.add(-0x1.1f1716p126F); }
    -336
    -337    /**
    -338     * This color constant "apricot" has RGBA8888 code {@code FFA828FF}, L 0.7372549, A 0.52156866, B 0.5764706, alpha 1.0, hue 0.20625468, saturation 0.75939417, and chroma 0.1582875.
    -339     * It can be represented as a packed float with the constant {@code -0x1.270b78p126F}.
    -340     * <pre>
    -341     * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #000000'>&nbsp;@&nbsp;</font>
    -342     * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #FFA828; color: #888888'>&nbsp;@&nbsp;</font>
    -343     * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #ffffff'>&nbsp;@&nbsp;</font>
    -344     * </pre>
    -345     */
    -346    public static final float APRICOT = -0x1.270b78p126F;
    -347    static { NAMED.put("apricot", -0x1.270b78p126F); LIST.add(-0x1.270b78p126F); }
    -348
    -349    /**
    -350     * This color constant "peach" has RGBA8888 code {@code FFBF81FF}, L 0.79607844, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.19064914, saturation 0.6557377, and chroma 0.096477255.
    -351     * It can be represented as a packed float with the constant {@code -0x1.170996p126F}.
    -352     * <pre>
    -353     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #000000'>&nbsp;@&nbsp;</font>
    -354     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #FFBF81; color: #888888'>&nbsp;@&nbsp;</font>
    -355     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #ffffff'>&nbsp;@&nbsp;</font>
    -356     * </pre>
    -357     */
    -358    public static final float PEACH = -0x1.170996p126F;
    -359    static { NAMED.put("peach", -0x1.170996p126F); LIST.add(-0x1.170996p126F); }
    -360
    -361    /**
    -362     * This color constant "pear" has RGBA8888 code {@code D3E330FF}, L 0.8235294, A 0.45882353, B 0.58431375, alpha 1.0, hue 0.32230157, saturation 0.7434462, and chroma 0.18692946.
    -363     * It can be represented as a packed float with the constant {@code -0x1.2aeba4p126F}.
    -364     * <pre>
    -365     * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #000000'>&nbsp;@&nbsp;</font>
    -366     * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #D3E330; color: #888888'>&nbsp;@&nbsp;</font>
    -367     * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #ffffff'>&nbsp;@&nbsp;</font>
    -368     * </pre>
    -369     */
    -370    public static final float PEAR = -0x1.2aeba4p126F;
    -371    static { NAMED.put("pear", -0x1.2aeba4p126F); LIST.add(-0x1.2aeba4p126F); }
    -372
    -373    /**
    -374     * This color constant "saffron" has RGBA8888 code {@code FFD510FF}, L 0.83137256, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27457327, saturation 0.8132536, and chroma 0.17789528.
    -375     * It can be represented as a packed float with the constant {@code -0x1.2cf9a8p126F}.
    -376     * <pre>
    -377     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #000000'>&nbsp;@&nbsp;</font>
    -378     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #FFD510; color: #888888'>&nbsp;@&nbsp;</font>
    -379     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #ffffff'>&nbsp;@&nbsp;</font>
    -380     * </pre>
    -381     */
    -382    public static final float SAFFRON = -0x1.2cf9a8p126F;
    -383    static { NAMED.put("saffron", -0x1.2cf9a8p126F); LIST.add(-0x1.2cf9a8p126F); }
    -384
    -385    /**
    -386     * This color constant "butter" has RGBA8888 code {@code FFF288FF}, L 0.9098039, A 0.4862745, B 0.5568628, alpha 1.0, hue 0.28769454, saturation 0.49273357, and chroma 0.11653464.
    -387     * It can be represented as a packed float with the constant {@code -0x1.1cf9dp126F}.
    -388     * <pre>
    -389     * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #000000'>&nbsp;@&nbsp;</font>
    -390     * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #FFF288; color: #888888'>&nbsp;@&nbsp;</font>
    -391     * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #ffffff'>&nbsp;@&nbsp;</font>
    -392     * </pre>
    -393     */
    -394    public static final float BUTTER = -0x1.1cf9dp126F;
    -395    static { NAMED.put("butter", -0x1.1cf9dp126F); LIST.add(-0x1.1cf9dp126F); }
    -396
    -397    /**
    -398     * This color constant "chartreuse" has RGBA8888 code {@code C8FF41FF}, L 0.8862745, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34942675, saturation 0.9817451, and chroma 0.2070681.
    -399     * It can be represented as a packed float with the constant {@code -0x1.2ae1c4p126F}.
    -400     * <pre>
    -401     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #000000'>&nbsp;@&nbsp;</font>
    -402     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #C8FF41; color: #888888'>&nbsp;@&nbsp;</font>
    -403     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #ffffff'>&nbsp;@&nbsp;</font>
    -404     * </pre>
    -405     */
    -406    public static final float CHARTREUSE = -0x1.2ae1c4p126F;
    -407    static { NAMED.put("chartreuse", -0x1.2ae1c4p126F); LIST.add(-0x1.2ae1c4p126F); }
    -408
    -409    /**
    -410     * This color constant "cactus" has RGBA8888 code {@code 30A000FF}, L 0.5254902, A 0.41960785, B 0.5647059, alpha 1.0, hue 0.39212817, saturation 0.809409, and chroma 0.20558903.
    -411     * It can be represented as a packed float with the constant {@code -0x1.20d70cp126F}.
    -412     * <pre>
    -413     * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #000000'>&nbsp;@&nbsp;</font>
    -414     * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #30A000; color: #888888'>&nbsp;@&nbsp;</font>
    -415     * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #ffffff'>&nbsp;@&nbsp;</font>
    -416     * </pre>
    -417     */
    -418    public static final float CACTUS = -0x1.20d70cp126F;
    -419    static { NAMED.put("cactus", -0x1.20d70cp126F); LIST.add(-0x1.20d70cp126F); }
    -420
    -421    /**
    -422     * This color constant "lime" has RGBA8888 code {@code 93D300FF}, L 0.7294118, A 0.43529412, B 0.5803922, alpha 1.0, hue 0.3578718, saturation 0.78243065, and chroma 0.20558903.
    -423     * It can be represented as a packed float with the constant {@code -0x1.28df74p126F}.
    -424     * <pre>
    -425     * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #000000'>&nbsp;@&nbsp;</font>
    -426     * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #93D300; color: #888888'>&nbsp;@&nbsp;</font>
    -427     * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #ffffff'>&nbsp;@&nbsp;</font>
    -428     * </pre>
    -429     */
    -430    public static final float LIME = -0x1.28df74p126F;
    -431    static { NAMED.put("lime", -0x1.28df74p126F); LIST.add(-0x1.28df74p126F); }
    -432
    -433    /**
    -434     * This color constant "olive" has RGBA8888 code {@code 818000FF}, L 0.49019608, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.31318712, saturation 0.76235455, and chroma 0.13131043.
    -435     * It can be represented as a packed float with the constant {@code -0x1.1ef2fap126F}.
    -436     * <pre>
    -437     * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #000000'>&nbsp;@&nbsp;</font>
    -438     * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #818000; color: #888888'>&nbsp;@&nbsp;</font>
    -439     * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #ffffff'>&nbsp;@&nbsp;</font>
    -440     * </pre>
    -441     */
    -442    public static final float OLIVE = -0x1.1ef2fap126F;
    -443    static { NAMED.put("olive", -0x1.1ef2fap126F); LIST.add(-0x1.1ef2fap126F); }
    -444
    -445    /**
    -446     * This color constant "fern" has RGBA8888 code {@code 4E7942FF}, L 0.43137255, A 0.4627451, B 0.5294118, alpha 1.0, hue 0.3936267, saturation 0.22094448, and chroma 0.0945603.
    -447     * It can be represented as a packed float with the constant {@code -0x1.0eecdcp126F}.
    -448     * <pre>
    -449     * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #000000'>&nbsp;@&nbsp;</font>
    -450     * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #4E7942; color: #888888'>&nbsp;@&nbsp;</font>
    -451     * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #ffffff'>&nbsp;@&nbsp;</font>
    -452     * </pre>
    -453     */
    -454    public static final float FERN = -0x1.0eecdcp126F;
    -455    static { NAMED.put("fern", -0x1.0eecdcp126F); LIST.add(-0x1.0eecdcp126F); }
    -456
    -457    /**
    -458     * This color constant "moss" has RGBA8888 code {@code 204608FF}, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.38294512, saturation 0.6363817, and chroma 0.11062346.
    -459     * It can be represented as a packed float with the constant {@code -0x1.12ea74p126F}.
    -460     * <pre>
    -461     * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #000000'>&nbsp;@&nbsp;</font>
    -462     * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #204608; color: #888888'>&nbsp;@&nbsp;</font>
    -463     * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #ffffff'>&nbsp;@&nbsp;</font>
    -464     * </pre>
    -465     */
    -466    public static final float MOSS = -0x1.12ea74p126F;
    -467    static { NAMED.put("moss", -0x1.12ea74p126F); LIST.add(-0x1.12ea74p126F); }
    -468
    -469    /**
    -470     * This color constant "celery" has RGBA8888 code {@code 7DFF73FF}, L 0.84313726, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39695174, saturation 0.8276294, and chroma 0.20078278.
    -471     * It can be represented as a packed float with the constant {@code -0x1.1ed7aep126F}.
    -472     * <pre>
    -473     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #000000'>&nbsp;@&nbsp;</font>
    -474     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #7DFF73; color: #888888'>&nbsp;@&nbsp;</font>
    -475     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #ffffff'>&nbsp;@&nbsp;</font>
    -476     * </pre>
    -477     */
    -478    public static final float CELERY = -0x1.1ed7aep126F;
    -479    static { NAMED.put("celery", -0x1.1ed7aep126F); LIST.add(-0x1.1ed7aep126F); }
    -480
    -481    /**
    -482     * This color constant "sage" has RGBA8888 code {@code ABE3C5FF}, L 0.81960785, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.118390046, and chroma 0.069218926.
    -483     * It can be represented as a packed float with the constant {@code -0x1.04efa2p126F}.
    -484     * <pre>
    -485     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #000000'>&nbsp;@&nbsp;</font>
    -486     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ABE3C5; color: #888888'>&nbsp;@&nbsp;</font>
    -487     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #ffffff'>&nbsp;@&nbsp;</font>
    -488     * </pre>
    -489     */
    -490    public static final float SAGE = -0x1.04efa2p126F;
    -491    static { NAMED.put("sage", -0x1.04efa2p126F); LIST.add(-0x1.04efa2p126F); }
    -492
    -493    /**
    -494     * This color constant "jade" has RGBA8888 code {@code 3FBF3FFF}, L 0.6313726, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4055531, saturation 0.71121687, and chroma 0.20259848.
    -495     * It can be represented as a packed float with the constant {@code -0x1.1cd542p126F}.
    -496     * <pre>
    -497     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #000000'>&nbsp;@&nbsp;</font>
    -498     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #3FBF3F; color: #888888'>&nbsp;@&nbsp;</font>
    -499     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #ffffff'>&nbsp;@&nbsp;</font>
    -500     * </pre>
    -501     */
    -502    public static final float JADE = -0x1.1cd542p126F;
    -503    static { NAMED.put("jade", -0x1.1cd542p126F); LIST.add(-0x1.1cd542p126F); }
    -504
    -505    /**
    -506     * This color constant "cyan" has RGBA8888 code {@code 00FFFFFF}, L 0.8509804, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.54374534, saturation 0.95340395, and chroma 0.1582875.
    -507     * It can be represented as a packed float with the constant {@code -0x1.f4d9b2p125F}.
    -508     * <pre>
    -509     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #000000'>&nbsp;@&nbsp;</font>
    -510     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #00FFFF; color: #888888'>&nbsp;@&nbsp;</font>
    -511     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #ffffff'>&nbsp;@&nbsp;</font>
    -512     * </pre>
    -513     */
    -514    public static final float CYAN = -0x1.f4d9b2p125F;
    -515    static { NAMED.put("cyan", -0x1.f4d9b2p125F); LIST.add(-0x1.f4d9b2p125F); }
    -516
    -517    /**
    -518     * This color constant "mint" has RGBA8888 code {@code 7FFFD4FF}, L 0.8666667, A 0.4392157, B 0.50980395, alpha 1.0, hue 0.47453672, saturation 0.8283974, and chroma 0.12265874.
    -519     * It can be represented as a packed float with the constant {@code -0x1.04e1bap126F}.
    -520     * <pre>
    -521     * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #000000'>&nbsp;@&nbsp;</font>
    -522     * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #7FFFD4; color: #888888'>&nbsp;@&nbsp;</font>
    -523     * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #ffffff'>&nbsp;@&nbsp;</font>
    -524     * </pre>
    -525     */
    -526    public static final float MINT = -0x1.04e1bap126F;
    -527    static { NAMED.put("mint", -0x1.04e1bap126F); LIST.add(-0x1.04e1bap126F); }
    -528
    -529    /**
    -530     * This color constant "teal" has RGBA8888 code {@code 007F7FFF}, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.543443, saturation 0.89123964, and chroma 0.10141215.
    -531     * It can be represented as a packed float with the constant {@code -0x1.f8e6ep125F}.
    -532     * <pre>
    -533     * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #000000'>&nbsp;@&nbsp;</font>
    -534     * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #007F7F; color: #888888'>&nbsp;@&nbsp;</font>
    -535     * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #ffffff'>&nbsp;@&nbsp;</font>
    -536     * </pre>
    -537     */
    -538    public static final float TEAL = -0x1.f8e6ep125F;
    -539    static { NAMED.put("teal", -0x1.f8e6ep125F); LIST.add(-0x1.f8e6ep125F); }
    -540
    -541    /**
    -542     * This color constant "turquoise" has RGBA8888 code {@code 2ED6C9FF}, L 0.7254902, A 0.43137255, B 0.49019608, alpha 1.0, hue 0.52259654, saturation 0.8433125, and chroma 0.1381068.
    -543     * It can be represented as a packed float with the constant {@code -0x1.fadd72p125F}.
    -544     * <pre>
    -545     * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #000000'>&nbsp;@&nbsp;</font>
    -546     * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #2ED6C9; color: #888888'>&nbsp;@&nbsp;</font>
    -547     * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #ffffff'>&nbsp;@&nbsp;</font>
    -548     * </pre>
    -549     */
    -550    public static final float TURQUOISE = -0x1.fadd72p125F;
    -551    static { NAMED.put("turquoise", -0x1.fadd72p125F); LIST.add(-0x1.fadd72p125F); }
    -552
    -553    /**
    -554     * This color constant "sky" has RGBA8888 code {@code 10C0E0FF}, L 0.67058825, A 0.44313726, B 0.4627451, alpha 1.0, hue 0.59232193, saturation 0.8547556, and chroma 0.13542919.
    -555     * It can be represented as a packed float with the constant {@code -0x1.ece356p125F}.
    -556     * <pre>
    -557     * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #000000'>&nbsp;@&nbsp;</font>
    -558     * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #10C0E0; color: #888888'>&nbsp;@&nbsp;</font>
    -559     * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #ffffff'>&nbsp;@&nbsp;</font>
    -560     * </pre>
    -561     */
    -562    public static final float SKY = -0x1.ece356p125F;
    -563    static { NAMED.put("sky", -0x1.ece356p125F); LIST.add(-0x1.ece356p125F); }
    -564
    -565    /**
    -566     * This color constant "cobalt" has RGBA8888 code {@code 0046ABFF}, L 0.30588236, A 0.48235294, B 0.4117647, alpha 1.0, hue 0.71857655, saturation 0.73578477, and chroma 0.1792624.
    -567     * It can be represented as a packed float with the constant {@code -0x1.d2f69cp125F}.
    -568     * <pre>
    -569     * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #000000'>&nbsp;@&nbsp;</font>
    -570     * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #0046AB; color: #888888'>&nbsp;@&nbsp;</font>
    -571     * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #ffffff'>&nbsp;@&nbsp;</font>
    -572     * </pre>
    -573     */
    -574    public static final float COBALT = -0x1.d2f69cp125F;
    -575    static { NAMED.put("cobalt", -0x1.d2f69cp125F); LIST.add(-0x1.d2f69cp125F); }
    -576
    -577    /**
    -578     * This color constant "denim" has RGBA8888 code {@code 3088B8FF}, L 0.5058824, A 0.46666667, B 0.45490196, alpha 1.0, hue 0.6486837, saturation 0.5816889, and chroma 0.11172148.
    -579     * It can be represented as a packed float with the constant {@code -0x1.e8ef02p125F}.
    -580     * <pre>
    -581     * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #000000'>&nbsp;@&nbsp;</font>
    -582     * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #3088B8; color: #888888'>&nbsp;@&nbsp;</font>
    -583     * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #ffffff'>&nbsp;@&nbsp;</font>
    -584     * </pre>
    -585     */
    -586    public static final float DENIM = -0x1.e8ef02p125F;
    -587    static { NAMED.put("denim", -0x1.e8ef02p125F); LIST.add(-0x1.e8ef02p125F); }
    -588
    -589    /**
    -590     * This color constant "navy" has RGBA8888 code {@code 000080FF}, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.7282781, saturation 0.96145123, and chroma 0.20108652.
    -591     * It can be represented as a packed float with the constant {@code -0x1.ccf848p125F}.
    -592     * <pre>
    -593     * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #000000'>&nbsp;@&nbsp;</font>
    -594     * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #000080; color: #888888'>&nbsp;@&nbsp;</font>
    -595     * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #ffffff'>&nbsp;@&nbsp;</font>
    -596     * </pre>
    -597     */
    -598    public static final float NAVY = -0x1.ccf848p125F;
    -599    static { NAMED.put("navy", -0x1.ccf848p125F); LIST.add(-0x1.ccf848p125F); }
    -600
    -601    /**
    -602     * This color constant "lavender" has RGBA8888 code {@code B991FFFF}, L 0.67058825, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.82570946, saturation 0.84011585, and chroma 0.14500555.
    -603     * It can be represented as a packed float with the constant {@code -0x1.df1156p125F}.
    -604     * <pre>
    -605     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #000000'>&nbsp;@&nbsp;</font>
    -606     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #B991FF; color: #888888'>&nbsp;@&nbsp;</font>
    -607     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #ffffff'>&nbsp;@&nbsp;</font>
    -608     * </pre>
    -609     */
    -610    public static final float LAVENDER = -0x1.df1156p125F;
    -611    static { NAMED.put("lavender", -0x1.df1156p125F); LIST.add(-0x1.df1156p125F); }
    -612
    -613    /**
    -614     * This color constant "plum" has RGBA8888 code {@code BE0DC6FF}, L 0.45490196, A 0.6117647, B 0.42352942, alpha 1.0, hue 0.90448654, saturation 0.9074911, and chroma 0.26978588.
    -615     * It can be represented as a packed float with the constant {@code -0x1.d938e8p125F}.
    -616     * <pre>
    -617     * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #000000'>&nbsp;@&nbsp;</font>
    -618     * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #BE0DC6; color: #888888'>&nbsp;@&nbsp;</font>
    -619     * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #ffffff'>&nbsp;@&nbsp;</font>
    -620     * </pre>
    -621     */
    -622    public static final float PLUM = -0x1.d938e8p125F;
    -623    static { NAMED.put("plum", -0x1.d938e8p125F); LIST.add(-0x1.d938e8p125F); }
    -624
    -625    /**
    -626     * This color constant "mauve" has RGBA8888 code {@code AB73ABFF}, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.09785124, and chroma 0.1008085.
    -627     * It can be represented as a packed float with the constant {@code -0x1.f11518p125F}.
    -628     * <pre>
    -629     * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #000000'>&nbsp;@&nbsp;</font>
    -630     * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #AB73AB; color: #888888'>&nbsp;@&nbsp;</font>
    -631     * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #ffffff'>&nbsp;@&nbsp;</font>
    -632     * </pre>
    -633     */
    -634    public static final float MAUVE = -0x1.f11518p125F;
    -635    static { NAMED.put("mauve", -0x1.f11518p125F); LIST.add(-0x1.f11518p125F); }
    -636
    -637    /**
    -638     * This color constant "rose" has RGBA8888 code {@code E61E78FF}, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.7659808, and chroma 0.23076649.
    -639     * It can be represented as a packed float with the constant {@code -0x1.fd3afcp125F}.
    -640     * <pre>
    -641     * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #000000'>&nbsp;@&nbsp;</font>
    -642     * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #E61E78; color: #888888'>&nbsp;@&nbsp;</font>
    -643     * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #ffffff'>&nbsp;@&nbsp;</font>
    -644     * </pre>
    -645     */
    -646    public static final float ROSE = -0x1.fd3afcp125F;
    -647    static { NAMED.put("rose", -0x1.fd3afcp125F); LIST.add(-0x1.fd3afcp125F); }
    -648
    -649    /**
    -650     * This color constant "raspberry" has RGBA8888 code {@code 911437FF}, L 0.3019608, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.02692472, saturation 0.73546606, and chroma 0.16247371.
    -651     * It can be represented as a packed float with the constant {@code -0x1.07289ap126F}.
    -652     * <pre>
    -653     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #000000'>&nbsp;@&nbsp;</font>
    -654     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #911437; color: #888888'>&nbsp;@&nbsp;</font>
    -655     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #ffffff'>&nbsp;@&nbsp;</font>
    -656     * </pre>
    -657     */
    -658    public static final float RASPBERRY = -0x1.07289ap126F;
    -659    static { NAMED.put("raspberry", -0x1.07289ap126F); LIST.add(-0x1.07289ap126F); }
    -660
    -661    /**
    -662     * All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color
    -663     * by looking up a name in {@link #NAMED}.
    -664     */
    -665    public static final ObjectList<String> NAMES = NAMED.order();
    -666    static {
    -667        NAMED.setDefaultValue(TRANSPARENT);
    -668        NAMES.sort(null);
    -669    }
    -670    /**
    -671     * All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to
    -672     * blue. You can fetch the corresponding packed float color by looking up a name in {@link #NAMED}.
    -673     */
    -674    public static final ObjectList<String> NAMES_BY_HUE = new ObjectList<>(NAMES);
    -675    /**
    -676     * The packed Oklab float colors that correspond to items in {@link #NAMES_BY_HUE}, with the same order.
    -677     */
    -678    public static final FloatList COLORS_BY_HUE = new FloatList(NAMES_BY_HUE.size());
    -679    /**
    -680     * All names for colors in this palette, sorted by lightness from black to white. You can fetch the
    -681     * corresponding packed float color by looking up a name in {@link #NAMED}.
    -682     */
    -683    public static final ObjectList<String> NAMES_BY_LIGHTNESS = new ObjectList<>(NAMES);
    -684    static {
    -685        NAMES_BY_HUE.sort((o1, o2) -> {
    -686            final float c1 = NAMED.get(o1), c2 = NAMED.get(o2);
    -687            if(ColorTools.alphaInt(c1) < 128) return -10000;
    -688            else if(ColorTools.alphaInt(c2) < 128) return 10000;
    -689            final float s1 = ColorTools.oklabSaturation(c1), s2 = ColorTools.oklabSaturation(c2);
    -690            if(s1 <= 0.05f && s2 > 0.05f)
    -691                return -1000;
    -692            else if(s1 > 0.05f && s2 <= 0.05f)
    -693                return 1000;
    -694            else if(s1 <= 0.05f && s2 <= 0.05f)
    -695                return (int)Math.signum(ColorTools.channelL(c1) - ColorTools.channelL(c2));
    -696            else
    -697                return 2 * (int)Math.signum(ColorTools.oklabHue(c1) - ColorTools.oklabHue(c2))
    -698                        + (int)Math.signum(ColorTools.channelL(c1) - ColorTools.channelL(c2));
    -699        });
    -700        for(String name : NAMES_BY_HUE) {
    -701            COLORS_BY_HUE.add(NAMED.get(name));
    -702        }
    -703        NAMES_BY_LIGHTNESS.sort((o1, o2) ->
    -704                Float.compare(ColorTools.channelL(NAMED.get(o1)), ColorTools.channelL(NAMED.get(o2))));
    -705    }
    -706
    -707    private static final FloatList mixing = new FloatList(4);
    -708
    -709    /**
    -710     * Parses a color description and returns the approximate color it describes, as a packed float color.
    -711     * Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically
    -712     * spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in
    -713     * {@link #NAMED} and tracked; if there is more than one of these color name words, the colors will be mixed using
    -714     * {@link FloatColors#mix(float[], int, int)}, or if there is just one color name word, then the corresponding color
    -715     * will be used. The special adjectives "light" and "dark" change the intensity of the described color; likewise,
    -716     * "rich" and "dull" change the saturation (the difference of the chromatic channels from grayscale). All of these
    -717     * adjectives can have "-er" or "-est" appended to make their effect twice or three times as strong. Technically,
    -718     * the chars appended to an adjective don't matter, only their count, so "lightaa" is the same as "lighter" and
    -719     * "richcat" is the same as "richest". There's an unofficial fourth level as well, used when any 4 characters are
    -720     * appended to an adjective (as in "darkmost"); it has four times the effect of the original adjective. If a color
    -721     * name or adjective is invalid, it is considered the same as adding the color {@link #TRANSPARENT}.
    -722     * <br>
    -723     * Examples of valid descriptions include "blue", "dark green", "duller red", "peach pink", "indigo purple mauve",
    -724     * and "lightest richer apricot-olive".
    -725     * @param description a color description, as a lower-case String matching the above format
    -726     * @return a packed float color as described
    -727     */
    -728    public static float parseDescription(final String description) {
    -729        float intensity = 0f, saturation = 0f;
    -730        final String[] terms = description.split("[^a-zA-Z]+");
    -731        mixing.clear();
    -732        for(String term : terms) {
    -733            if (term == null || term.isEmpty()) continue;
    -734            final int len = term.length();
    -735            switch (term.charAt(0)) {
    -736                case 'l':
    -737                    if (len > 2 && term.charAt(2) == 'g') {
    -738                        switch (len) {
    -739                            case 9:
    -740                                intensity += 0.125f;
    -741                            case 8:
    -742                                intensity += 0.125f;
    -743                            case 7:
    -744                                intensity += 0.125f;
    -745                            case 5:
    -746                                intensity += 0.125f;
    -747                                break;
    -748                            default:
    -749                                mixing.add(TRANSPARENT);
    -750                                break;
    -751                        }
    -752                    } else {
    -753                        mixing.add(NAMED.get(term));
    -754                    }
    -755                    break;
    -756                case 'r':
    -757                    if (len > 1 && term.charAt(1) == 'i') {
    -758                        switch (len) {
    -759                            case 8:
    -760                                saturation += 0.2f;
    -761                            case 7:
    -762                                saturation += 0.2f;
    -763                            case 6:
    -764                                saturation += 0.2f;
    -765                            case 4:
    -766                                saturation += 0.2f;
    -767                                break;
    -768                            default:
    -769                                mixing.add(TRANSPARENT);
    -770                                break;
    -771                        }
    -772                    } else {
    -773                        mixing.add(NAMED.get(term));
    -774                    }
    -775                    break;
    -776                case 'd':
    -777                    if (len > 1 && term.charAt(1) == 'a') {
    -778                        switch (len) {
    -779                            case 8:
    -780                                intensity -= 0.15f;
    -781                            case 7:
    -782                                intensity -= 0.15f;
    -783                            case 6:
    -784                                intensity -= 0.15f;
    -785                            case 4:
    -786                                intensity -= 0.15f;
    -787                                break;
    -788                            default:
    -789                                mixing.add(TRANSPARENT);
    -790                                break;
    -791                        }
    -792                    } else if (len > 1 && term.charAt(1) == 'u') {
    -793                        switch (len) {
    -794                            case 8:
    -795                                saturation -= 0.2f;
    -796                            case 7:
    -797                                saturation -= 0.2f;
    -798                            case 6:
    -799                                saturation -= 0.2f;
    -800                            case 4:
    -801                                saturation -= 0.2f;
    -802                                break;
    -803                            default:
    -804                                mixing.add(TRANSPARENT);
    -805                                break;
    -806                        }
    -807                    } else {
    -808                        mixing.add(NAMED.get(term));
    -809                    }
    -810                    break;
    -811                default:
    -812                    mixing.add(NAMED.get(term));
    -813                    break;
    -814            }
    -815        }
    -816        float result = mix(mixing.items, 0, mixing.size());
    -817
    -818        if(intensity > 0) result = lighten(result, intensity);
    -819        else if(intensity < 0) result = darken(result, -intensity);
    -820
    -821        if(saturation > 0) result = enrich(result, saturation);
    -822        else if(saturation < 0) result = limitToGamut(dullen(result, -saturation));
    -823        else result = limitToGamut(result);
    -824
    -825        return result;
    -826    }
    -827
    -828    private static final ObjectList<String> namesByHue = new ObjectList<>(NAMES_BY_HUE);
    -829    private static final FloatList colorsByHue = new FloatList(COLORS_BY_HUE);
    -830    static {
    -831        int trn = namesByHue.indexOf("transparent");
    -832        namesByHue.removeAt(trn);
    -833        colorsByHue.removeAt(trn);
    -834        ALIASES.put("grey", GRAY);
    -835        ALIASES.put("gold", SAFFRON);
    -836        ALIASES.put("puce", MAUVE);
    -837        ALIASES.put("sand", TAN);
    -838        ALIASES.put("skin", PEACH); // Yes, I am aware that there is more than one skin color, but this can only map to one.
    -839        ALIASES.put("coral", SALMON);
    -840        ALIASES.put("azure", SKY);
    -841        ALIASES.put("ocean", TEAL);
    -842        ALIASES.put("sapphire", COBALT);
    -843        NAMED.putAll(ALIASES);
    -844    }
    -845    /**
    -846     * Given a color as a packed Oklab float, this finds the closest description it can to match the given color while
    -847     * using at most {@code mixCount} colors to mix in. You should only use small numbers for mixCount, like 1 to 3;
    -848     * this can take quite a while to run otherwise. This returns a String description that can be passed to
    -849     * {@link #parseDescription(String)}. It is likely that this will use very contrasting colors if mixCount is 2 or
    -850     * greater and the color to match is desaturated or brownish.
    -851     * @param oklab a packed Oklab float color to attempt to match
    -852     * @param mixCount how many color names this will use in the returned description
    -853     * @return a description that can be fed to {@link #parseDescription(String)} to get a similar color
    -854     */
    -855    public static String bestMatch(final float oklab, int mixCount) {
    -856        mixCount = Math.max(1, mixCount);
    -857        float bestDistance = Float.POSITIVE_INFINITY;
    -858        final int paletteSize = namesByHue.size(), colorTries = (int)Math.pow(paletteSize, mixCount), totalTries = colorTries * 81;
    -859        final float targetL = ColorTools.channelL(oklab), targetA = ColorTools.channelA(oklab), targetB = ColorTools.channelB(oklab);
    -860        final String[] lightAdjectives = {"darkmost ", "darkest ", "darker ", "dark ", "", "light ", "lighter ", "lightest ", "lightmost "};
    -861        final String[] satAdjectives = {"dullmost ", "dullest ", "duller ", "dull ", "", "rich ", "richer ", "richest ", "richmost "};
    -862        mixing.clear();
    -863        for (int i = 0; i < mixCount; i++) {
    -864            mixing.add(colorsByHue.get(0));
    -865        }
    -866        int bestCode = 0;
    -867        for (int c = 0; c < totalTries; c++) {
    -868            for (int i = 0, e = 1; i < mixCount; i++, e *= paletteSize) {
    -869                mixing.set(i, colorsByHue.get((c / e) % paletteSize));
    -870            }
    -871            int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4);
    -872
    -873            float result = FloatColors.mix(mixing.items, 0, mixCount);
    -874            if(idxI > 0) result = ColorTools.lighten(result, 0.125f * idxI);
    -875            else if(idxI < 0) result = ColorTools.darken(result, -0.15f * idxI);
    -876
    -877            if(idxS > 0) result = ColorTools.limitToGamut(ColorTools.enrich(result, 0.2f * idxS));
    -878            else if(idxS < 0) result = ColorTools.dullen(result, -0.2f * idxS);
    -879            else result = ColorTools.limitToGamut(result);
    -880
    -881            float dL = ColorTools.channelL(result) - targetL, dA = ColorTools.channelA(result) - targetA, dB = ColorTools.channelB(result) - targetB;
    -882            if(bestDistance > (bestDistance = Math.min(dL * dL + dA * dA + dB * dB, bestDistance)))
    -883                bestCode = c;
    -884        }
    -885
    -886        StringBuilder description = new StringBuilder(lightAdjectives[(bestCode / colorTries) % 9] + satAdjectives[bestCode / (colorTries * 9)]);
    -887        for (int i = 0, e = 1; i < mixCount; e *= paletteSize) {
    -888            description.append(namesByHue.get((bestCode / e) % paletteSize));
    -889            if(++i < mixCount)
    -890                description.append(' ');
    -891        }
    -892        return description.toString();
    -893    }
    -894}
    +061
    +062    /**
    +063     * This color constant "transparent" has RGBA8888 code {@code 00000000}, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +064     * It can be represented as a packed float with the constant {@code 0x0.fefep-126F}.
    +065     * <pre>
    +066     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font>
    +067     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font>
    +068     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font>
    +069     * </pre>
    +070     */
    +071    public static final float TRANSPARENT = 0x0.fefep-126F;
    +072    static { NAMED.put("transparent", 0x0.fefep-126F); LIST.add(0x0.fefep-126F); }
    +073
    +074    /**
    +075     * This color constant "black" has RGBA8888 code {@code 000000FF}, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +076     * It can be represented as a packed float with the constant {@code -0x1.fefep125F}.
    +077     * <pre>
    +078     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font>
    +079     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;@&nbsp;</font><font style='background-color: #000000; color: #888888'>&nbsp;@&nbsp;</font>
    +080     * <font style='background-color: #000000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ffffff'>&nbsp;@&nbsp;</font>
    +081     * </pre>
    +082     */
    +083    public static final float BLACK = -0x1.fefep125F;
    +084    static { NAMED.put("black", -0x1.fefep125F); LIST.add(-0x1.fefep125F); }
    +085
    +086    /**
    +087     * This color constant "gray" has RGBA8888 code {@code 808080FF}, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +088     * It can be represented as a packed float with the constant {@code -0x1.feff06p125F}.
    +089     * <pre>
    +090     * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #000000'>&nbsp;@&nbsp;</font>
    +091     * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #808080'>&nbsp;@&nbsp;</font><font style='background-color: #808080; color: #888888'>&nbsp;@&nbsp;</font>
    +092     * <font style='background-color: #808080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #808080; color: #ffffff'>&nbsp;@&nbsp;</font>
    +093     * </pre>
    +094     */
    +095    public static final float GRAY = -0x1.feff06p125F;
    +096    static { NAMED.put("gray", -0x1.feff06p125F); LIST.add(-0x1.feff06p125F); }
    +097
    +098    /**
    +099     * This color constant "silver" has RGBA8888 code {@code B6B6B6FF}, L 0.72156864, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +100     * It can be represented as a packed float with the constant {@code -0x1.feff7p125F}.
    +101     * <pre>
    +102     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #000000'>&nbsp;@&nbsp;</font>
    +103     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B6B6B6'>&nbsp;@&nbsp;</font><font style='background-color: #B6B6B6; color: #888888'>&nbsp;@&nbsp;</font>
    +104     * <font style='background-color: #B6B6B6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B6B6B6; color: #ffffff'>&nbsp;@&nbsp;</font>
    +105     * </pre>
    +106     */
    +107    public static final float SILVER = -0x1.feff7p125F;
    +108    static { NAMED.put("silver", -0x1.feff7p125F); LIST.add(-0x1.feff7p125F); }
    +109
    +110    /**
    +111     * This color constant "white" has RGBA8888 code {@code FFFFFFFF}, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    +112     * It can be represented as a packed float with the constant {@code -0x1.fefffep125F}.
    +113     * <pre>
    +114     * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #000000'>&nbsp;@&nbsp;</font>
    +115     * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFFFF'>&nbsp;@&nbsp;</font><font style='background-color: #FFFFFF; color: #888888'>&nbsp;@&nbsp;</font>
    +116     * <font style='background-color: #FFFFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFFFF; color: #ffffff'>&nbsp;@&nbsp;</font>
    +117     * </pre>
    +118     */
    +119    public static final float WHITE = -0x1.fefffep125F;
    +120    static { NAMED.put("white", -0x1.fefffep125F); LIST.add(-0x1.fefffep125F); }
    +121
    +122    /**
    +123     * This color constant "red" has RGBA8888 code {@code FF0000FF}, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.08024464, saturation 0.98868626, and chroma 0.25345513.
    +124     * It can be represented as a packed float with the constant {@code -0x1.1f3904p126F}.
    +125     * <pre>
    +126     * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #000000'>&nbsp;@&nbsp;</font>
    +127     * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF0000'>&nbsp;@&nbsp;</font><font style='background-color: #FF0000; color: #888888'>&nbsp;@&nbsp;</font>
    +128     * <font style='background-color: #FF0000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF0000; color: #ffffff'>&nbsp;@&nbsp;</font>
    +129     * </pre>
    +130     */
    +131    public static final float RED = -0x1.1f3904p126F;
    +132    static { NAMED.put("red", -0x1.1f3904p126F); LIST.add(-0x1.1f3904p126F); }
    +133
    +134    /**
    +135     * This color constant "orange" has RGBA8888 code {@code FF7F00FF}, L 0.654902, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.1544865, saturation 0.979648, and chroma 0.17443058.
    +136     * It can be represented as a packed float with the constant {@code -0x1.25194ep126F}.
    +137     * <pre>
    +138     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #000000'>&nbsp;@&nbsp;</font>
    +139     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF7F00'>&nbsp;@&nbsp;</font><font style='background-color: #FF7F00; color: #888888'>&nbsp;@&nbsp;</font>
    +140     * <font style='background-color: #FF7F00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF7F00; color: #ffffff'>&nbsp;@&nbsp;</font>
    +141     * </pre>
    +142     */
    +143    public static final float ORANGE = -0x1.25194ep126F;
    +144    static { NAMED.put("orange", -0x1.25194ep126F); LIST.add(-0x1.25194ep126F); }
    +145
    +146    /**
    +147     * This color constant "yellow" has RGBA8888 code {@code FFFF00FF}, L 0.9411765, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.3049839, saturation 1.3285329, and chroma 0.20529193.
    +148     * It can be represented as a packed float with the constant {@code -0x1.30edep126F}.
    +149     * <pre>
    +150     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #000000'>&nbsp;@&nbsp;</font>
    +151     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFFF00'>&nbsp;@&nbsp;</font><font style='background-color: #FFFF00; color: #888888'>&nbsp;@&nbsp;</font>
    +152     * <font style='background-color: #FFFF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFFF00; color: #ffffff'>&nbsp;@&nbsp;</font>
    +153     * </pre>
    +154     */
    +155    public static final float YELLOW = -0x1.30edep126F;
    +156    static { NAMED.put("yellow", -0x1.30edep126F); LIST.add(-0x1.30edep126F); }
    +157
    +158    /**
    +159     * This color constant "green" has RGBA8888 code {@code 00FF00FF}, L 0.80784315, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39588714, saturation 1.0080564, and chroma 0.29610303.
    +160     * It can be represented as a packed float with the constant {@code -0x1.2cc39cp126F}.
    +161     * <pre>
    +162     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #000000'>&nbsp;@&nbsp;</font>
    +163     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FF00'>&nbsp;@&nbsp;</font><font style='background-color: #00FF00; color: #888888'>&nbsp;@&nbsp;</font>
    +164     * <font style='background-color: #00FF00;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FF00; color: #ffffff'>&nbsp;@&nbsp;</font>
    +165     * </pre>
    +166     */
    +167    public static final float GREEN = -0x1.2cc39cp126F;
    +168    static { NAMED.put("green", -0x1.2cc39cp126F); LIST.add(-0x1.2cc39cp126F); }
    +169
    +170    /**
    +171     * This color constant "blue" has RGBA8888 code {@code 0000FFFF}, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.73413044, saturation 0.9925803, and chroma 0.31835338.
    +172     * It can be represented as a packed float with the constant {@code -0x1.aef69cp125F}.
    +173     * <pre>
    +174     * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #000000'>&nbsp;@&nbsp;</font>
    +175     * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0000FF'>&nbsp;@&nbsp;</font><font style='background-color: #0000FF; color: #888888'>&nbsp;@&nbsp;</font>
    +176     * <font style='background-color: #0000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0000FF; color: #ffffff'>&nbsp;@&nbsp;</font>
    +177     * </pre>
    +178     */
    +179    public static final float BLUE = -0x1.aef69cp125F;
    +180    static { NAMED.put("blue", -0x1.aef69cp125F); LIST.add(-0x1.aef69cp125F); }
    +181
    +182    /**
    +183     * This color constant "indigo" has RGBA8888 code {@code 520FE0FF}, L 0.32156864, A 0.53333336, B 0.36862746, alpha 1.0, hue 0.79236877, saturation 0.95014614, and chroma 0.27001202.
    +184     * It can be represented as a packed float with the constant {@code -0x1.bd10a4p125F}.
    +185     * <pre>
    +186     * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #000000'>&nbsp;@&nbsp;</font>
    +187     * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #520FE0'>&nbsp;@&nbsp;</font><font style='background-color: #520FE0; color: #888888'>&nbsp;@&nbsp;</font>
    +188     * <font style='background-color: #520FE0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #520FE0; color: #ffffff'>&nbsp;@&nbsp;</font>
    +189     * </pre>
    +190     */
    +191    public static final float INDIGO = -0x1.bd10a4p125F;
    +192    static { NAMED.put("indigo", -0x1.bd10a4p125F); LIST.add(-0x1.bd10a4p125F); }
    +193
    +194    /**
    +195     * This color constant "violet" has RGBA8888 code {@code 9040EFFF}, L 0.4627451, A 0.56078434, B 0.39607844, alpha 1.0, hue 0.83780813, saturation 0.84801877, and chroma 0.23984502.
    +196     * It can be represented as a packed float with the constant {@code -0x1.cb1eecp125F}.
    +197     * <pre>
    +198     * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #000000'>&nbsp;@&nbsp;</font>
    +199     * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #9040EF'>&nbsp;@&nbsp;</font><font style='background-color: #9040EF; color: #888888'>&nbsp;@&nbsp;</font>
    +200     * <font style='background-color: #9040EF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #9040EF; color: #ffffff'>&nbsp;@&nbsp;</font>
    +201     * </pre>
    +202     */
    +203    public static final float VIOLET = -0x1.cb1eecp125F;
    +204    static { NAMED.put("violet", -0x1.cb1eecp125F); LIST.add(-0x1.cb1eecp125F); }
    +205
    +206    /**
    +207     * This color constant "purple" has RGBA8888 code {@code C000FFFF}, L 0.49803922, A 0.6039216, B 0.3882353, alpha 1.0, hue 0.8721089, saturation 0.9847418, and chroma 0.30403575.
    +208     * It can be represented as a packed float with the constant {@code -0x1.c734fep125F}.
    +209     * <pre>
    +210     * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #000000'>&nbsp;@&nbsp;</font>
    +211     * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C000FF'>&nbsp;@&nbsp;</font><font style='background-color: #C000FF; color: #888888'>&nbsp;@&nbsp;</font>
    +212     * <font style='background-color: #C000FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C000FF; color: #ffffff'>&nbsp;@&nbsp;</font>
    +213     * </pre>
    +214     */
    +215    public static final float PURPLE = -0x1.c734fep125F;
    +216    static { NAMED.put("purple", -0x1.c734fep125F); LIST.add(-0x1.c734fep125F); }
    +217
    +218    /**
    +219     * This color constant "brown" has RGBA8888 code {@code 8F573BFF}, L 0.40784314, A 0.5254902, B 0.5294118, alpha 1.0, hue 0.13558689, saturation 0.5315073, and chroma 0.07753685.
    +220     * It can be represented as a packed float with the constant {@code -0x1.0f0cdp126F}.
    +221     * <pre>
    +222     * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #000000'>&nbsp;@&nbsp;</font>
    +223     * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #8F573B'>&nbsp;@&nbsp;</font><font style='background-color: #8F573B; color: #888888'>&nbsp;@&nbsp;</font>
    +224     * <font style='background-color: #8F573B;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #8F573B; color: #ffffff'>&nbsp;@&nbsp;</font>
    +225     * </pre>
    +226     */
    +227    public static final float BROWN = -0x1.0f0cdp126F;
    +228    static { NAMED.put("brown", -0x1.0f0cdp126F); LIST.add(-0x1.0f0cdp126F); }
    +229
    +230    /**
    +231     * This color constant "pink" has RGBA8888 code {@code FFA0E0FF}, L 0.76862746, A 0.5568628, B 0.4745098, alpha 1.0, hue 0.939452, saturation 0.9503232, and chroma 0.124142565.
    +232     * It can be represented as a packed float with the constant {@code -0x1.f31d88p125F}.
    +233     * <pre>
    +234     * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #000000'>&nbsp;@&nbsp;</font>
    +235     * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA0E0'>&nbsp;@&nbsp;</font><font style='background-color: #FFA0E0; color: #888888'>&nbsp;@&nbsp;</font>
    +236     * <font style='background-color: #FFA0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA0E0; color: #ffffff'>&nbsp;@&nbsp;</font>
    +237     * </pre>
    +238     */
    +239    public static final float PINK = -0x1.f31d88p125F;
    +240    static { NAMED.put("pink", -0x1.f31d88p125F); LIST.add(-0x1.f31d88p125F); }
    +241
    +242    /**
    +243     * This color constant "magenta" has RGBA8888 code {@code F500F5FF}, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9119308, saturation 0.96295136, and chroma 0.31098264.
    +244     * It can be represented as a packed float with the constant {@code -0x1.d54326p125F}.
    +245     * <pre>
    +246     * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #000000'>&nbsp;@&nbsp;</font>
    +247     * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F500F5'>&nbsp;@&nbsp;</font><font style='background-color: #F500F5; color: #888888'>&nbsp;@&nbsp;</font>
    +248     * <font style='background-color: #F500F5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F500F5; color: #ffffff'>&nbsp;@&nbsp;</font>
    +249     * </pre>
    +250     */
    +251    public static final float MAGENTA = -0x1.d54326p125F;
    +252    static { NAMED.put("magenta", -0x1.d54326p125F); LIST.add(-0x1.d54326p125F); }
    +253
    +254    /**
    +255     * This color constant "brick" has RGBA8888 code {@code D5524AFF}, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.073790275, saturation 0.60073465, and chroma 0.15199278.
    +256     * It can be represented as a packed float with the constant {@code -0x1.112306p126F}.
    +257     * <pre>
    +258     * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #000000'>&nbsp;@&nbsp;</font>
    +259     * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D5524A'>&nbsp;@&nbsp;</font><font style='background-color: #D5524A; color: #888888'>&nbsp;@&nbsp;</font>
    +260     * <font style='background-color: #D5524A;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D5524A; color: #ffffff'>&nbsp;@&nbsp;</font>
    +261     * </pre>
    +262     */
    +263    public static final float BRICK = -0x1.112306p126F;
    +264    static { NAMED.put("brick", -0x1.112306p126F); LIST.add(-0x1.112306p126F); }
    +265
    +266    /**
    +267     * This color constant "ember" has RGBA8888 code {@code F55A32FF}, L 0.5764706, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10637331, saturation 0.86455137, and chroma 0.1836353.
    +268     * It can be represented as a packed float with the constant {@code -0x1.1d2526p126F}.
    +269     * <pre>
    +270     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #000000'>&nbsp;@&nbsp;</font>
    +271     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #F55A32'>&nbsp;@&nbsp;</font><font style='background-color: #F55A32; color: #888888'>&nbsp;@&nbsp;</font>
    +272     * <font style='background-color: #F55A32;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #F55A32; color: #ffffff'>&nbsp;@&nbsp;</font>
    +273     * </pre>
    +274     */
    +275    public static final float EMBER = -0x1.1d2526p126F;
    +276    static { NAMED.put("ember", -0x1.1d2526p126F); LIST.add(-0x1.1d2526p126F); }
    +277
    +278    /**
    +279     * This color constant "salmon" has RGBA8888 code {@code FF6262FF}, L 0.6156863, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06443131, saturation 0.9722263, and chroma 0.17337766.
    +280     * It can be represented as a packed float with the constant {@code -0x1.11293ap126F}.
    +281     * <pre>
    +282     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #000000'>&nbsp;@&nbsp;</font>
    +283     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FF6262'>&nbsp;@&nbsp;</font><font style='background-color: #FF6262; color: #888888'>&nbsp;@&nbsp;</font>
    +284     * <font style='background-color: #FF6262;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FF6262; color: #ffffff'>&nbsp;@&nbsp;</font>
    +285     * </pre>
    +286     */
    +287    public static final float SALMON = -0x1.11293ap126F;
    +288    static { NAMED.put("salmon", -0x1.11293ap126F); LIST.add(-0x1.11293ap126F); }
    +289
    +290    /**
    +291     * This color constant "chocolate" has RGBA8888 code {@code 683818FF}, L 0.27058825, A 0.5254902, B 0.53333336, alpha 1.0, hue 0.14477962, saturation 0.7863279, and chroma 0.0835974.
    +292     * It can be represented as a packed float with the constant {@code -0x1.110c8ap126F}.
    +293     * <pre>
    +294     * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #000000'>&nbsp;@&nbsp;</font>
    +295     * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #683818'>&nbsp;@&nbsp;</font><font style='background-color: #683818; color: #888888'>&nbsp;@&nbsp;</font>
    +296     * <font style='background-color: #683818;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #683818; color: #ffffff'>&nbsp;@&nbsp;</font>
    +297     * </pre>
    +298     */
    +299    public static final float CHOCOLATE = -0x1.110c8ap126F;
    +300    static { NAMED.put("chocolate", -0x1.110c8ap126F); LIST.add(-0x1.110c8ap126F); }
    +301
    +302    /**
    +303     * This color constant "tan" has RGBA8888 code {@code D2B48CFF}, L 0.73333335, A 0.5058824, B 0.5254902, alpha 1.0, hue 0.20571564, saturation 0.33091408, and chroma 0.052115876.
    +304     * It can be represented as a packed float with the constant {@code -0x1.0d0376p126F}.
    +305     * <pre>
    +306     * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #000000'>&nbsp;@&nbsp;</font>
    +307     * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2B48C'>&nbsp;@&nbsp;</font><font style='background-color: #D2B48C; color: #888888'>&nbsp;@&nbsp;</font>
    +308     * <font style='background-color: #D2B48C;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2B48C; color: #ffffff'>&nbsp;@&nbsp;</font>
    +309     * </pre>
    +310     */
    +311    public static final float TAN = -0x1.0d0376p126F;
    +312    static { NAMED.put("tan", -0x1.0d0376p126F); LIST.add(-0x1.0d0376p126F); }
    +313
    +314    /**
    +315     * This color constant "bronze" has RGBA8888 code {@code CE8E31FF}, L 0.62352943, A 0.5137255, B 0.56078434, alpha 1.0, hue 0.21101315, saturation 0.8246211, and chroma 0.124142565.
    +316     * It can be represented as a packed float with the constant {@code -0x1.1f073ep126F}.
    +317     * <pre>
    +318     * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #000000'>&nbsp;@&nbsp;</font>
    +319     * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #CE8E31'>&nbsp;@&nbsp;</font><font style='background-color: #CE8E31; color: #888888'>&nbsp;@&nbsp;</font>
    +320     * <font style='background-color: #CE8E31;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #CE8E31; color: #ffffff'>&nbsp;@&nbsp;</font>
    +321     * </pre>
    +322     */
    +323    public static final float BRONZE = -0x1.1f073ep126F;
    +324    static { NAMED.put("bronze", -0x1.1f073ep126F); LIST.add(-0x1.1f073ep126F); }
    +325
    +326    /**
    +327     * This color constant "cinnamon" has RGBA8888 code {@code D2691DFF}, L 0.54509807, A 0.5411765, B 0.56078434, alpha 1.0, hue 0.15413038, saturation 0.88256764, and chroma 0.14626285.
    +328     * It can be represented as a packed float with the constant {@code -0x1.1f1516p126F}.
    +329     * <pre>
    +330     * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #000000'>&nbsp;@&nbsp;</font>
    +331     * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D2691D'>&nbsp;@&nbsp;</font><font style='background-color: #D2691D; color: #888888'>&nbsp;@&nbsp;</font>
    +332     * <font style='background-color: #D2691D;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D2691D; color: #ffffff'>&nbsp;@&nbsp;</font>
    +333     * </pre>
    +334     */
    +335    public static final float CINNAMON = -0x1.1f1516p126F;
    +336    static { NAMED.put("cinnamon", -0x1.1f1516p126F); LIST.add(-0x1.1f1516p126F); }
    +337
    +338    /**
    +339     * This color constant "apricot" has RGBA8888 code {@code FFA828FF}, L 0.7411765, A 0.52156866, B 0.5764706, alpha 1.0, hue 0.20362332, saturation 0.9943149, and chroma 0.1582875.
    +340     * It can be represented as a packed float with the constant {@code -0x1.270b7ap126F}.
    +341     * <pre>
    +342     * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #000000'>&nbsp;@&nbsp;</font>
    +343     * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFA828'>&nbsp;@&nbsp;</font><font style='background-color: #FFA828; color: #888888'>&nbsp;@&nbsp;</font>
    +344     * <font style='background-color: #FFA828;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFA828; color: #ffffff'>&nbsp;@&nbsp;</font>
    +345     * </pre>
    +346     */
    +347    public static final float APRICOT = -0x1.270b7ap126F;
    +348    static { NAMED.put("apricot", -0x1.270b7ap126F); LIST.add(-0x1.270b7ap126F); }
    +349
    +350    /**
    +351     * This color constant "peach" has RGBA8888 code {@code FFBF81FF}, L 0.8039216, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.1871773, saturation 0.962963, and chroma 0.096477255.
    +352     * It can be represented as a packed float with the constant {@code -0x1.17099ap126F}.
    +353     * <pre>
    +354     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #000000'>&nbsp;@&nbsp;</font>
    +355     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFBF81'>&nbsp;@&nbsp;</font><font style='background-color: #FFBF81; color: #888888'>&nbsp;@&nbsp;</font>
    +356     * <font style='background-color: #FFBF81;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFBF81; color: #ffffff'>&nbsp;@&nbsp;</font>
    +357     * </pre>
    +358     */
    +359    public static final float PEACH = -0x1.17099ap126F;
    +360    static { NAMED.put("peach", -0x1.17099ap126F); LIST.add(-0x1.17099ap126F); }
    +361
    +362    /**
    +363     * This color constant "pear" has RGBA8888 code {@code D3E330FF}, L 0.8352941, A 0.45882353, B 0.58431375, alpha 1.0, hue 0.31789324, saturation 0.911928, and chroma 0.18692946.
    +364     * It can be represented as a packed float with the constant {@code -0x1.2aebaap126F}.
    +365     * <pre>
    +366     * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #000000'>&nbsp;@&nbsp;</font>
    +367     * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #D3E330'>&nbsp;@&nbsp;</font><font style='background-color: #D3E330; color: #888888'>&nbsp;@&nbsp;</font>
    +368     * <font style='background-color: #D3E330;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #D3E330; color: #ffffff'>&nbsp;@&nbsp;</font>
    +369     * </pre>
    +370     */
    +371    public static final float PEAR = -0x1.2aebaap126F;
    +372    static { NAMED.put("pear", -0x1.2aebaap126F); LIST.add(-0x1.2aebaap126F); }
    +373
    +374    /**
    +375     * This color constant "saffron" has RGBA8888 code {@code FFD510FF}, L 0.84313726, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27065513, saturation 0.9467276, and chroma 0.17789528.
    +376     * It can be represented as a packed float with the constant {@code -0x1.2cf9aep126F}.
    +377     * <pre>
    +378     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #000000'>&nbsp;@&nbsp;</font>
    +379     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFD510'>&nbsp;@&nbsp;</font><font style='background-color: #FFD510; color: #888888'>&nbsp;@&nbsp;</font>
    +380     * <font style='background-color: #FFD510;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFD510; color: #ffffff'>&nbsp;@&nbsp;</font>
    +381     * </pre>
    +382     */
    +383    public static final float SAFFRON = -0x1.2cf9aep126F;
    +384    static { NAMED.put("saffron", -0x1.2cf9aep126F); LIST.add(-0x1.2cf9aep126F); }
    +385
    +386    /**
    +387     * This color constant "butter" has RGBA8888 code {@code FFF288FF}, L 0.92156863, A 0.4862745, B 0.5568628, alpha 1.0, hue 0.28142345, saturation 1.092647, and chroma 0.11653464.
    +388     * It can be represented as a packed float with the constant {@code -0x1.1cf9d6p126F}.
    +389     * <pre>
    +390     * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #000000'>&nbsp;@&nbsp;</font>
    +391     * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #FFF288'>&nbsp;@&nbsp;</font><font style='background-color: #FFF288; color: #888888'>&nbsp;@&nbsp;</font>
    +392     * <font style='background-color: #FFF288;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #FFF288; color: #ffffff'>&nbsp;@&nbsp;</font>
    +393     * </pre>
    +394     */
    +395    public static final float BUTTER = -0x1.1cf9d6p126F;
    +396    static { NAMED.put("butter", -0x1.1cf9d6p126F); LIST.add(-0x1.1cf9d6p126F); }
    +397
    +398    /**
    +399     * This color constant "chartreuse" has RGBA8888 code {@code C8FF41FF}, L 0.89411765, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34525383, saturation 1.0441982, and chroma 0.2070681.
    +400     * It can be represented as a packed float with the constant {@code -0x1.2ae1c8p126F}.
    +401     * <pre>
    +402     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #000000'>&nbsp;@&nbsp;</font>
    +403     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #C8FF41'>&nbsp;@&nbsp;</font><font style='background-color: #C8FF41; color: #888888'>&nbsp;@&nbsp;</font>
    +404     * <font style='background-color: #C8FF41;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #C8FF41; color: #ffffff'>&nbsp;@&nbsp;</font>
    +405     * </pre>
    +406     */
    +407    public static final float CHARTREUSE = -0x1.2ae1c8p126F;
    +408    static { NAMED.put("chartreuse", -0x1.2ae1c8p126F); LIST.add(-0x1.2ae1c8p126F); }
    +409
    +410    /**
    +411     * This color constant "cactus" has RGBA8888 code {@code 30A000FF}, L 0.5294118, A 0.41960785, B 0.5647059, alpha 1.0, hue 0.38786715, saturation 0.95450217, and chroma 0.20558903.
    +412     * It can be represented as a packed float with the constant {@code -0x1.20d70ep126F}.
    +413     * <pre>
    +414     * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #000000'>&nbsp;@&nbsp;</font>
    +415     * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #30A000'>&nbsp;@&nbsp;</font><font style='background-color: #30A000; color: #888888'>&nbsp;@&nbsp;</font>
    +416     * <font style='background-color: #30A000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #30A000; color: #ffffff'>&nbsp;@&nbsp;</font>
    +417     * </pre>
    +418     */
    +419    public static final float CACTUS = -0x1.20d70ep126F;
    +420    static { NAMED.put("cactus", -0x1.20d70ep126F); LIST.add(-0x1.20d70ep126F); }
    +421
    +422    /**
    +423     * This color constant "lime" has RGBA8888 code {@code 93D300FF}, L 0.7372549, A 0.43529412, B 0.5803922, alpha 1.0, hue 0.35363457, saturation 0.94288415, and chroma 0.20558903.
    +424     * It can be represented as a packed float with the constant {@code -0x1.28df78p126F}.
    +425     * <pre>
    +426     * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #000000'>&nbsp;@&nbsp;</font>
    +427     * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #93D300'>&nbsp;@&nbsp;</font><font style='background-color: #93D300; color: #888888'>&nbsp;@&nbsp;</font>
    +428     * <font style='background-color: #93D300;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #93D300; color: #ffffff'>&nbsp;@&nbsp;</font>
    +429     * </pre>
    +430     */
    +431    public static final float LIME = -0x1.28df78p126F;
    +432    static { NAMED.put("lime", -0x1.28df78p126F); LIST.add(-0x1.28df78p126F); }
    +433
    +434    /**
    +435     * This color constant "olive" has RGBA8888 code {@code 818000FF}, L 0.49019608, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.30708748, saturation 0.9493337, and chroma 0.13131043.
    +436     * It can be represented as a packed float with the constant {@code -0x1.1ef2fap126F}.
    +437     * <pre>
    +438     * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #000000'>&nbsp;@&nbsp;</font>
    +439     * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #818000'>&nbsp;@&nbsp;</font><font style='background-color: #818000; color: #888888'>&nbsp;@&nbsp;</font>
    +440     * <font style='background-color: #818000;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #818000; color: #ffffff'>&nbsp;@&nbsp;</font>
    +441     * </pre>
    +442     */
    +443    public static final float OLIVE = -0x1.1ef2fap126F;
    +444    static { NAMED.put("olive", -0x1.1ef2fap126F); LIST.add(-0x1.1ef2fap126F); }
    +445
    +446    /**
    +447     * This color constant "fern" has RGBA8888 code {@code 4E7942FF}, L 0.43137255, A 0.4627451, B 0.5294118, alpha 1.0, hue 0.3843443, saturation 0.51240826, and chroma 0.0945603.
    +448     * It can be represented as a packed float with the constant {@code -0x1.0eecdcp126F}.
    +449     * <pre>
    +450     * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #000000'>&nbsp;@&nbsp;</font>
    +451     * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #4E7942'>&nbsp;@&nbsp;</font><font style='background-color: #4E7942; color: #888888'>&nbsp;@&nbsp;</font>
    +452     * <font style='background-color: #4E7942;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #4E7942; color: #ffffff'>&nbsp;@&nbsp;</font>
    +453     * </pre>
    +454     */
    +455    public static final float FERN = -0x1.0eecdcp126F;
    +456    static { NAMED.put("fern", -0x1.0eecdcp126F); LIST.add(-0x1.0eecdcp126F); }
    +457
    +458    /**
    +459     * This color constant "moss" has RGBA8888 code {@code 204608FF}, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.94280905, and chroma 0.11062346.
    +460     * It can be represented as a packed float with the constant {@code -0x1.12ea74p126F}.
    +461     * <pre>
    +462     * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #000000'>&nbsp;@&nbsp;</font>
    +463     * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #204608'>&nbsp;@&nbsp;</font><font style='background-color: #204608; color: #888888'>&nbsp;@&nbsp;</font>
    +464     * <font style='background-color: #204608;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #204608; color: #ffffff'>&nbsp;@&nbsp;</font>
    +465     * </pre>
    +466     */
    +467    public static final float MOSS = -0x1.12ea74p126F;
    +468    static { NAMED.put("moss", -0x1.12ea74p126F); LIST.add(-0x1.12ea74p126F); }
    +469
    +470    /**
    +471     * This color constant "celery" has RGBA8888 code {@code 7DFF73FF}, L 0.85490197, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39260027, saturation 1.0044117, and chroma 0.20078278.
    +472     * It can be represented as a packed float with the constant {@code -0x1.1ed7b4p126F}.
    +473     * <pre>
    +474     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #000000'>&nbsp;@&nbsp;</font>
    +475     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7DFF73'>&nbsp;@&nbsp;</font><font style='background-color: #7DFF73; color: #888888'>&nbsp;@&nbsp;</font>
    +476     * <font style='background-color: #7DFF73;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7DFF73; color: #ffffff'>&nbsp;@&nbsp;</font>
    +477     * </pre>
    +478     */
    +479    public static final float CELERY = -0x1.1ed7b4p126F;
    +480    static { NAMED.put("celery", -0x1.1ed7b4p126F); LIST.add(-0x1.1ed7b4p126F); }
    +481
    +482    /**
    +483     * This color constant "sage" has RGBA8888 code {@code ABE3C5FF}, L 0.83137256, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.34176013, and chroma 0.069218926.
    +484     * It can be represented as a packed float with the constant {@code -0x1.04efa8p126F}.
    +485     * <pre>
    +486     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #000000'>&nbsp;@&nbsp;</font>
    +487     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #ABE3C5'>&nbsp;@&nbsp;</font><font style='background-color: #ABE3C5; color: #888888'>&nbsp;@&nbsp;</font>
    +488     * <font style='background-color: #ABE3C5;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ABE3C5; color: #ffffff'>&nbsp;@&nbsp;</font>
    +489     * </pre>
    +490     */
    +491    public static final float SAGE = -0x1.04efa8p126F;
    +492    static { NAMED.put("sage", -0x1.04efa8p126F); LIST.add(-0x1.04efa8p126F); }
    +493
    +494    /**
    +495     * This color constant "jade" has RGBA8888 code {@code 3FBF3FFF}, L 0.63529414, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4012713, saturation 0.806468, and chroma 0.20259848.
    +496     * It can be represented as a packed float with the constant {@code -0x1.1cd544p126F}.
    +497     * <pre>
    +498     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #000000'>&nbsp;@&nbsp;</font>
    +499     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3FBF3F'>&nbsp;@&nbsp;</font><font style='background-color: #3FBF3F; color: #888888'>&nbsp;@&nbsp;</font>
    +500     * <font style='background-color: #3FBF3F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3FBF3F; color: #ffffff'>&nbsp;@&nbsp;</font>
    +501     * </pre>
    +502     */
    +503    public static final float JADE = -0x1.1cd544p126F;
    +504    static { NAMED.put("jade", -0x1.1cd544p126F); LIST.add(-0x1.1cd544p126F); }
    +505
    +506    /**
    +507     * This color constant "cyan" has RGBA8888 code {@code 00FFFFFF}, L 0.85882354, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.5409493, saturation 1.0340465, and chroma 0.1582875.
    +508     * It can be represented as a packed float with the constant {@code -0x1.f4d9b6p125F}.
    +509     * <pre>
    +510     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #000000'>&nbsp;@&nbsp;</font>
    +511     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #00FFFF'>&nbsp;@&nbsp;</font><font style='background-color: #00FFFF; color: #888888'>&nbsp;@&nbsp;</font>
    +512     * <font style='background-color: #00FFFF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #00FFFF; color: #ffffff'>&nbsp;@&nbsp;</font>
    +513     * </pre>
    +514     */
    +515    public static final float CYAN = -0x1.f4d9b6p125F;
    +516    static { NAMED.put("cyan", -0x1.f4d9b6p125F); LIST.add(-0x1.f4d9b6p125F); }
    +517
    +518    /**
    +519     * This color constant "mint" has RGBA8888 code {@code 7FFFD4FF}, L 0.8784314, A 0.4392157, B 0.50980395, alpha 1.0, hue 0.46857655, saturation 1.0198039, and chroma 0.12265874.
    +520     * It can be represented as a packed float with the constant {@code -0x1.04e1cp126F}.
    +521     * <pre>
    +522     * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #000000'>&nbsp;@&nbsp;</font>
    +523     * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #7FFFD4'>&nbsp;@&nbsp;</font><font style='background-color: #7FFFD4; color: #888888'>&nbsp;@&nbsp;</font>
    +524     * <font style='background-color: #7FFFD4;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #7FFFD4; color: #ffffff'>&nbsp;@&nbsp;</font>
    +525     * </pre>
    +526     */
    +527    public static final float MINT = -0x1.04e1cp126F;
    +528    static { NAMED.put("mint", -0x1.04e1cp126F); LIST.add(-0x1.04e1cp126F); }
    +529
    +530    /**
    +531     * This color constant "teal" has RGBA8888 code {@code 007F7FFF}, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.53898686, saturation 0.95148593, and chroma 0.10141215.
    +532     * It can be represented as a packed float with the constant {@code -0x1.f8e6ep125F}.
    +533     * <pre>
    +534     * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #000000'>&nbsp;@&nbsp;</font>
    +535     * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #007F7F'>&nbsp;@&nbsp;</font><font style='background-color: #007F7F; color: #888888'>&nbsp;@&nbsp;</font>
    +536     * <font style='background-color: #007F7F;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #007F7F; color: #ffffff'>&nbsp;@&nbsp;</font>
    +537     * </pre>
    +538     */
    +539    public static final float TEAL = -0x1.f8e6ep125F;
    +540    static { NAMED.put("teal", -0x1.f8e6ep125F); LIST.add(-0x1.f8e6ep125F); }
    +541
    +542    /**
    +543     * This color constant "turquoise" has RGBA8888 code {@code 2ED6C9FF}, L 0.73333335, A 0.43137255, B 0.49019608, alpha 1.0, hue 0.51864916, saturation 0.9009075, and chroma 0.1381068.
    +544     * It can be represented as a packed float with the constant {@code -0x1.fadd76p125F}.
    +545     * <pre>
    +546     * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #000000'>&nbsp;@&nbsp;</font>
    +547     * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #2ED6C9'>&nbsp;@&nbsp;</font><font style='background-color: #2ED6C9; color: #888888'>&nbsp;@&nbsp;</font>
    +548     * <font style='background-color: #2ED6C9;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #2ED6C9; color: #ffffff'>&nbsp;@&nbsp;</font>
    +549     * </pre>
    +550     */
    +551    public static final float TURQUOISE = -0x1.fadd76p125F;
    +552    static { NAMED.put("turquoise", -0x1.fadd76p125F); LIST.add(-0x1.fadd76p125F); }
    +553
    +554    /**
    +555     * This color constant "sky" has RGBA8888 code {@code 10C0E0FF}, L 0.6745098, A 0.44313726, B 0.4627451, alpha 1.0, hue 0.59094226, saturation 0.9246287, and chroma 0.13542919.
    +556     * It can be represented as a packed float with the constant {@code -0x1.ece358p125F}.
    +557     * <pre>
    +558     * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #000000'>&nbsp;@&nbsp;</font>
    +559     * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #10C0E0'>&nbsp;@&nbsp;</font><font style='background-color: #10C0E0; color: #888888'>&nbsp;@&nbsp;</font>
    +560     * <font style='background-color: #10C0E0;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #10C0E0; color: #ffffff'>&nbsp;@&nbsp;</font>
    +561     * </pre>
    +562     */
    +563    public static final float SKY = -0x1.ece358p125F;
    +564    static { NAMED.put("sky", -0x1.ece358p125F); LIST.add(-0x1.ece358p125F); }
    +565
    +566    /**
    +567     * This color constant "cobalt" has RGBA8888 code {@code 0046ABFF}, L 0.3019608, A 0.48235294, B 0.4117647, alpha 1.0, hue 0.72136545, saturation 0.931695, and chroma 0.1792624.
    +568     * It can be represented as a packed float with the constant {@code -0x1.d2f69ap125F}.
    +569     * <pre>
    +570     * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #000000'>&nbsp;@&nbsp;</font>
    +571     * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #0046AB'>&nbsp;@&nbsp;</font><font style='background-color: #0046AB; color: #888888'>&nbsp;@&nbsp;</font>
    +572     * <font style='background-color: #0046AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #0046AB; color: #ffffff'>&nbsp;@&nbsp;</font>
    +573     * </pre>
    +574     */
    +575    public static final float COBALT = -0x1.d2f69ap125F;
    +576    static { NAMED.put("cobalt", -0x1.d2f69ap125F); LIST.add(-0x1.d2f69ap125F); }
    +577
    +578    /**
    +579     * This color constant "denim" has RGBA8888 code {@code 3088B8FF}, L 0.5058824, A 0.46666667, B 0.45490196, alpha 1.0, hue 0.64991105, saturation 0.7772269, and chroma 0.11172148.
    +580     * It can be represented as a packed float with the constant {@code -0x1.e8ef02p125F}.
    +581     * <pre>
    +582     * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #000000'>&nbsp;@&nbsp;</font>
    +583     * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #3088B8'>&nbsp;@&nbsp;</font><font style='background-color: #3088B8; color: #888888'>&nbsp;@&nbsp;</font>
    +584     * <font style='background-color: #3088B8;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #3088B8; color: #ffffff'>&nbsp;@&nbsp;</font>
    +585     * </pre>
    +586     */
    +587    public static final float DENIM = -0x1.e8ef02p125F;
    +588    static { NAMED.put("denim", -0x1.e8ef02p125F); LIST.add(-0x1.e8ef02p125F); }
    +589
    +590    /**
    +591     * This color constant "navy" has RGBA8888 code {@code 000080FF}, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.73098123, saturation 0.9874258, and chroma 0.20108652.
    +592     * It can be represented as a packed float with the constant {@code -0x1.ccf848p125F}.
    +593     * <pre>
    +594     * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #000000'>&nbsp;@&nbsp;</font>
    +595     * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #000080'>&nbsp;@&nbsp;</font><font style='background-color: #000080; color: #888888'>&nbsp;@&nbsp;</font>
    +596     * <font style='background-color: #000080;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000080; color: #ffffff'>&nbsp;@&nbsp;</font>
    +597     * </pre>
    +598     */
    +599    public static final float NAVY = -0x1.ccf848p125F;
    +600    static { NAMED.put("navy", -0x1.ccf848p125F); LIST.add(-0x1.ccf848p125F); }
    +601
    +602    /**
    +603     * This color constant "lavender" has RGBA8888 code {@code B991FFFF}, L 0.6745098, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.83155453, saturation 0.9661873, and chroma 0.14500555.
    +604     * It can be represented as a packed float with the constant {@code -0x1.df1158p125F}.
    +605     * <pre>
    +606     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #000000'>&nbsp;@&nbsp;</font>
    +607     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #B991FF'>&nbsp;@&nbsp;</font><font style='background-color: #B991FF; color: #888888'>&nbsp;@&nbsp;</font>
    +608     * <font style='background-color: #B991FF;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #B991FF; color: #ffffff'>&nbsp;@&nbsp;</font>
    +609     * </pre>
    +610     */
    +611    public static final float LAVENDER = -0x1.df1158p125F;
    +612    static { NAMED.put("lavender", -0x1.df1158p125F); LIST.add(-0x1.df1158p125F); }
    +613
    +614    /**
    +615     * This color constant "plum" has RGBA8888 code {@code BE0DC6FF}, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9050996, saturation 0.9399402, and chroma 0.26337513.
    +616     * It can be represented as a packed float with the constant {@code -0x1.d936e8p125F}.
    +617     * <pre>
    +618     * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #000000'>&nbsp;@&nbsp;</font>
    +619     * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #BE0DC6'>&nbsp;@&nbsp;</font><font style='background-color: #BE0DC6; color: #888888'>&nbsp;@&nbsp;</font>
    +620     * <font style='background-color: #BE0DC6;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #BE0DC6; color: #ffffff'>&nbsp;@&nbsp;</font>
    +621     * </pre>
    +622     */
    +623    public static final float PLUM = -0x1.d936e8p125F;
    +624    static { NAMED.put("plum", -0x1.d936e8p125F); LIST.add(-0x1.d936e8p125F); }
    +625
    +626    /**
    +627     * This color constant "mauve" has RGBA8888 code {@code AB73ABFF}, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.3259601, and chroma 0.1008085.
    +628     * It can be represented as a packed float with the constant {@code -0x1.f11518p125F}.
    +629     * <pre>
    +630     * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #000000'>&nbsp;@&nbsp;</font>
    +631     * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #AB73AB'>&nbsp;@&nbsp;</font><font style='background-color: #AB73AB; color: #888888'>&nbsp;@&nbsp;</font>
    +632     * <font style='background-color: #AB73AB;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #AB73AB; color: #ffffff'>&nbsp;@&nbsp;</font>
    +633     * </pre>
    +634     */
    +635    public static final float MAUVE = -0x1.f11518p125F;
    +636    static { NAMED.put("mauve", -0x1.f11518p125F); LIST.add(-0x1.f11518p125F); }
    +637
    +638    /**
    +639     * This color constant "rose" has RGBA8888 code {@code E61E78FF}, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99470973, saturation 0.90959585, and chroma 0.23076649.
    +640     * It can be represented as a packed float with the constant {@code -0x1.fd3afcp125F}.
    +641     * <pre>
    +642     * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #000000'>&nbsp;@&nbsp;</font>
    +643     * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #E61E78'>&nbsp;@&nbsp;</font><font style='background-color: #E61E78; color: #888888'>&nbsp;@&nbsp;</font>
    +644     * <font style='background-color: #E61E78;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #E61E78; color: #ffffff'>&nbsp;@&nbsp;</font>
    +645     * </pre>
    +646     */
    +647    public static final float ROSE = -0x1.fd3afcp125F;
    +648    static { NAMED.put("rose", -0x1.fd3afcp125F); LIST.add(-0x1.fd3afcp125F); }
    +649
    +650    /**
    +651     * This color constant "raspberry" has RGBA8888 code {@code 911437FF}, L 0.29803923, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.029965011, saturation 0.9096833, and chroma 0.16247371.
    +652     * It can be represented as a packed float with the constant {@code -0x1.072898p126F}.
    +653     * <pre>
    +654     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #000000'>&nbsp;@&nbsp;</font>
    +655     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #888888; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #ffffff; color: #911437'>&nbsp;@&nbsp;</font><font style='background-color: #911437; color: #888888'>&nbsp;@&nbsp;</font>
    +656     * <font style='background-color: #911437;'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #000000; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #888888; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #ffffff; color: #000000'>&nbsp;&nbsp;&nbsp;</font><font style='background-color: #911437; color: #ffffff'>&nbsp;@&nbsp;</font>
    +657     * </pre>
    +658     */
    +659    public static final float RASPBERRY = -0x1.072898p126F;
    +660    static { NAMED.put("raspberry", -0x1.072898p126F); LIST.add(-0x1.072898p126F); }
    +661
    +662    /**
    +663     * All names for colors in this palette, in alphabetical order. You can fetch the corresponding packed float color
    +664     * by looking up a name in {@link #NAMED}.
    +665     */
    +666    public static final ObjectList<String> NAMES = NAMED.order();
    +667    static {
    +668        NAMED.setDefaultValue(TRANSPARENT);
    +669        NAMES.sort(null);
    +670    }
    +671    /**
    +672     * All names for colors in this palette, with grayscale first, then sorted by hue from red to yellow to green to
    +673     * blue. You can fetch the corresponding packed float color by looking up a name in {@link #NAMED}.
    +674     */
    +675    public static final ObjectList<String> NAMES_BY_HUE = new ObjectList<>(NAMES);
    +676    /**
    +677     * The packed Oklab float colors that correspond to items in {@link #NAMES_BY_HUE}, with the same order.
    +678     */
    +679    public static final FloatList COLORS_BY_HUE = new FloatList(NAMES_BY_HUE.size());
    +680    /**
    +681     * All names for colors in this palette, sorted by lightness from black to white. You can fetch the
    +682     * corresponding packed float color by looking up a name in {@link #NAMED}.
    +683     */
    +684    public static final ObjectList<String> NAMES_BY_LIGHTNESS = new ObjectList<>(NAMES);
    +685    static {
    +686        NAMES_BY_HUE.sort((o1, o2) -> {
    +687            final float c1 = NAMED.get(o1), c2 = NAMED.get(o2);
    +688            if(ColorTools.alphaInt(c1) < 128) return -10000;
    +689            else if(ColorTools.alphaInt(c2) < 128) return 10000;
    +690            final float s1 = ColorTools.oklabSaturation(c1), s2 = ColorTools.oklabSaturation(c2);
    +691            if(s1 <= 0.05f && s2 > 0.05f)
    +692                return -1000;
    +693            else if(s1 > 0.05f && s2 <= 0.05f)
    +694                return 1000;
    +695            else if(s1 <= 0.05f && s2 <= 0.05f)
    +696                return (int)Math.signum(ColorTools.channelL(c1) - ColorTools.channelL(c2));
    +697            else
    +698                return 2 * (int)Math.signum(ColorTools.oklabHue(c1) - ColorTools.oklabHue(c2))
    +699                        + (int)Math.signum(ColorTools.channelL(c1) - ColorTools.channelL(c2));
    +700        });
    +701        for(String name : NAMES_BY_HUE) {
    +702            COLORS_BY_HUE.add(NAMED.get(name));
    +703        }
    +704        NAMES_BY_LIGHTNESS.sort((o1, o2) ->
    +705                Float.compare(ColorTools.channelL(NAMED.get(o1)), ColorTools.channelL(NAMED.get(o2))));
    +706    }
    +707
    +708    private static final FloatList mixing = new FloatList(4);
    +709
    +710    /**
    +711     * Parses a color description and returns the approximate color it describes, as a packed float color.
    +712     * Color descriptions consist of one or more lower-case words, separated by non-alphabetical characters (typically
    +713     * spaces and/or hyphens). Any word that is the name of a color in this SimplePalette will be looked up in
    +714     * {@link #NAMED} and tracked; if there is more than one of these color name words, the colors will be mixed using
    +715     * {@link FloatColors#mix(float[], int, int)}, or if there is just one color name word, then the corresponding color
    +716     * will be used. The special adjectives "light" and "dark" change the intensity of the described color; likewise,
    +717     * "rich" and "dull" change the saturation (the difference of the chromatic channels from grayscale). All of these
    +718     * adjectives can have "-er" or "-est" appended to make their effect twice or three times as strong. Technically,
    +719     * the chars appended to an adjective don't matter, only their count, so "lightaa" is the same as "lighter" and
    +720     * "richcat" is the same as "richest". There's an unofficial fourth level as well, used when any 4 characters are
    +721     * appended to an adjective (as in "darkmost"); it has four times the effect of the original adjective. If a color
    +722     * name or adjective is invalid, it is considered the same as adding the color {@link #TRANSPARENT}.
    +723     * <br>
    +724     * Examples of valid descriptions include "blue", "dark green", "duller red", "peach pink", "indigo purple mauve",
    +725     * and "lightest richer apricot-olive".
    +726     * @param description a color description, as a lower-case String matching the above format
    +727     * @return a packed float color as described
    +728     */
    +729    public static float parseDescription(final String description) {
    +730        float intensity = 0f, saturation = 0f;
    +731        final String[] terms = description.split("[^a-zA-Z]+");
    +732        mixing.clear();
    +733        for(String term : terms) {
    +734            if (term == null || term.isEmpty()) continue;
    +735            final int len = term.length();
    +736            switch (term.charAt(0)) {
    +737                case 'l':
    +738                    if (len > 2 && term.charAt(2) == 'g') {
    +739                        switch (len) {
    +740                            case 9:
    +741                                intensity += 0.125f;
    +742                            case 8:
    +743                                intensity += 0.125f;
    +744                            case 7:
    +745                                intensity += 0.125f;
    +746                            case 5:
    +747                                intensity += 0.125f;
    +748                                break;
    +749                            default:
    +750                                mixing.add(TRANSPARENT);
    +751                                break;
    +752                        }
    +753                    } else {
    +754                        mixing.add(NAMED.get(term));
    +755                    }
    +756                    break;
    +757                case 'r':
    +758                    if (len > 1 && term.charAt(1) == 'i') {
    +759                        switch (len) {
    +760                            case 8:
    +761                                saturation += 0.2f;
    +762                            case 7:
    +763                                saturation += 0.2f;
    +764                            case 6:
    +765                                saturation += 0.2f;
    +766                            case 4:
    +767                                saturation += 0.2f;
    +768                                break;
    +769                            default:
    +770                                mixing.add(TRANSPARENT);
    +771                                break;
    +772                        }
    +773                    } else {
    +774                        mixing.add(NAMED.get(term));
    +775                    }
    +776                    break;
    +777                case 'd':
    +778                    if (len > 1 && term.charAt(1) == 'a') {
    +779                        switch (len) {
    +780                            case 8:
    +781                                intensity -= 0.15f;
    +782                            case 7:
    +783                                intensity -= 0.15f;
    +784                            case 6:
    +785                                intensity -= 0.15f;
    +786                            case 4:
    +787                                intensity -= 0.15f;
    +788                                break;
    +789                            default:
    +790                                mixing.add(TRANSPARENT);
    +791                                break;
    +792                        }
    +793                    } else if (len > 1 && term.charAt(1) == 'u') {
    +794                        switch (len) {
    +795                            case 8:
    +796                                saturation -= 0.2f;
    +797                            case 7:
    +798                                saturation -= 0.2f;
    +799                            case 6:
    +800                                saturation -= 0.2f;
    +801                            case 4:
    +802                                saturation -= 0.2f;
    +803                                break;
    +804                            default:
    +805                                mixing.add(TRANSPARENT);
    +806                                break;
    +807                        }
    +808                    } else {
    +809                        mixing.add(NAMED.get(term));
    +810                    }
    +811                    break;
    +812                default:
    +813                    mixing.add(NAMED.get(term));
    +814                    break;
    +815            }
    +816        }
    +817        float result = mix(mixing.items, 0, mixing.size());
    +818
    +819        if(intensity > 0) result = lighten(result, intensity);
    +820        else if(intensity < 0) result = darken(result, -intensity);
    +821
    +822        if(saturation > 0) result = enrich(result, saturation);
    +823        else if(saturation < 0) result = limitToGamut(dullen(result, -saturation));
    +824        else result = limitToGamut(result);
    +825
    +826        return result;
    +827    }
    +828
    +829    private static final ObjectList<String> namesByHue = new ObjectList<>(NAMES_BY_HUE);
    +830    private static final FloatList colorsByHue = new FloatList(COLORS_BY_HUE);
    +831    static {
    +832        int trn = namesByHue.indexOf("transparent");
    +833        namesByHue.removeAt(trn);
    +834        colorsByHue.removeAt(trn);
    +835        ALIASES.put("grey", GRAY);
    +836        ALIASES.put("gold", SAFFRON);
    +837        ALIASES.put("puce", MAUVE);
    +838        ALIASES.put("sand", TAN);
    +839        ALIASES.put("skin", PEACH); // Yes, I am aware that there is more than one skin color, but this can only map to one.
    +840        ALIASES.put("coral", SALMON);
    +841        ALIASES.put("azure", SKY);
    +842        ALIASES.put("ocean", TEAL);
    +843        ALIASES.put("sapphire", COBALT);
    +844        NAMED.putAll(ALIASES);
    +845    }
    +846    /**
    +847     * Given a color as a packed Oklab float, this finds the closest description it can to match the given color while
    +848     * using at most {@code mixCount} colors to mix in. You should only use small numbers for mixCount, like 1 to 3;
    +849     * this can take quite a while to run otherwise. This returns a String description that can be passed to
    +850     * {@link #parseDescription(String)}. It is likely that this will use very contrasting colors if mixCount is 2 or
    +851     * greater and the color to match is desaturated or brownish.
    +852     * @param oklab a packed Oklab float color to attempt to match
    +853     * @param mixCount how many color names this will use in the returned description
    +854     * @return a description that can be fed to {@link #parseDescription(String)} to get a similar color
    +855     */
    +856    public static String bestMatch(final float oklab, int mixCount) {
    +857        mixCount = Math.max(1, mixCount);
    +858        float bestDistance = Float.POSITIVE_INFINITY;
    +859        final int paletteSize = namesByHue.size(), colorTries = (int)Math.pow(paletteSize, mixCount), totalTries = colorTries * 81;
    +860        final float targetL = ColorTools.channelL(oklab), targetA = ColorTools.channelA(oklab), targetB = ColorTools.channelB(oklab);
    +861        final String[] lightAdjectives = {"darkmost ", "darkest ", "darker ", "dark ", "", "light ", "lighter ", "lightest ", "lightmost "};
    +862        final String[] satAdjectives = {"dullmost ", "dullest ", "duller ", "dull ", "", "rich ", "richer ", "richest ", "richmost "};
    +863        mixing.clear();
    +864        for (int i = 0; i < mixCount; i++) {
    +865            mixing.add(colorsByHue.get(0));
    +866        }
    +867        int bestCode = 0;
    +868        for (int c = 0; c < totalTries; c++) {
    +869            for (int i = 0, e = 1; i < mixCount; i++, e *= paletteSize) {
    +870                mixing.set(i, colorsByHue.get((c / e) % paletteSize));
    +871            }
    +872            int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4);
    +873
    +874            float result = FloatColors.mix(mixing.items, 0, mixCount);
    +875            if(idxI > 0) result = ColorTools.lighten(result, 0.125f * idxI);
    +876            else if(idxI < 0) result = ColorTools.darken(result, -0.15f * idxI);
    +877
    +878            if(idxS > 0) result = ColorTools.limitToGamut(ColorTools.enrich(result, 0.2f * idxS));
    +879            else if(idxS < 0) result = ColorTools.dullen(result, -0.2f * idxS);
    +880            else result = ColorTools.limitToGamut(result);
    +881
    +882            float dL = ColorTools.channelL(result) - targetL, dA = ColorTools.channelA(result) - targetA, dB = ColorTools.channelB(result) - targetB;
    +883            if(bestDistance > (bestDistance = Math.min(dL * dL + dA * dA + dB * dB, bestDistance)))
    +884                bestCode = c;
    +885        }
    +886
    +887        StringBuilder description = new StringBuilder(lightAdjectives[(bestCode / colorTries) % 9] + satAdjectives[bestCode / (colorTries * 9)]);
    +888        for (int i = 0, e = 1; i < mixCount; e *= paletteSize) {
    +889            description.append(namesByHue.get((bestCode / e) % paletteSize));
    +890            if(++i < mixCount)
    +891                description.append(' ');
    +892        }
    +893        return description.toString();
    +894    }
    +895}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html
    index fb58b90a..e4a881b8 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/ColorTools.html
    @@ -182,441 +182,592 @@
     169         */
     170        public static float floatGetHSL(float hue, float saturation, float lightness, float opacity) {
     171                if (lightness <= 0.001f) {
    -172                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x7F7F00);
    -173                } else {
    -174                        return FloatColors.hsl2rgb(hue, saturation, lightness, opacity);
    -175                }
    -176        }
    -177
    -178        /**
    -179         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    -180         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
    -181         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    -182         */
    -183        public static float saturation(final float encoded) {
    -184                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -185                final float r = (decoded & 0xff) / 255f;
    -186                final float g = (decoded >>> 8 & 0xff) / 255f;
    -187                final float b = (decoded >>> 16 & 0xff) / 255f;
    -188                float x, y, w;
    -189                if(g < b) {
    -190                        x = b;
    -191                        y = g;
    -192                }
    -193                else {
    -194                        x = g;
    -195                        y = b;
    -196                }
    -197                if(r < x) {
    -198                        w = r;
    -199                }
    -200                else {
    -201                        w = x;
    -202                        x = r;
    -203                }
    -204                return x - Math.min(w, y);
    -205//              float d = x - Math.min(w, y);
    -206//              float li = x * (1f - 0.5f * d / (x + 1e-10f));
    -207//              return (x - li); // (Math.min(li, 1f - li) + 1e-10f);
    -208        }
    -209
    -210        public static float lightness(final float encoded) {
    -211                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -212                final float r = (decoded & 0xff) / 255f;
    -213                final float g = (decoded >>> 8 & 0xff) / 255f;
    -214                final float b = (decoded >>> 16 & 0xff) / 255f;
    -215                float x, y, w;
    -216                if(g < b) {
    -217                        x = b;
    -218                        y = g;
    -219                }
    -220                else {
    -221                        x = g;
    -222                        y = b;
    -223                }
    -224                if(r < x) {
    -225                        w = r;
    -226                }
    -227                else {
    -228                        w = x;
    -229                        x = r;
    -230                }
    -231                float d = x - Math.min(w, y);
    -232                return x * (1f - 0.5f * d / (x + 1e-10f));
    -233        }
    -234
    -235        /**
    -236         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    -237         * to 1f (exclusive, red and approaching purple if decreased).
    -238         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
    -239         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    -240         * eventually to purple before looping back to almost the same red (1.0, exclusive)
    -241         */
    -242        public static float hue(final float encoded) {
    -243                final int decoded = BitConversion.floatToRawIntBits(encoded);
    -244                final float r = (decoded & 0xff) / 255f;
    -245                final float g = (decoded >>> 8 & 0xff) / 255f;
    -246                final float b = (decoded >>> 16 & 0xff) / 255f;
    -247                float x, y, z, w;
    -248                if(g < b) {
    -249                        x = b;
    -250                        y = g;
    -251                        z = -1f;
    -252                        w = 2f / 3f;
    -253                }
    -254                else {
    -255                        x = g;
    -256                        y = b;
    -257                        z = 0f;
    -258                        w = -1f / 3f;
    -259                }
    -260                if(r < x) {
    -261                        z = w;
    -262                        w = r;
    -263                }
    -264                else {
    -265                        w = x;
    -266                        x = r;
    -267                }
    -268                float d = x - Math.min(w, y);
    -269                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
    -270        }
    -271
    -272        /**
    -273         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    -274         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not RGB! Takes
    -275         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    -276         * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is
    -277         * likely to be different than the result of {@link #rgb(float, float, float, float)} unless hue, saturation,
    -278         * lightness, and opacity are all 0. This won't allocate any objects.
    -279         * <br>
    -280         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    -281         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    -282         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    -283         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    -284         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    -285         *
    -286         * @param basis      a packed float color that will be used as the starting point to make the next color
    -287         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    -288         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    -289         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    -290         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    -291         * @return a float encoding a variation of basis with the given changes
    -292         */
    -293        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    -294                final int decoded = BitConversion.floatToRawIntBits(basis);
    -295                opacity = Math.min(Math.max(opacity + (decoded >>> 25) * (1f / 127f), 0f), 1f);
    -296                final float r = (decoded & 0xff) / 255f;
    -297                final float g = (decoded >>> 8 & 0xff) / 255f;
    -298                final float b = (decoded >>> 16 & 0xff) / 255f;
    -299                float x, y, z, w;
    -300                if(g < b) {
    -301                        x = b;
    -302                        y = g;
    -303                        z = -1f;
    -304                        w = 2f / 3f;
    -305                }
    -306                else {
    -307                        x = g;
    -308                        y = b;
    -309                        z = 0f;
    -310                        w = -1f / 3f;
    -311                }
    -312                if(r < x) {
    -313                        z = w;
    -314                        w = r;
    -315                }
    -316                else {
    -317                        w = x;
    -318                        x = r;
    -319                }
    -320                final float d = x - Math.min(w, y);
    -321                light = Math.min(Math.max(x * (1f - 0.5f * d / (x + 1e-10f)) + light, 0f), 1f);
    -322                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
    -323                saturation += x - Math.min(w, y);
    -324                return FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), light, opacity);
    -325        }
    -326
    -327        /**
    -328         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    -329         * start as-is) and 1f (return white), start should be a packed color, as from
    -330         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -331         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -332         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    -333         * @see #darken(float, float) the counterpart method that darkens a float color
    -334         * @param start the starting color as a packed float
    -335         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    -336         * @return a packed float that represents a color between start and white
    -337         */
    -338        public static float lighten(final float start, final float change) {
    -339                final int s = BitConversion.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    -340                                a = s & 0xFE000000;
    -341                return BitConversion.intBitsToFloat(
    -342                                ((int) (r + (0xFF - r) * change) & 0xFF) |
    -343                                ((int) (g + (0xFF - g) * change) & 0xFF) << 8 |
    -344                                ((int) (b + (0xFF - b) * change) & 0xFF) << 16 |
    -345                                a);
    -346        }
    -347
    -348        /**
    -349         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    -350         * start as-is) and 1f (return black), start should be a packed color, as from
    -351         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -352         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -353         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    -354         * @see #lighten(float, float) the counterpart method that lightens a float color
    -355         * @param start the starting color as a packed float
    -356         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    -357         * @return a packed float that represents a color between start and black
    -358         */
    -359        public static float darken(final float start, final float change) {
    -360                final int s = BitConversion.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    -361                                a = s & 0xFE000000;
    -362                return BitConversion.intBitsToFloat(
    -363                                ((int) (r * (1f - change)) & 0xFF) |
    -364                                ((int) (g * (1f - change)) & 0xFF) << 8 |
    -365                                ((int) (b * (1f - change)) & 0xFF) << 16 |
    -366                                a);
    -367        }
    -368
    -369        /**
    -370         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    -371         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    -372         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    -373         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -374         * transparent. This won't change the intensity, protan, or tritan of the color.
    -375         * @see #fade(float, float) the counterpart method that makes a float color more translucent
    -376         * @param start the starting color as a packed float
    -377         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    -378         * @return a packed float that represents a color between start and its opaque version
    -379         */
    -380        public static float blot(final float start, final float change) {
    -381                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    -382                return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    -383        }
    -384
    -385        /**
    -386         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    -387         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    -388         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    -389         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    -390         * transparent. This won't change the intensity, protan, or tritan of the color.
    -391         * @see #blot(float, float) the counterpart method that makes a float color more opaque
    -392         * @param start the starting color as a packed float
    -393         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    -394         * @return a packed float that represents a color between start and transparent
    -395         */
    -396        public static float fade(final float start, final float change) {
    -397                final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    -398                return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    -399        }
    -400
    -401        /**
    -402         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast with,
    -403         * gets a packed float RGBA color with roughly inverted lightness (how the Oklab color space interprets it), but the
    -404         * same general hue and saturation unless the lightness gets too close to white or black. This won't ever produce
    -405         * black or other very dark colors, and also has a gap in the range it produces for lightness values between 0.5 and
    -406         * 0.55. That allows most of the colors this method produces to contrast well as a foreground when displayed on a
    -407         * background of {@code contrastingColor}, or vice versa. This will leave the lightness unchanged if the
    -408         * hue/saturation of the contrastingColor and those of the mainColor are already very different. This has nothing to
    -409         * do with the contrast channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar
    -410         * lightness values further apart by just a little, this makes a modification on {@code mainColor} to maximize its
    -411         * lightness difference from {@code contrastingColor} without losing its other qualities.
    -412         * @param mainColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; this is the color that will be adjusted
    -413         * @param contrastingColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; the adjusted mainColor will contrast with this
    -414         * @return a different RGBA packed float color, based on mainColor but with potentially very different lightness
    -415         */
    -416        public static float inverseLightness(final float mainColor, final float contrastingColor)
    -417        {
    -418                return com.github.tommyettinger.colorful.pure.oklab.ColorTools.toRGBA(
    -419                                com.github.tommyettinger.colorful.pure.oklab.ColorTools.inverseLightness(
    -420                                                com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(mainColor),
    -421                                                com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(contrastingColor)));
    -422        }
    -423
    -424        /**
    -425         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast
    -426         * with, gets a packed float RGBA color with lightness that should be quite different from
    -427         * {@code contrastingColor}'s lightness, but the same chromatic channels and opacity. This allows most of the colors
    -428         * this method produces to contrast well as a foreground when displayed on a background of {@code contrastingColor},
    -429         * or vice versa. This goes through Oklab as an intermediate step, so lightness is in terms of Oklab's L channel.
    -430         * <br>
    -431         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    -432         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    -433         * averages the original lightness of mainColor with the modified one, this tends to produce softer color changes.
    -434         * @param mainColor a packed RGBA float color; this is the color that will be adjusted
    -435         * @param contrastingColor a packed RGBA float color; the adjusted mainColor will contrast with the lightness of this
    -436         * @return a different packed RGBA float color, based on mainColor but typically with different lightness
    -437         */
    -438        public static float differentiateLightness(final float mainColor, final float contrastingColor)
    -439        {
    -440                final int main = BitConversion.floatToRawIntBits(com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(mainColor)),
    -441                                contrast = BitConversion.floatToRawIntBits(com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(contrastingColor));
    -442                return com.github.tommyettinger.colorful.pure.oklab.ColorTools.toRGBA(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
    -443        }
    -444
    -445        /**
    -446         * Pretty simple; adds 0.5 to the given color's lightness (calculated by converting it to Oklab internally) and
    -447         * wraps it around if it would go above 1.0, then averages that with the original lightness. This means light colors
    -448         * become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    -449         * @param mainColor a packed RGBA float color
    -450         * @return a different packed RGBA float color, with its lightness channel changed and limited to the correct gamut
    -451         */
    -452        public static float offsetLightness(final float mainColor) {
    -453                final int oklab = BitConversion.floatToRawIntBits(mainColor);
    -454                return com.github.tommyettinger.colorful.pure.oklab.ColorTools.toRGBA(BitConversion.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
    -455        }
    -456
    -457
    -458        /**
    -459         * Makes the additive RGBA color stored in {@code color} cause less of a change when used as a tint, as if it were
    -460         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    -461         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    -462         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    -463         * @param color a color that should have its tinting effect potentially weakened
    -464         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    -465         * @return an RGBA float color between gray and {@code color}
    -466         */
    -467        public static float lessenChange(final float color, float fraction) {
    -468                final int e = BitConversion.floatToRawIntBits(color),
    -469                                rs = 0x80, gs = 0x80, bs = 0x80,
    -470                                re = (e & 0xFF), ge = (e >>> 8) & 0xFF, be = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
    -471                return BitConversion.intBitsToFloat(
    -472                                  ((int) (rs + fraction * (re - rs)) & 0xFF)
    -473                                | ((int) (gs + fraction * (ge - gs)) & 0xFF) << 8
    -474                                | ((int) (bs + fraction * (be - bs)) & 0xFF) << 16
    -475                                                  | ae << 24);
    -476        }
    -477
    -478        /**
    -479         * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding
    -480         * "add" parameter and then clamping. Each value is considered in the 0 to 1 range. This returns a different float
    -481         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
    -482         * you want to stay unchanged.
    -483         * @param encoded a packed float RGB color
    -484         * @param addR how much to add to the R channel; typically in the -1 to 1 range
    -485         * @param addG how much to add to the G channel; typically in the -1 to 1 range
    -486         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    -487         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -488         * @return a packed float RGB color with the requested edits applied to {@code encoded}
    -489         */
    -490        public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha){
    -491                return editRGB(encoded, addR, addG, addB, addAlpha, 1f, 1f, 1f, 1f);
    -492        }
    -493
    -494        /**
    -495         * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each
    -496         * channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
    -497         * This means the red value {@code R} (which is considered in the 0 to 1 range) is multiplied by {@code mulR}, then
    -498         * has {@code addR} added, and then is clamped to the normal range for R (0 to 1). This returns a different float
    -499         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
    -500         * you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change.
    -501         * @param encoded a packed float RGB color
    -502         * @param addR how much to add to the R channel; typically in the -1 to 1 range
    -503         * @param addG how much to add to the G channel; typically in the -1 to 1 range
    -504         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    -505         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    -506         * @param mulR how much to multiply the R channel by; should be non-negative
    -507         * @param mulG how much to multiply the G channel by; should be non-negative
    -508         * @param mulB how much to multiply the B channel by; should be non-negative
    -509         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    -510         * @return a packed float RGB color with the requested edits applied to {@code encoded}
    -511         */
    -512        public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha,
    -513                                                                float mulR, float mulG, float mulB, float mulAlpha){
    -514                final int s = BitConversion.floatToRawIntBits(encoded), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    -515                                a = s >>> 25;
    -516                return BitConversion.intBitsToFloat(
    -517                                Math.max(0, Math.min(255, (int) (r * mulR + addR * 255.999f))) |
    -518                                                Math.max(0, Math.min(255, (int) (g * mulG + addG * 255.999f))) << 8 |
    -519                                                Math.max(0, Math.min(255, (int) (b * mulB + addB * 255.999f))) << 16 |
    -520                                                Math.max(0, Math.min(127, (int) (a * mulAlpha + addAlpha * 127.999f))) << 25);
    -521        }
    -522        
    -523        /**
    -524         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    -525         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    -526         * be different each time this is called, and can be obtained from a random number generator to make the colors more
    -527         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    -528         * produce two similar colors in a row unless variance is very small. The variance affects the R, G, and B of the
    -529         * generated color equally, and each of those channels can go up or down by the given variance as long as the total
    -530         * distance isn't greater than the variance.
    -531         * @param color a packed float color, as produced by {@link #rgb(float, float, float, float)}
    -532         * @param seed a long seed that should be different on each call; should not be 0
    -533         * @param variance max amount of difference between the given color and the generated color; always less than 1
    -534         * @return a generated packed float color that should be at least somewhat different from {@code color}
    -535         */
    -536        public static float randomEdit(final float color, long seed, final float variance) {
    -537                final int decoded = BitConversion.floatToRawIntBits(color);
    -538                final float r = (decoded & 0xff) / 255f;
    -539                final float g = (decoded >>> 8 & 0xff) / 255f;
    -540                final float b = (decoded >>> 16 & 0xff) / 255f;
    -541                final float limit = variance * variance;
    -542                float dist, x, y, z;
    -543                for (int j = 0; j < 50; j++) {
    -544                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -545                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -546                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    -547                        seed += 0x9E3779B97F4A7C15L;
    -548                        dist = x * x + y * y + z * z;
    -549                        x += r;
    -550                        y += g;
    -551                        z += b;
    -552                        if(dist <= limit)
    -553                                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.999f) << 16 & 0xFF0000)
    -554                                        | ((int)(y * 255.999f) << 8 & 0xFF00) | (int)(x * 255.999f));
    -555                }
    -556                return color;
    -557        }
    -558
    -559        /**
    -560         * Produces a random packed float color that is always opaque and should be uniformly distributed.
    -561         * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.random.LaserRandom})
    -562         * @return a packed float color that is always opaque
    -563         */
    -564        public static float randomColor(Random random) {
    -565                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    -566                return BitConversion.intBitsToFloat(0xFE000000
    -567                                | ((int) (b * 256f) << 16 & 0xFF0000)
    -568                                | ((int) (g * 256f) << 8 & 0xFF00)
    -569                                | ((int) (r * 256f) & 0xFF));
    -570        }
    -571
    -572        /**
    -573         * Produces a random packed float color that is always opaque and should be uniformly distributed.
    -574         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    -575         * and EnhancedRandom.
    -576         * @param random any subclass of juniper's EnhancedRandom, such as a
    -577         * {@link com.github.tommyettinger.random.DistinctRandom} or
    -578         * {@link com.github.tommyettinger.random.FourWheelRandom}
    -579         * @return a packed float color that is always in-gamut
    -580         */
    -581        public static float randomizedColor(EnhancedRandom random) {
    -582                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    -583                return BitConversion.intBitsToFloat(0xFE000000
    -584                                | ((int) (b * 256f) << 16 & 0xFF0000)
    -585                                | ((int) (g * 256f) << 8 & 0xFF00)
    -586                                | ((int) (r * 256f) & 0xFF));
    -587        }
    -588
    -589        /**
    -590         * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b)
    -591         * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence,
    -592         * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you
    -593         * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to
    -594         * avoid generating too many colors with high blue, for instance.
    -595         * @param r red value to use; will be clamped between 0 and 1
    -596         * @param g green value to use; will be clamped between 0 and 1
    -597         * @param b blue value to use; will be clamped between 0 and 1
    -598         * @return a packed float color that is always opaque
    -599         */
    -600        public static float subrandomColor(float r, float g, float b) {
    -601                return BitConversion.intBitsToFloat(0xFE000000
    -602                                | ((int) Math.min(Math.max(b * 256f, 0), 255.999f) << 16 & 0xFF0000)
    -603                                | ((int) Math.min(Math.max(g * 256f, 0), 255.999f) << 8 & 0xFF00)
    -604                                | ((int) Math.min(Math.max(r * 256f, 0), 255.999f) & 0xFF));
    -605        }
    -606}
    +172                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000));
    +173                } else if (lightness >= 0.999f) {
    +174                        return BitConversion.intBitsToFloat((((int) (opacity * 255f) << 24) & 0xFE000000) | 0x00FFFFFF);
    +175                } else {
    +176                        return FloatColors.hsl2rgb(hue, saturation, lightness, opacity);
    +177                }
    +178        }
    +179
    +180        /**
    +181         * Gets the saturation of the given encoded color, as a float ranging from 0.0f to 1.0f, inclusive.
    +182         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
    +183         * @return the saturation of the color from 0.0 (a grayscale color; inclusive) to 1.0 (a bright color, inclusive)
    +184         */
    +185        public static float saturation(final float encoded) {
    +186                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +187                final float r = (decoded & 0xff) / 255f;
    +188                final float g = (decoded >>> 8 & 0xff) / 255f;
    +189                final float b = (decoded >>> 16 & 0xff) / 255f;
    +190                float x, y, w;
    +191                if(g < b) {
    +192                        x = b;
    +193                        y = g;
    +194                }
    +195                else {
    +196                        x = g;
    +197                        y = b;
    +198                }
    +199                if(r < x) {
    +200                        w = r;
    +201                }
    +202                else {
    +203                        w = x;
    +204                        x = r;
    +205                }
    +206                return x - Math.min(w, y);
    +207//              float d = x - Math.min(w, y);
    +208//              float li = x * (1f - 0.5f * d / (x + 1e-10f));
    +209//              return (x - li); // (Math.min(li, 1f - li) + 1e-10f);
    +210        }
    +211
    +212        public static float lightness(final float encoded) {
    +213                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +214                final float r = (decoded & 0xff) / 255f;
    +215                final float g = (decoded >>> 8 & 0xff) / 255f;
    +216                final float b = (decoded >>> 16 & 0xff) / 255f;
    +217                float x, y, w;
    +218                if(g < b) {
    +219                        x = b;
    +220                        y = g;
    +221                }
    +222                else {
    +223                        x = g;
    +224                        y = b;
    +225                }
    +226                if(r < x) {
    +227                        w = r;
    +228                }
    +229                else {
    +230                        w = x;
    +231                        x = r;
    +232                }
    +233                float d = x - Math.min(w, y);
    +234                return x * (1f - 0.5f * d / (x + 1e-10f));
    +235        }
    +236
    +237        /**
    +238         * Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased)
    +239         * to 1f (exclusive, red and approaching purple if decreased).
    +240         * @param encoded a color as a packed float that can be obtained by {@link #rgb(float, float, float, float)}
    +241         * @return The hue of the color from 0.0 (red, inclusive) towards orange, then yellow, and
    +242         * eventually to purple before looping back to almost the same red (1.0, exclusive)
    +243         */
    +244        public static float hue(final float encoded) {
    +245                final int decoded = BitConversion.floatToRawIntBits(encoded);
    +246                final float r = (decoded & 0xff) / 255f;
    +247                final float g = (decoded >>> 8 & 0xff) / 255f;
    +248                final float b = (decoded >>> 16 & 0xff) / 255f;
    +249                float x, y, z, w;
    +250                if(g < b) {
    +251                        x = b;
    +252                        y = g;
    +253                        z = -1f;
    +254                        w = 2f / 3f;
    +255                }
    +256                else {
    +257                        x = g;
    +258                        y = b;
    +259                        z = 0f;
    +260                        w = -1f / 3f;
    +261                }
    +262                if(r < x) {
    +263                        z = w;
    +264                        w = r;
    +265                }
    +266                else {
    +267                        w = x;
    +268                        x = r;
    +269                }
    +270                float d = x - Math.min(w, y);
    +271                return Math.abs(z + (w - y) / (6f * d + 1e-10f));
    +272        }
    +273
    +274        /**
    +275         * Gets a variation on the packed float color basis as another packed float that has its hue, saturation, lightness,
    +276         * and opacity adjusted by the specified amounts. Note that this edits the color in HSL space, not RGB! Takes
    +277         * floats representing the amounts of change to apply to hue, saturation, lightness, and opacity; these can be
    +278         * between -1f and 1f. Returns a float that can be used as a packed or encoded color. The float is
    +279         * likely to be different than the result of {@link #rgb(float, float, float, float)} unless hue, saturation,
    +280         * lightness, and opacity are all 0. This won't allocate any objects.
    +281         * <br>
    +282         * The parameters this takes all specify additive changes for a color component, clamping the final values so they
    +283         * can't go above 1 or below 0, with an exception for hue, which can rotate around if lower or higher hues would be
    +284         * used. As an example, if you give this 0.4f for saturation, and the current color has saturation 0.7f, then the
    +285         * resulting color will have 1f for saturation. If you gave this -0.1f for saturation and the current color again
    +286         * has saturation 0.7f, then resulting color will have 0.6f for saturation.
    +287         *
    +288         * @param basis      a packed float color that will be used as the starting point to make the next color
    +289         * @param hue        -1f to 1f, the hue change that can be applied to the new float color (not clamped, wraps)
    +290         * @param saturation -1f to 1f, the saturation change that can be applied to the new float color
    +291         * @param light      -1f to 1f, the light/brightness change that can be applied to the new float color
    +292         * @param opacity    -1f to 1f, the opacity/alpha change that can be applied to the new float color
    +293         * @return a float encoding a variation of basis with the given changes
    +294         */
    +295        public static float toEditedFloat(float basis, float hue, float saturation, float light, float opacity) {
    +296                final int decoded = BitConversion.floatToRawIntBits(basis);
    +297                opacity = Math.min(Math.max(opacity + (decoded >>> 25) * (1f / 127f), 0f), 1f);
    +298                final float r = (decoded & 0xff) / 255f;
    +299                final float g = (decoded >>> 8 & 0xff) / 255f;
    +300                final float b = (decoded >>> 16 & 0xff) / 255f;
    +301                float x, y, z, w;
    +302                if(g < b) {
    +303                        x = b;
    +304                        y = g;
    +305                        z = -1f;
    +306                        w = 2f / 3f;
    +307                }
    +308                else {
    +309                        x = g;
    +310                        y = b;
    +311                        z = 0f;
    +312                        w = -1f / 3f;
    +313                }
    +314                if(r < x) {
    +315                        z = w;
    +316                        w = r;
    +317                }
    +318                else {
    +319                        w = x;
    +320                        x = r;
    +321                }
    +322                final float d = x - Math.min(w, y);
    +323                final float lum = x * (1f - 0.5f * d / (x + 1e-10f));
    +324                hue += Math.abs(z + (w - y) / (6f * d + 1e-10f)) + 1f;
    +325                saturation += (x - lum) / (Math.min(lum, 1f - lum) + 1e-10f);
    +326                return FloatColors.hsl2rgb(hue - (int)hue, Math.min(Math.max(saturation, 0f), 1f), Math.min(Math.max(lum + light, 0f), 1f), opacity);
    +327        }
    +328
    +329        /**
    +330         * Interpolates from the packed float color start towards white by change. While change should be between 0f (return
    +331         * start as-is) and 1f (return white), start should be a packed color, as from
    +332         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +333         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +334         * white. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    +335         * @see #darken(float, float) the counterpart method that darkens a float color
    +336         * @param start the starting color as a packed float
    +337         * @param change how much to go from start toward white, as a float between 0 and 1; higher means closer to white
    +338         * @return a packed float that represents a color between start and white
    +339         */
    +340        public static float lighten(final float start, final float change) {
    +341                final int s = BitConversion.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    +342                                a = s & 0xFE000000;
    +343                return BitConversion.intBitsToFloat(
    +344                                ((int) (r + (0xFF - r) * change) & 0xFF) |
    +345                                ((int) (g + (0xFF - g) * change) & 0xFF) << 8 |
    +346                                ((int) (b + (0xFF - b) * change) & 0xFF) << 16 |
    +347                                a);
    +348        }
    +349
    +350        /**
    +351         * Interpolates from the packed float color start towards black by change. While change should be between 0f (return
    +352         * start as-is) and 1f (return black), start should be a packed color, as from
    +353         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +354         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +355         * black. Unlike {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the alpha and both chroma of start as-is.
    +356         * @see #lighten(float, float) the counterpart method that lightens a float color
    +357         * @param start the starting color as a packed float
    +358         * @param change how much to go from start toward black, as a float between 0 and 1; higher means closer to black
    +359         * @return a packed float that represents a color between start and black
    +360         */
    +361        public static float darken(final float start, final float change) {
    +362                final int s = BitConversion.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    +363                                a = s & 0xFE000000;
    +364                return BitConversion.intBitsToFloat(
    +365                                ((int) (r * (1f - change)) & 0xFF) |
    +366                                ((int) (g * (1f - change)) & 0xFF) << 8 |
    +367                                ((int) (b * (1f - change)) & 0xFF) << 16 |
    +368                                a);
    +369        }
    +370
    +371        /**
    +372         * Brings the chromatic components of {@code start} closer to grayscale by {@code change} (desaturating them). While
    +373         * change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as
    +374         * from {@link #rgb(float, float, float, float)}. This leaves alpha alone, unlike
    +375         * {@link #lessenChange(float, float)}, which usually changes Y.
    +376         * <br>
    +377         * <a href="http://www.graficaobscura.com/matrix/index.html">The algorithm used is from here</a>.
    +378         * @see #enrich(float, float) the counterpart method that makes a float color more saturated
    +379         * @param start the starting color as a packed float
    +380         * @param change how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result
    +381         * @return a packed float that represents a color between start and a desaturated color
    +382         */
    +383        public static float dullen(final float start, final float change) {
    +384                final float rc = 0.32627f, gc = 0.3678f, bc = 0.30593001f;
    +385                final int s = BitConversion.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    +386                                a = s & 0xFE000000;
    +387                final float ch = 1f - change, rw = change * rc, gw = change * gc, bw = change * bc;
    +388                return BitConversion.intBitsToFloat(
    +389                                (int) Math.min(Math.max(r * (rw+ch) + g * rw + b * rw, 0), 255) |
    +390                                                (int) Math.min(Math.max(r * gw + g * (gw+ch) + b * gw, 0), 255) << 8 |
    +391                                                (int) Math.min(Math.max(r * bw + g * bw + b * (bw+ch), 0), 255) << 16 |
    +392                                                a);
    +393        }
    +394
    +395        /**
    +396         * Pushes the chromatic components of {@code start} away from grayscale by change (saturating them). While change
    +397         * should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as
    +398         * from {@link #rgb(float, float, float, float)}.
    +399         * <br>
    +400         * <a href="http://www.graficaobscura.com/matrix/index.html">The algorithm used is from here</a>.
    +401         * @see #dullen(float, float) the counterpart method that makes a float color less saturated
    +402         * @param start the starting color as a packed float
    +403         * @param change how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result
    +404         * @return a packed float that represents a color between start and a saturated color
    +405         */
    +406        public static float enrich(final float start, final float change) {
    +407                final float rc = 0.32627f, gc = 0.3678f, bc = 0.30593001f;
    +408                final int s = BitConversion.floatToRawIntBits(start), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    +409                                a = s & 0xFE000000;
    +410                final float ch = 1f + change, rw = (-change) * rc, gw = (-change) * gc, bw = (-change) * bc;
    +411                return BitConversion.intBitsToFloat(
    +412                                (int) Math.min(Math.max(r * (rw+ch) + g * rw + b * rw, 0), 255) |
    +413                                                (int) Math.min(Math.max(r * gw + g * (gw+ch) + b * gw, 0), 255) << 8 |
    +414                                                (int) Math.min(Math.max(r * bw + g * bw + b * (bw+ch), 0), 255) << 16 |
    +415                                                a);
    +416        }
    +417
    +418        /**
    +419         * Interpolates from the packed float color start to increase its red channel by change.
    +420         * While change must be between 0f (return start as-is) and 1f (return maximum red), start should be a packed
    +421         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +422         * Colors, and is a little more efficient and clear than using
    +423         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more-red color. Unlike
    +424         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
    +425         * @see #lowerB(float, float) the counterpart method that makes a float color less red
    +426         * @param start the starting color as a packed float
    +427         * @param change how much to change start to a more-red color, as a float between 0 and 1; higher means more red
    +428         * @return a packed float that represents a color between start and a more red color
    +429         */
    +430        public static float raiseR(final float start, final float change) {
    +431                final int s = BitConversion.floatToRawIntBits(start), t = s & 0xFF, other = s & 0xFEFFFF00;
    +432                return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) & 0xFF) | other);
    +433        }
    +434
    +435        /**
    +436         * Interpolates from the packed float color start to decrease its red channel by change.
    +437         * While change must be between 0f (return start as-is) and 1f (return minimum red), start should be a packed
    +438         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +439         * Colors, and is a little more efficient and clear than using
    +440         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a less-red color. Unlike
    +441         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
    +442         * @see #raiseB(float, float) the counterpart method that makes a float color more red
    +443         * @param start the starting color as a packed float
    +444         * @param change how much to change start to a less-red color, as a float between 0 and 1; higher means less red
    +445         * @return a packed float that represents a color between start and a less red color
    +446         */
    +447        public static float lowerR(final float start, final float change) {
    +448                final int s = BitConversion.floatToRawIntBits(start), t = s & 0xFF, other = s & 0xFEFFFF00;
    +449                return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) | other);
    +450        }
    +451
    +452        /**
    +453         * Interpolates from the packed float color start to increase its green channel by change.
    +454         * While change must be between 0f (return start as-is) and 1f (return maximum green), start should be a packed
    +455         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +456         * Colors, and is a little more efficient and clear than using
    +457         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more-green color. Unlike
    +458         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
    +459         * @see #lowerB(float, float) the counterpart method that makes a float color less green
    +460         * @param start the starting color as a packed float
    +461         * @param change how much to change start to a more-green color, as a float between 0 and 1; higher means more green
    +462         * @return a packed float that represents a color between start and a more green color
    +463         */
    +464        public static float raiseG(final float start, final float change) {
    +465                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +466                return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 8 & 0xFF00) | other);
    +467        }
    +468
    +469        /**
    +470         * Interpolates from the packed float color start to decrease its green channel by change.
    +471         * While change must be between 0f (return start as-is) and 1f (return minimum green), start should be a packed
    +472         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +473         * Colors, and is a little more efficient and clear than using
    +474         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a less-green color. Unlike
    +475         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
    +476         * @see #raiseB(float, float) the counterpart method that makes a float color more green
    +477         * @param start the starting color as a packed float
    +478         * @param change how much to change start to a less-green color, as a float between 0 and 1; higher means less green
    +479         * @return a packed float that represents a color between start and a less green color
    +480         */
    +481        public static float lowerG(final float start, final float change) {
    +482                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 8 & 0xFF, other = s & 0xFEFF00FF;
    +483                return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 8 | other);
    +484        }
    +485
    +486        /**
    +487         * Interpolates from the packed float color start to increase its blue channel by change.
    +488         * While change must be between 0f (return start as-is) and 1f (return maximum blue), start should be a packed
    +489         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +490         * Colors, and is a little more efficient and clear than using
    +491         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a more-blue color. Unlike
    +492         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
    +493         * @see #lowerB(float, float) the counterpart method that makes a float color less blue
    +494         * @param start the starting color as a packed float
    +495         * @param change how much to change start to a more-blue color, as a float between 0 and 1; higher means more blue
    +496         * @return a packed float that represents a color between start and a more blue color
    +497         */
    +498        public static float raiseB(final float start, final float change) {
    +499                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +500                return BitConversion.intBitsToFloat(((int) (t + (0xFF - t) * change) << 16 & 0xFF0000) | other);
    +501        }
    +502
    +503        /**
    +504         * Interpolates from the packed float color start to decrease its blue channel by change.
    +505         * While change must be between 0f (return start as-is) and 1f (return minimum blue), start should be a packed
    +506         * color, as from {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary
    +507         * Colors, and is a little more efficient and clear than using
    +508         * {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards a less-blue color. Unlike
    +509         * {@link FloatColors#lerpFloatColors(float, float, float)}, this keeps the other channels of start as-is.
    +510         * @see #raiseB(float, float) the counterpart method that makes a float color more blue
    +511         * @param start the starting color as a packed float
    +512         * @param change how much to change start to a less-blue color, as a float between 0 and 1; higher means less blue
    +513         * @return a packed float that represents a color between start and a less blue color
    +514         */
    +515        public static float lowerB(final float start, final float change) {
    +516                final int s = BitConversion.floatToRawIntBits(start), t = s >>> 16 & 0xFF, other = s & 0xFE00FFFF;
    +517                return BitConversion.intBitsToFloat(((int) (t * (1f - change)) & 0xFF) << 16 | other);
    +518        }
    +519
    +520        /**
    +521         * Interpolates from the packed float color start towards that color made opaque by change. While change should be
    +522         * between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from
    +523         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors, and
    +524         * is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +525         * transparent. This won't change the intensity, protan, or tritan of the color.
    +526         * @see #fade(float, float) the counterpart method that makes a float color more translucent
    +527         * @param start the starting color as a packed float
    +528         * @param change how much to go from start toward opaque, as a float between 0 and 1; higher means closer to opaque
    +529         * @return a packed float that represents a color between start and its opaque version
    +530         */
    +531        public static float blot(final float start, final float change) {
    +532                final int s = BitConversion.floatToRawIntBits(start), opacity = s >>> 24 & 0xFE, other = s & 0x00FFFFFF;
    +533                return BitConversion.intBitsToFloat(((int) (opacity + (0xFE - opacity) * change) & 0xFE) << 24 | other);
    +534        }
    +535
    +536        /**
    +537         * Interpolates from the packed float color start towards transparent by change. While change should be between 0
    +538         * (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from
    +539         * {@link #rgb(float, float, float, float)}. This is a good way to reduce allocations of temporary Colors,
    +540         * and is a little more efficient and clear than using {@link FloatColors#lerpFloatColors(float, float, float)} to lerp towards
    +541         * transparent. This won't change the intensity, protan, or tritan of the color.
    +542         * @see #blot(float, float) the counterpart method that makes a float color more opaque
    +543         * @param start the starting color as a packed float
    +544         * @param change how much to go from start toward transparent, as a float between 0 and 1; higher means closer to transparent
    +545         * @return a packed float that represents a color between start and transparent
    +546         */
    +547        public static float fade(final float start, final float change) {
    +548                final int s = BitConversion.floatToRawIntBits(start), opacity = s & 0xFE, other = s & 0x00FFFFFF;
    +549                return BitConversion.intBitsToFloat(((int) (opacity * (1f - change)) & 0xFE) << 24 | other);
    +550        }
    +551
    +552        /**
    +553         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast with,
    +554         * gets a packed float RGBA color with roughly inverted lightness (how the Oklab color space interprets it), but the
    +555         * same general hue and saturation unless the lightness gets too close to white or black. This won't ever produce
    +556         * black or other very dark colors, and also has a gap in the range it produces for lightness values between 0.5 and
    +557         * 0.55. That allows most of the colors this method produces to contrast well as a foreground when displayed on a
    +558         * background of {@code contrastingColor}, or vice versa. This will leave the lightness unchanged if the
    +559         * hue/saturation of the contrastingColor and those of the mainColor are already very different. This has nothing to
    +560         * do with the contrast channel of the tweak in ColorfulBatch; where that part of the tweak can make too-similar
    +561         * lightness values further apart by just a little, this makes a modification on {@code mainColor} to maximize its
    +562         * lightness difference from {@code contrastingColor} without losing its other qualities.
    +563         * @param mainColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; this is the color that will be adjusted
    +564         * @param contrastingColor a packed float color, as produced by {@link #rgb(float, float, float, float)}; the adjusted mainColor will contrast with this
    +565         * @return a different RGBA packed float color, based on mainColor but with potentially very different lightness
    +566         */
    +567        public static float inverseLightness(final float mainColor, final float contrastingColor)
    +568        {
    +569                return com.github.tommyettinger.colorful.pure.oklab.ColorTools.toRGBA(
    +570                                com.github.tommyettinger.colorful.pure.oklab.ColorTools.inverseLightness(
    +571                                                com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(mainColor),
    +572                                                com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(contrastingColor)));
    +573        }
    +574
    +575        /**
    +576         * Given a packed float RGBA color {@code mainColor} and another RGBA color that it should be made to contrast
    +577         * with, gets a packed float RGBA color with lightness that should be quite different from
    +578         * {@code contrastingColor}'s lightness, but the same chromatic channels and opacity. This allows most of the colors
    +579         * this method produces to contrast well as a foreground when displayed on a background of {@code contrastingColor},
    +580         * or vice versa. This goes through Oklab as an intermediate step, so lightness is in terms of Oklab's L channel.
    +581         * <br>
    +582         * This is similar to {@link #inverseLightness(float, float)}, but is considerably simpler, and this method will
    +583         * change the lightness of mainColor when the two given colors have close lightness but distant chroma. Because it
    +584         * averages the original lightness of mainColor with the modified one, this tends to produce softer color changes.
    +585         * @param mainColor a packed RGBA float color; this is the color that will be adjusted
    +586         * @param contrastingColor a packed RGBA float color; the adjusted mainColor will contrast with the lightness of this
    +587         * @return a different packed RGBA float color, based on mainColor but typically with different lightness
    +588         */
    +589        public static float differentiateLightness(final float mainColor, final float contrastingColor)
    +590        {
    +591                final int main = BitConversion.floatToRawIntBits(com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(mainColor)),
    +592                                contrast = BitConversion.floatToRawIntBits(com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(contrastingColor));
    +593                return com.github.tommyettinger.colorful.pure.oklab.ColorTools.toRGBA(BitConversion.intBitsToFloat((main & 0xFEFFFF00) | (contrast + 128 & 0xFF) + (main & 0xFF) >>> 1));
    +594        }
    +595
    +596        /**
    +597         * Pretty simple; adds 0.5 to the given color's lightness (calculated by converting it to Oklab internally) and
    +598         * wraps it around if it would go above 1.0, then averages that with the original lightness. This means light colors
    +599         * become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    +600         * @param mainColor a packed RGBA float color
    +601         * @return a different packed RGBA float color, with its lightness channel changed and limited to the correct gamut
    +602         */
    +603        public static float offsetLightness(final float mainColor) {
    +604                final int oklab = BitConversion.floatToRawIntBits(mainColor);
    +605                return com.github.tommyettinger.colorful.pure.oklab.ColorTools.toRGBA(BitConversion.intBitsToFloat((oklab & 0xFEFFFF00) | (oklab + 128 & 0xFF) + (oklab & 0xFF) >>> 1));
    +606        }
    +607
    +608
    +609        /**
    +610         * Makes the additive RGBA color stored in {@code color} cause less of a change when used as a tint, as if it were
    +611         * mixed with neutral gray. When {@code fraction} is 1.0, this returns color unchanged; when fraction is 0.0, it
    +612         * returns {@link Palette#GRAY}, and when it is in-between 0.0 and 1.0 it returns something between the two. This is
    +613         * meant for things like area of effect abilities that make smaller color changes toward their periphery.
    +614         * @param color a color that should have its tinting effect potentially weakened
    +615         * @param fraction how much of {@code color} should be kept, from 0.0 to 1.0
    +616         * @return an RGBA float color between gray and {@code color}
    +617         */
    +618        public static float lessenChange(final float color, float fraction) {
    +619                final int e = BitConversion.floatToRawIntBits(color),
    +620                                rs = 0x80, gs = 0x80, bs = 0x80,
    +621                                re = (e & 0xFF), ge = (e >>> 8) & 0xFF, be = (e >>> 16) & 0xFF, ae = e >>> 24 & 0xFE;
    +622                return BitConversion.intBitsToFloat(
    +623                                  ((int) (rs + fraction * (re - rs)) & 0xFF)
    +624                                | ((int) (gs + fraction * (ge - gs)) & 0xFF) << 8
    +625                                | ((int) (bs + fraction * (be - bs)) & 0xFF) << 16
    +626                                                  | ae << 24);
    +627        }
    +628
    +629        /**
    +630         * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by adding the corresponding
    +631         * "add" parameter and then clamping. Each value is considered in the 0 to 1 range. This returns a different float
    +632         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
    +633         * you want to stay unchanged.
    +634         * @param encoded a packed float RGB color
    +635         * @param addR how much to add to the R channel; typically in the -1 to 1 range
    +636         * @param addG how much to add to the G channel; typically in the -1 to 1 range
    +637         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    +638         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +639         * @return a packed float RGB color with the requested edits applied to {@code encoded}
    +640         */
    +641        public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha){
    +642                return editRGB(encoded, addR, addG, addB, addAlpha, 1f, 1f, 1f, 1f);
    +643        }
    +644
    +645        /**
    +646         * Given a packed float RGB color, this edits its red, green, blue, and alpha channels by first multiplying each
    +647         * channel by the corresponding "mul" parameter and then adding the corresponding "add" parameter, before clamping.
    +648         * This means the red value {@code R} (which is considered in the 0 to 1 range) is multiplied by {@code mulR}, then
    +649         * has {@code addR} added, and then is clamped to the normal range for R (0 to 1). This returns a different float
    +650         * value (of course, the given float can't be edited in-place). You can give a value of 0 for any "add" parameter
    +651         * you want to stay unchanged, or a value of 1 for any "mul" parameter that shouldn't change.
    +652         * @param encoded a packed float RGB color
    +653         * @param addR how much to add to the R channel; typically in the -1 to 1 range
    +654         * @param addG how much to add to the G channel; typically in the -1 to 1 range
    +655         * @param addB how much to add to the B channel; typically in the -1 to 1 range
    +656         * @param addAlpha how much to add to the alpha channel; typically in the -1 to 1 range
    +657         * @param mulR how much to multiply the R channel by; should be non-negative
    +658         * @param mulG how much to multiply the G channel by; should be non-negative
    +659         * @param mulB how much to multiply the B channel by; should be non-negative
    +660         * @param mulAlpha how much to multiply the alpha channel by; should be non-negative
    +661         * @return a packed float RGB color with the requested edits applied to {@code encoded}
    +662         */
    +663        public static float editRGB(float encoded, float addR, float addG, float addB, float addAlpha,
    +664                                                                float mulR, float mulG, float mulB, float mulAlpha){
    +665                final int s = BitConversion.floatToRawIntBits(encoded), r = s & 0xFF, g = s >>> 8 & 0xFF, b = s >>> 16 & 0xFF,
    +666                                a = s >>> 25;
    +667                return BitConversion.intBitsToFloat(
    +668                                Math.max(0, Math.min(255, (int) (r * mulR + addR * 255.999f))) |
    +669                                                Math.max(0, Math.min(255, (int) (g * mulG + addG * 255.999f))) << 8 |
    +670                                                Math.max(0, Math.min(255, (int) (b * mulB + addB * 255.999f))) << 16 |
    +671                                                Math.max(0, Math.min(127, (int) (a * mulAlpha + addAlpha * 127.999f))) << 25);
    +672        }
    +673        
    +674        /**
    +675         * Makes a quasi-randomly-edited variant on the given {@code color}, allowing typically a small amount of
    +676         * {@code variance} (such as 0.05 to 0.25) between the given color and what this can return. The {@code seed} should
    +677         * be different each time this is called, and can be obtained from a random number generator to make the colors more
    +678         * random, or can be incremented on each call. If the seed is only incremented or decremented, then this shouldn't
    +679         * produce two similar colors in a row unless variance is very small. The variance affects the R, G, and B of the
    +680         * generated color equally, and each of those channels can go up or down by the given variance as long as the total
    +681         * distance isn't greater than the variance.
    +682         * @param color a packed float color, as produced by {@link #rgb(float, float, float, float)}
    +683         * @param seed a long seed that should be different on each call; should not be 0
    +684         * @param variance max amount of difference between the given color and the generated color; always less than 1
    +685         * @return a generated packed float color that should be at least somewhat different from {@code color}
    +686         */
    +687        public static float randomEdit(final float color, long seed, final float variance) {
    +688                final int decoded = BitConversion.floatToRawIntBits(color);
    +689                final float r = (decoded & 0xff) / 255f;
    +690                final float g = (decoded >>> 8 & 0xff) / 255f;
    +691                final float b = (decoded >>> 16 & 0xff) / 255f;
    +692                final float limit = variance * variance;
    +693                float dist, x, y, z;
    +694                for (int j = 0; j < 50; j++) {
    +695                        x = (((seed * 0xD1B54A32D192ED03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +696                        y = (((seed * 0xABC98388FB8FAC03L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +697                        z = (((seed * 0x8CB92BA72F3D8DD7L >>> 41) - 0x7FFFFFp-1f) * 0x1p-22f) * variance;
    +698                        seed += 0x9E3779B97F4A7C15L;
    +699                        dist = x * x + y * y + z * z;
    +700                        x += r;
    +701                        y += g;
    +702                        z += b;
    +703                        if(dist <= limit)
    +704                                return BitConversion.intBitsToFloat((decoded & 0xFE000000) | ((int)(z * 255.999f) << 16 & 0xFF0000)
    +705                                        | ((int)(y * 255.999f) << 8 & 0xFF00) | (int)(x * 255.999f));
    +706                }
    +707                return color;
    +708        }
    +709
    +710        /**
    +711         * Produces a random packed float color that is always opaque and should be uniformly distributed.
    +712         * @param random a Random object (or preferably a subclass of Random, like {@link com.github.tommyettinger.random.LaserRandom})
    +713         * @return a packed float color that is always opaque
    +714         */
    +715        public static float randomColor(Random random) {
    +716                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    +717                return BitConversion.intBitsToFloat(0xFE000000
    +718                                | ((int) (b * 256f) << 16 & 0xFF0000)
    +719                                | ((int) (g * 256f) << 8 & 0xFF00)
    +720                                | ((int) (r * 256f) & 0xFF));
    +721        }
    +722
    +723        /**
    +724         * Produces a random packed float color that is always opaque and should be uniformly distributed.
    +725         * This is named differently from {@link #randomColor(Random)} to avoid confusion when a class both extends Random
    +726         * and EnhancedRandom.
    +727         * @param random any subclass of juniper's EnhancedRandom, such as a
    +728         * {@link com.github.tommyettinger.random.DistinctRandom} or
    +729         * {@link com.github.tommyettinger.random.FourWheelRandom}
    +730         * @return a packed float color that is always in-gamut
    +731         */
    +732        public static float randomizedColor(EnhancedRandom random) {
    +733                final float r = random.nextFloat(), g = random.nextFloat(), b = random.nextFloat();
    +734                return BitConversion.intBitsToFloat(0xFE000000
    +735                                | ((int) (b * 256f) << 16 & 0xFF0000)
    +736                                | ((int) (g * 256f) << 8 & 0xFF00)
    +737                                | ((int) (r * 256f) & 0xFF));
    +738        }
    +739
    +740        /**
    +741         * Limited-use; like {@link #randomColor(Random)} but for cases where you already have three floats (r, g, and b)
    +742         * distributed how you want. This can be somewhat useful if you are using a "subrandom" or "quasi-random" sequence,
    +743         * like the Halton, Sobol, or R3 sequences, to get 3D points and map them to colors. It can also be useful if you
    +744         * want to randomly generate the RGB channels yourself and track the values produced, as you would if you wanted to
    +745         * avoid generating too many colors with high blue, for instance.
    +746         * @param r red value to use; will be clamped between 0 and 1
    +747         * @param g green value to use; will be clamped between 0 and 1
    +748         * @param b blue value to use; will be clamped between 0 and 1
    +749         * @return a packed float color that is always opaque
    +750         */
    +751        public static float subrandomColor(float r, float g, float b) {
    +752                return BitConversion.intBitsToFloat(0xFE000000
    +753                                | ((int) Math.min(Math.max(b * 256f, 0), 255.999f) << 16 & 0xFF0000)
    +754                                | ((int) Math.min(Math.max(g * 256f, 0), 255.999f) << 8 & 0xFF00)
    +755                                | ((int) Math.min(Math.max(r * 256f, 0), 255.999f) & 0xFF));
    +756        }
    +757}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/GradientTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/GradientTools.html
    index a8ab62b9..ee8a508f 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/GradientTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/GradientTools.html
    @@ -14,242 +14,243 @@
     
    001package com.github.tommyettinger.colorful.pure.rgb;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.Interpolation;
    -005import com.github.tommyettinger.colorful.pure.MathTools;
    -006import com.github.tommyettinger.ds.FloatList;
    -007
    -008/**
    -009 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    -010 * The intent is for the FloatList to be used as a sequence of packed float RGB colors. You can create a new
    -011 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    -012 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    -013 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    -014 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    -015 * than two colors. You can also customize each section between colors with
    -016 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    -017 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    -018 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    -019 */
    -020public class GradientTools {
    -021    /**
    -022     * No need to instantiate.
    -023     */
    -024    private GradientTools(){
    -025    }
    -026
    -027    /**
    -028     * Creates a FloatList gradient from the packed float RGB color {@code start} to the packed float RGB color
    -029     * {@code end}, taking the specified number of steps and using linear interpolation.
    -030     * @param start the packed float RGB color to start with
    -031     * @param end the packed float RGB color to end on
    -032     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -033     * @return a new FloatList that contains the requested gradient
    -034     */
    -035    public static FloatList makeGradient(float start, float end, int steps) {
    -036        return makeGradient(start, end, steps, Interpolation.linear);
    -037    }
    -038    /**
    -039     * Creates a FloatList gradient from the packed float RGB color {@code start} to the packed float RGB color
    -040     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -041     * @param start the packed float RGB color to start with
    -042     * @param end the packed float RGB color to end on
    -043     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -044     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -045     * @return a new FloatList that contains the requested gradient
    -046     */
    -047    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    -048        FloatList appending = new FloatList(steps);
    -049        if(steps <= 0) {
    -050            return appending;
    -051        }
    -052        if(steps == 1) {
    -053            appending.add(start);
    -054            return appending;
    -055        }
    -056        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -057        return appending;
    -058    }
    -059
    -060    /**
    -061     * Appends a gradient from the packed float RGB color {@code start} to the packed float RGB color {@code end},
    -062     * taking the specified number of steps and using linear Interpolation for how it transitions.
    -063     * @param appending a FloatList that will be appended to
    -064     * @param start the packed float RGB color to start with
    -065     * @param end the packed float RGB color to end on
    -066     * @param steps how many steps the gradient should use; usually greater than 2
    -067     * @return {@code appending}, after adding the gradient to the end
    -068     */
    -069    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    -070        return appendGradient(appending, start, end, steps, Interpolation.linear);
    -071    }
    -072    /**
    -073     * Appends a gradient from the packed float RGB color {@code start} to the packed float RGB color {@code end},
    -074     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    -075     * @param appending a FloatList that will be appended to
    -076     * @param start the packed float RGB color to start with
    -077     * @param end the packed float RGB color to end on
    -078     * @param steps how many steps the gradient should use; usually greater than 2
    -079     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -080     * @return {@code appending}, after adding the gradient to the end
    -081     */
    -082    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    -083        if(appending == null)
    -084            return null;
    -085        if(steps <= 0) {
    -086            return appending;
    -087        }
    -088        if(steps == 1) {
    -089            appending.add(start);
    -090            return appending;
    -091        }
    -092        appending.ensureCapacity(steps);
    -093        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -094        return appending;
    -095    }
    -096
    -097    /**
    -098     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses linear
    -099     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -100     * {@code steps} colors.
    -101     * @param appending a FloatList that will be appended to
    -102     * @param steps how many steps the gradient should use; usually greater than 2
    -103     * @param chain an array or varargs of packed float RGB colors that this will interpolate through in order
    -104     * @return {@code appending}, after adding the gradient to the end
    -105     */
    -106    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    -107        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -108    }
    -109
    -110    /**
    -111     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses linear
    -112     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -113     * {@code steps} colors.
    -114     * @param appending a FloatList that will be appended to
    -115     * @param steps how many steps the gradient should use; usually greater than 2
    -116     * @param chain a FloatList of packed float RGB colors that this will interpolate through in order
    -117     * @return {@code appending}, after adding the gradient to the end
    -118     */
    -119    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    -120        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -121    }
    -122
    -123    /**
    -124     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses the specified
    -125     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -126     * end of {@code appending} and produces a total of {@code steps} colors.
    -127     * @param appending a FloatList that will be appended to
    -128     * @param steps how many steps the gradient should use; usually greater than 2
    -129     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -130     * @param chain a FloatList of packed float RGB colors that this will interpolate through in order
    -131     * @return {@code appending}, after adding the gradient to the end
    -132     */
    -133    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    -134        if (appending == null)
    -135            return null;
    -136        if(chain == null)
    -137            return appending;
    -138        if (steps <= 0 || chain.size() == 0) {
    -139            return appending;
    -140        }
    -141        if (steps == 1 || chain.size() == 1) {
    -142            appending.add(chain.first());
    -143            return appending;
    -144        }
    -145        appending.ensureCapacity(steps);
    -146        int limit = steps - 1, splits = chain.size() - 1;
    -147        float step = 1f / steps, change = 0f;
    -148        for (int i = 0; i < limit; i++) {
    -149            float interp = interpolation.apply(change);
    -150            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -151            int idx = (int)splint;
    -152            appending.add(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    -153            change += step;
    -154        }
    -155        appending.add(chain.get(splits));
    -156        return appending;
    -157    }
    -158
    -159    /**
    -160     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses the specified
    -161     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -162     * end of {@code appending} and produces a total of {@code steps} colors.
    -163     * @param appending a FloatList that will be appended to
    -164     * @param steps how many steps the gradient should use; usually greater than 2
    -165     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -166     * @param chain an array or varargs of packed float RGB colors that this will interpolate through in order
    -167     * @return {@code appending}, after adding the gradient to the end
    -168     */
    -169    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    -170        if (appending == null)
    -171            return null;
    -172        if(chain == null)
    -173            return appending;
    -174        if (steps <= 0 || chain.length == 0) {
    -175            return appending;
    -176        }
    -177        if (steps == 1 || chain.length == 1) {
    -178            appending.add(chain[0]);
    -179            return appending;
    -180        }
    -181        appending.ensureCapacity(steps);
    -182        int limit = steps - 1, splits = chain.length - 1;
    -183        float step = 1f / steps, change = 0f;
    -184        for (int i = 0; i < limit; i++) {
    -185            float interp = interpolation.apply(change);
    -186            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -187            int idx = (int)splint;
    -188            appending.add(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    -189            change += step;
    -190        }
    -191        appending.add(chain[splits]);
    -192        return appending;
    -193    }
    -194
    -195    /**
    -196     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    -197     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -198     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -199     * number of steps, it just doesn't append {@code end} in the last step.
    -200     * @param appending a FloatList that will be appended to
    -201     * @param start the packed float RGB color to start with
    -202     * @param end the packed float RGB color to end just before
    -203     * @param steps how many steps the gradient should use; usually greater than 2
    -204     * @return {@code appending}, after adding the gradient to its end
    -205     */
    -206    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    -207        return appendPartialGradient(appending, start, end, steps, Interpolation.linear);
    -208    }
    -209    /**
    -210     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    -211     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -212     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -213     * number of steps, it just doesn't append {@code end} in the last step.
    -214     * @param appending a FloatList that will be appended to
    -215     * @param start the packed float RGB color to start with
    -216     * @param end the packed float RGB color to end just before
    -217     * @param steps how many steps the gradient should use; usually greater than 2
    -218     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    -219     * @return {@code appending}, after adding the gradient to its end
    -220     */
    -221    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    -222        if(appending == null)
    -223            return null;
    -224        if(steps <= 0) {
    -225            return appending;
    -226        }
    -227        if(steps == 1) {
    -228            appending.add(start);
    -229            return appending;
    -230        }
    -231        int limit = steps;
    -232        float step = 1f / steps, change = 0f;
    -233        for (int i = 0; i < limit; i++) {
    -234            appending.add(FloatColors.lerpFloatColors(start, end, interpolation.apply(change)));
    -235            change += step;
    -236        }
    -237        return appending;
    -238    }
    -239}
    +004import com.github.tommyettinger.colorful.pure.Interpolations;
    +005import com.github.tommyettinger.colorful.pure.Interpolations.Interpolation;
    +006import com.github.tommyettinger.colorful.pure.MathTools;
    +007import com.github.tommyettinger.ds.FloatList;
    +008
    +009/**
    +010 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    +011 * The intent is for the FloatList to be used as a sequence of packed float RGB colors. You can create a new
    +012 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    +013 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    +014 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    +015 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    +016 * than two colors. You can also customize each section between colors with
    +017 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    +018 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    +019 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    +020 */
    +021public class GradientTools {
    +022    /**
    +023     * No need to instantiate.
    +024     */
    +025    private GradientTools(){
    +026    }
    +027
    +028    /**
    +029     * Creates a FloatList gradient from the packed float RGB color {@code start} to the packed float RGB color
    +030     * {@code end}, taking the specified number of steps and using linear interpolation.
    +031     * @param start the packed float RGB color to start with
    +032     * @param end the packed float RGB color to end on
    +033     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +034     * @return a new FloatList that contains the requested gradient
    +035     */
    +036    public static FloatList makeGradient(float start, float end, int steps) {
    +037        return makeGradient(start, end, steps, Interpolations.linear);
    +038    }
    +039    /**
    +040     * Creates a FloatList gradient from the packed float RGB color {@code start} to the packed float RGB color
    +041     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    +042     * @param start the packed float RGB color to start with
    +043     * @param end the packed float RGB color to end on
    +044     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +045     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +046     * @return a new FloatList that contains the requested gradient
    +047     */
    +048    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    +049        FloatList appending = new FloatList(steps);
    +050        if(steps <= 0) {
    +051            return appending;
    +052        }
    +053        if(steps == 1) {
    +054            appending.add(start);
    +055            return appending;
    +056        }
    +057        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +058        return appending;
    +059    }
    +060
    +061    /**
    +062     * Appends a gradient from the packed float RGB color {@code start} to the packed float RGB color {@code end},
    +063     * taking the specified number of steps and using linear Interpolation for how it transitions.
    +064     * @param appending a FloatList that will be appended to
    +065     * @param start the packed float RGB color to start with
    +066     * @param end the packed float RGB color to end on
    +067     * @param steps how many steps the gradient should use; usually greater than 2
    +068     * @return {@code appending}, after adding the gradient to the end
    +069     */
    +070    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    +071        return appendGradient(appending, start, end, steps, Interpolations.linear);
    +072    }
    +073    /**
    +074     * Appends a gradient from the packed float RGB color {@code start} to the packed float RGB color {@code end},
    +075     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    +076     * @param appending a FloatList that will be appended to
    +077     * @param start the packed float RGB color to start with
    +078     * @param end the packed float RGB color to end on
    +079     * @param steps how many steps the gradient should use; usually greater than 2
    +080     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +081     * @return {@code appending}, after adding the gradient to the end
    +082     */
    +083    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    +084        if(appending == null)
    +085            return null;
    +086        if(steps <= 0) {
    +087            return appending;
    +088        }
    +089        if(steps == 1) {
    +090            appending.add(start);
    +091            return appending;
    +092        }
    +093        appending.ensureCapacity(steps);
    +094        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +095        return appending;
    +096    }
    +097
    +098    /**
    +099     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses linear
    +100     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +101     * {@code steps} colors.
    +102     * @param appending a FloatList that will be appended to
    +103     * @param steps how many steps the gradient should use; usually greater than 2
    +104     * @param chain an array or varargs of packed float RGB colors that this will interpolate through in order
    +105     * @return {@code appending}, after adding the gradient to the end
    +106     */
    +107    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    +108        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +109    }
    +110
    +111    /**
    +112     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses linear
    +113     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +114     * {@code steps} colors.
    +115     * @param appending a FloatList that will be appended to
    +116     * @param steps how many steps the gradient should use; usually greater than 2
    +117     * @param chain a FloatList of packed float RGB colors that this will interpolate through in order
    +118     * @return {@code appending}, after adding the gradient to the end
    +119     */
    +120    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    +121        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +122    }
    +123
    +124    /**
    +125     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses the specified
    +126     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +127     * end of {@code appending} and produces a total of {@code steps} colors.
    +128     * @param appending a FloatList that will be appended to
    +129     * @param steps how many steps the gradient should use; usually greater than 2
    +130     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +131     * @param chain a FloatList of packed float RGB colors that this will interpolate through in order
    +132     * @return {@code appending}, after adding the gradient to the end
    +133     */
    +134    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    +135        if (appending == null)
    +136            return null;
    +137        if(chain == null)
    +138            return appending;
    +139        if (steps <= 0 || chain.size() == 0) {
    +140            return appending;
    +141        }
    +142        if (steps == 1 || chain.size() == 1) {
    +143            appending.add(chain.first());
    +144            return appending;
    +145        }
    +146        appending.ensureCapacity(steps);
    +147        int limit = steps - 1, splits = chain.size() - 1;
    +148        float step = 1f / steps, change = 0f;
    +149        for (int i = 0; i < limit; i++) {
    +150            float interp = interpolation.apply(change);
    +151            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +152            int idx = (int)splint;
    +153            appending.add(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    +154            change += step;
    +155        }
    +156        appending.add(chain.get(splits));
    +157        return appending;
    +158    }
    +159
    +160    /**
    +161     * Appends a gradient between several packed float RGB colors provided in {@code chain}. This uses the specified
    +162     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +163     * end of {@code appending} and produces a total of {@code steps} colors.
    +164     * @param appending a FloatList that will be appended to
    +165     * @param steps how many steps the gradient should use; usually greater than 2
    +166     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +167     * @param chain an array or varargs of packed float RGB colors that this will interpolate through in order
    +168     * @return {@code appending}, after adding the gradient to the end
    +169     */
    +170    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    +171        if (appending == null)
    +172            return null;
    +173        if(chain == null)
    +174            return appending;
    +175        if (steps <= 0 || chain.length == 0) {
    +176            return appending;
    +177        }
    +178        if (steps == 1 || chain.length == 1) {
    +179            appending.add(chain[0]);
    +180            return appending;
    +181        }
    +182        appending.ensureCapacity(steps);
    +183        int limit = steps - 1, splits = chain.length - 1;
    +184        float step = 1f / steps, change = 0f;
    +185        for (int i = 0; i < limit; i++) {
    +186            float interp = interpolation.apply(change);
    +187            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +188            int idx = (int)splint;
    +189            appending.add(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    +190            change += step;
    +191        }
    +192        appending.add(chain[splits]);
    +193        return appending;
    +194    }
    +195
    +196    /**
    +197     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    +198     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +199     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +200     * number of steps, it just doesn't append {@code end} in the last step.
    +201     * @param appending a FloatList that will be appended to
    +202     * @param start the packed float RGB color to start with
    +203     * @param end the packed float RGB color to end just before
    +204     * @param steps how many steps the gradient should use; usually greater than 2
    +205     * @return {@code appending}, after adding the gradient to its end
    +206     */
    +207    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    +208        return appendPartialGradient(appending, start, end, steps, Interpolations.linear);
    +209    }
    +210    /**
    +211     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    +212     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +213     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +214     * number of steps, it just doesn't append {@code end} in the last step.
    +215     * @param appending a FloatList that will be appended to
    +216     * @param start the packed float RGB color to start with
    +217     * @param end the packed float RGB color to end just before
    +218     * @param steps how many steps the gradient should use; usually greater than 2
    +219     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    +220     * @return {@code appending}, after adding the gradient to its end
    +221     */
    +222    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    +223        if(appending == null)
    +224            return null;
    +225        if(steps <= 0) {
    +226            return appending;
    +227        }
    +228        if(steps == 1) {
    +229            appending.add(start);
    +230            return appending;
    +231        }
    +232        int limit = steps;
    +233        float step = 1f / steps, change = 0f;
    +234        for (int i = 0; i < limit; i++) {
    +235            appending.add(FloatColors.lerpFloatColors(start, end, interpolation.apply(change)));
    +236            change += step;
    +237        }
    +238        return appending;
    +239    }
    +240}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html
    index 420de812..3b44dd32 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/rgb/SimplePalette.html
    @@ -748,13 +748,13 @@
     735                    if (len > 2 && term.charAt(2) == 'g') {
     736                        switch (len) {
     737                            case 9:
    -738                                intensity += 0.085f;
    +738                                intensity += 0.200f;
     739                            case 8:
    -740                                intensity += 0.085f;
    +740                                intensity += 0.200f;
     741                            case 7:
    -742                                intensity += 0.085f;
    +742                                intensity += 0.200f;
     743                            case 5:
    -744                                intensity += 0.085f;
    +744                                intensity += 0.200f;
     745                                break;
     746                            default:
     747                                mixing.add(TRANSPARENT);
    @@ -768,13 +768,13 @@
     755                    if (len > 1 && term.charAt(1) == 'i') {
     756                        switch (len) {
     757                            case 8:
    -758                                saturation += 0.175f;
    +758                                saturation += 0.200f;
     759                            case 7:
    -760                                saturation += 0.175f;
    +760                                saturation += 0.200f;
     761                            case 6:
    -762                                saturation += 0.175f;
    +762                                saturation += 0.200f;
     763                            case 4:
    -764                                saturation += 0.175f;
    +764                                saturation += 0.200f;
     765                                break;
     766                            default:
     767                                mixing.add(TRANSPARENT);
    @@ -788,13 +788,13 @@
     775                    if (len > 1 && term.charAt(1) == 'a') {
     776                        switch (len) {
     777                            case 8:
    -778                                intensity -= 0.085f;
    +778                                intensity -= 0.200f;
     779                            case 7:
    -780                                intensity -= 0.085f;
    +780                                intensity -= 0.200f;
     781                            case 6:
    -782                                intensity -= 0.085f;
    +782                                intensity -= 0.200f;
     783                            case 4:
    -784                                intensity -= 0.085f;
    +784                                intensity -= 0.200f;
     785                                break;
     786                            default:
     787                                mixing.add(TRANSPARENT);
    @@ -803,13 +803,13 @@
     790                    } else if (len > 1 && term.charAt(1) == 'u') {
     791                        switch (len) {
     792                            case 8:
    -793                                saturation -= 0.175f;
    +793                                saturation -= 0.200f;
     794                            case 7:
    -795                                saturation -= 0.175f;
    +795                                saturation -= 0.200f;
     796                            case 6:
    -797                                saturation -= 0.175f;
    +797                                saturation -= 0.200f;
     798                            case 4:
    -799                                saturation -= 0.175f;
    +799                                saturation -= 0.200f;
     800                                break;
     801                            default:
     802                                mixing.add(TRANSPARENT);
    @@ -824,76 +824,84 @@
     811                    break;
     812            }
     813        }
    -814        float result = FloatColors.mix(mixing.items, 0, mixing.size());
    -815        if(result == 0f) return result;
    -816
    -817        return toEditedFloat(result, 0f, saturation, intensity, 0f);
    -818    }
    -819    private static final ObjectList<String> namesByHue = new ObjectList<>(NAMES_BY_HUE);
    -820    private static final FloatList colorsByHue = new FloatList(COLORS_BY_HUE);
    -821    static {
    -822        int trn = namesByHue.indexOf("transparent");
    -823        namesByHue.removeAt(trn);
    -824        colorsByHue.removeAt(trn);
    -825        ALIASES.put("grey", GRAY);
    -826        ALIASES.put("gold", SAFFRON);
    -827        ALIASES.put("puce", MAUVE);
    -828        ALIASES.put("sand", TAN);
    -829        ALIASES.put("skin", PEACH); // Yes, I am aware that there is more than one skin color, but this can only map to one.
    -830        ALIASES.put("coral", SALMON);
    -831        ALIASES.put("azure", SKY);
    -832        ALIASES.put("ocean", TEAL);
    -833        ALIASES.put("sapphire", COBALT);
    -834        NAMED.putAll(ALIASES);
    -835    }
    -836    /**
    -837     * Given a color as a packed RGBA float, this finds the closest description it can to match the given color while
    -838     * using at most {@code mixCount} colors to mix in. You should only use small numbers for mixCount, like 1 to 3;
    -839     * this can take quite a while to run otherwise. This returns a String description that can be passed to
    -840     * {@link #parseDescription(String)}. It is likely that this will use very contrasting colors if mixCount is 2 or
    -841     * greater and the color to match is desaturated or brownish.
    -842     * @param rgb a packed RGBA float color to attempt to match
    -843     * @param mixCount how many color names this will use in the returned description
    -844     * @return a description that can be fed to {@link #parseDescription(String)} to get a similar color
    -845     */
    -846    public static String bestMatch(final float rgb, int mixCount) {
    -847        mixCount = Math.max(1, mixCount);
    -848        float oklab = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(rgb);
    -849        float bestDistance = Float.POSITIVE_INFINITY;
    -850        final int paletteSize = namesByHue.size(), colorTries = (int)Math.pow(paletteSize, mixCount), totalTries = colorTries * 81;
    -851        final float targetL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(oklab), targetA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(oklab), targetB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(oklab);
    -852        final String[] lightAdjectives = {"darkmost ", "darkest ", "darker ", "dark ", "", "light ", "lighter ", "lightest ", "lightmost "};
    -853        final String[] satAdjectives = {"dullmost ", "dullest ", "duller ", "dull ", "", "rich ", "richer ", "richest ", "richmost "};
    -854        mixing.clear();
    -855        for (int i = 0; i < mixCount; i++) {
    -856            mixing.add(colorsByHue.get(0));
    -857        }
    -858        int bestCode = 0;
    -859        for (int c = 0; c < totalTries; c++) {
    -860            for (int i = 0, e = 1; i < mixCount; i++, e *= paletteSize) {
    -861                mixing.set(i, colorsByHue.get((c / e) % paletteSize));
    -862            }
    -863            int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4);
    -864
    -865            final float result = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(
    -866                    toEditedFloat(FloatColors.mix(mixing.items, 0, mixCount), 0f, 0.175f * idxS, 0.085f * idxI, 0f));
    -867
    -868            final float dL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(result) - targetL;
    -869            final float dA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(result) - targetA;
    -870            final float dB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(result) - targetB;
    -871            if(bestDistance > (bestDistance = Math.min(dL * dL + dA * dA + dB * dB, bestDistance)))
    -872                bestCode = c;
    -873        }
    -874
    -875        StringBuilder description = new StringBuilder(lightAdjectives[(bestCode / colorTries) % 9] + satAdjectives[bestCode / (colorTries * 9)]);
    -876        for (int i = 0, e = 1; i < mixCount; e *= paletteSize) {
    -877            description.append(namesByHue.get((bestCode / e) % paletteSize));
    -878            if(++i < mixCount)
    -879                description.append(' ');
    -880        }
    -881        return description.toString();
    -882    }
    -883}
    +814
    +815        float result = FloatColors.mix(mixing.items, 0, mixing.size());
    +816        if(result == 0f) return result;
    +817
    +818        if(intensity > 0) result = ColorTools.lighten(result, intensity);
    +819        else if(intensity < 0) result = ColorTools.darken(result, -intensity);
    +820
    +821        if(saturation > 0) result = (ColorTools.enrich(result, saturation));
    +822        else if(saturation < 0) result = ColorTools.dullen(result, -saturation);
    +823
    +824        return result;
    +825    }
    +826    
    +827    private static final ObjectList<String> namesByHue = new ObjectList<>(NAMES_BY_HUE);
    +828    private static final FloatList colorsByHue = new FloatList(COLORS_BY_HUE);
    +829    static {
    +830        int trn = namesByHue.indexOf("transparent");
    +831        namesByHue.removeAt(trn);
    +832        colorsByHue.removeAt(trn);
    +833        ALIASES.put("grey", GRAY);
    +834        ALIASES.put("gold", SAFFRON);
    +835        ALIASES.put("puce", MAUVE);
    +836        ALIASES.put("sand", TAN);
    +837        ALIASES.put("skin", PEACH); // Yes, I am aware that there is more than one skin color, but this can only map to one.
    +838        ALIASES.put("coral", SALMON);
    +839        ALIASES.put("azure", SKY);
    +840        ALIASES.put("ocean", TEAL);
    +841        ALIASES.put("sapphire", COBALT);
    +842        NAMED.putAll(ALIASES);
    +843    }
    +844    /**
    +845     * Given a color as a packed RGBA float, this finds the closest description it can to match the given color while
    +846     * using at most {@code mixCount} colors to mix in. You should only use small numbers for mixCount, like 1 to 3;
    +847     * this can take quite a while to run otherwise. This returns a String description that can be passed to
    +848     * {@link #parseDescription(String)}. It is likely that this will use very contrasting colors if mixCount is 2 or
    +849     * greater and the color to match is desaturated or brownish.
    +850     * @param rgb a packed RGBA float color to attempt to match
    +851     * @param mixCount how many color names this will use in the returned description
    +852     * @return a description that can be fed to {@link #parseDescription(String)} to get a similar color
    +853     */
    +854    public static String bestMatch(final float rgb, int mixCount) {
    +855        mixCount = Math.max(1, mixCount);
    +856        float oklab = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(rgb);
    +857        float bestDistance = Float.POSITIVE_INFINITY;
    +858        final int paletteSize = namesByHue.size(), colorTries = (int)Math.pow(paletteSize, mixCount), totalTries = colorTries * 81;
    +859        final float targetL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(oklab), targetA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(oklab), targetB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(oklab);
    +860        final String[] lightAdjectives = {"darkmost ", "darkest ", "darker ", "dark ", "", "light ", "lighter ", "lightest ", "lightmost "};
    +861        final String[] satAdjectives = {"dullmost ", "dullest ", "duller ", "dull ", "", "rich ", "richer ", "richest ", "richmost "};
    +862        mixing.clear();
    +863        for (int i = 0; i < mixCount; i++) {
    +864            mixing.add(colorsByHue.get(0));
    +865        }
    +866        int bestCode = 0;
    +867        for (int c = 0; c < totalTries; c++) {
    +868            for (int i = 0, e = 1; i < mixCount; i++, e *= paletteSize) {
    +869                mixing.set(i, colorsByHue.get((c / e) % paletteSize));
    +870            }
    +871            int idxI = ((c / colorTries) % 9 - 4), idxS = (c / (colorTries * 9) - 4);
    +872
    +873            final float result = com.github.tommyettinger.colorful.pure.oklab.ColorTools.fromRGBA(
    +874                    toEditedFloat(FloatColors.mix(mixing.items, 0, mixCount), 0f, 0.200f * idxS, 0.200f * idxI, 0f));
    +875
    +876            final float dL = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelL(result) - targetL;
    +877            final float dA = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelA(result) - targetA;
    +878            final float dB = com.github.tommyettinger.colorful.pure.oklab.ColorTools.channelB(result) - targetB;
    +879            if(bestDistance > (bestDistance = Math.min(dL * dL + dA * dA + dB * dB, bestDistance)))
    +880                bestCode = c;
    +881        }
    +882
    +883        StringBuilder description = new StringBuilder(lightAdjectives[(bestCode / colorTries) % 9] + satAdjectives[bestCode / (colorTries * 9)]);
    +884        for (int i = 0, e = 1; i < mixCount; e *= paletteSize) {
    +885            description.append(namesByHue.get((bestCode / e) % paletteSize));
    +886            if(++i < mixCount)
    +887                description.append(' ');
    +888        }
    +889        return description.toString();
    +890    }
    +891}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html
    index 58cd2282..1d5a9828 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/ColorTools.html
    @@ -14,7 +14,7 @@
     
    001package com.github.tommyettinger.colorful.pure.ycwcm;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.MathTools;
    +004import com.github.tommyettinger.digital.MathTools;
     005import com.github.tommyettinger.digital.BitConversion;
     006import com.github.tommyettinger.random.EnhancedRandom;
     007
    diff --git a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/GradientTools.html b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/GradientTools.html
    index 231ee0b1..17574938 100644
    --- a/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/GradientTools.html
    +++ b/docs/colorful-pure/apidocs/src-html/com/github/tommyettinger/colorful/pure/ycwcm/GradientTools.html
    @@ -14,242 +14,243 @@
     
    001package com.github.tommyettinger.colorful.pure.ycwcm;
     002
     003import com.github.tommyettinger.colorful.pure.FloatColors;
    -004import com.github.tommyettinger.colorful.pure.Interpolation;
    -005import com.github.tommyettinger.colorful.pure.MathTools;
    -006import com.github.tommyettinger.ds.FloatList;
    -007
    -008/**
    -009 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    -010 * The intent is for the FloatList to be used as a sequence of packed float YCwCm colors. You can create a new
    -011 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    -012 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    -013 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    -014 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    -015 * than two colors. You can also customize each section between colors with
    -016 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    -017 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    -018 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    -019 */
    -020public class GradientTools {
    -021    /**
    -022     * No need to instantiate.
    -023     */
    -024    private GradientTools(){
    -025    }
    -026
    -027    /**
    -028     * Creates a FloatList gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color
    -029     * {@code end}, taking the specified number of steps and using linear interpolation.
    -030     * @param start the packed float YCwCm color to start with
    -031     * @param end the packed float YCwCm color to end on
    -032     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -033     * @return a new FloatList that contains the requested gradient
    -034     */
    -035    public static FloatList makeGradient(float start, float end, int steps) {
    -036        return makeGradient(start, end, steps, Interpolation.linear);
    -037    }
    -038    /**
    -039     * Creates a FloatList gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color
    -040     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    -041     * @param start the packed float YCwCm color to start with
    -042     * @param end the packed float YCwCm color to end on
    -043     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    -044     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -045     * @return a new FloatList that contains the requested gradient
    -046     */
    -047    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    -048        FloatList appending = new FloatList(steps);
    -049        if(steps <= 0) {
    -050            return appending;
    -051        }
    -052        if(steps == 1) {
    -053            appending.add(start);
    -054            return appending;
    -055        }
    -056        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -057        return appending;
    -058    }
    -059
    -060    /**
    -061     * Appends a gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color {@code end},
    -062     * taking the specified number of steps and using linear Interpolation for how it transitions.
    -063     * @param appending a FloatList that will be appended to
    -064     * @param start the packed float YCwCm color to start with
    -065     * @param end the packed float YCwCm color to end on
    -066     * @param steps how many steps the gradient should use; usually greater than 2
    -067     * @return {@code appending}, after adding the gradient to the end
    -068     */
    -069    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    -070        return appendGradient(appending, start, end, steps, Interpolation.linear);
    -071    }
    -072    /**
    -073     * Appends a gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color {@code end},
    -074     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    -075     * @param appending a FloatList that will be appended to
    -076     * @param start the packed float YCwCm color to start with
    -077     * @param end the packed float YCwCm color to end on
    -078     * @param steps how many steps the gradient should use; usually greater than 2
    -079     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -080     * @return {@code appending}, after adding the gradient to the end
    -081     */
    -082    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    -083        if(appending == null)
    -084            return null;
    -085        if(steps <= 0) {
    -086            return appending;
    -087        }
    -088        if(steps == 1) {
    -089            appending.add(start);
    -090            return appending;
    -091        }
    -092        appending.ensureCapacity(steps);
    -093        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    -094        return appending;
    -095    }
    -096
    -097    /**
    -098     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses linear
    -099     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -100     * {@code steps} colors.
    -101     * @param appending a FloatList that will be appended to
    -102     * @param steps how many steps the gradient should use; usually greater than 2
    -103     * @param chain an array or varargs of packed float YCwCm colors that this will interpolate through in order
    -104     * @return {@code appending}, after adding the gradient to the end
    -105     */
    -106    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    -107        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -108    }
    -109
    -110    /**
    -111     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses linear
    -112     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    -113     * {@code steps} colors.
    -114     * @param appending a FloatList that will be appended to
    -115     * @param steps how many steps the gradient should use; usually greater than 2
    -116     * @param chain a FloatList of packed float YCwCm colors that this will interpolate through in order
    -117     * @return {@code appending}, after adding the gradient to the end
    -118     */
    -119    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    -120        return appendGradientChain(appending, steps, Interpolation.linear, chain);
    -121    }
    -122
    -123    /**
    -124     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses the specified
    -125     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -126     * end of {@code appending} and produces a total of {@code steps} colors.
    -127     * @param appending a FloatList that will be appended to
    -128     * @param steps how many steps the gradient should use; usually greater than 2
    -129     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -130     * @param chain a FloatList of packed float YCwCm colors that this will interpolate through in order
    -131     * @return {@code appending}, after adding the gradient to the end
    -132     */
    -133    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    -134        if (appending == null)
    -135            return null;
    -136        if(chain == null)
    -137            return appending;
    -138        if (steps <= 0 || chain.size() == 0) {
    -139            return appending;
    -140        }
    -141        if (steps == 1 || chain.size() == 1) {
    -142            appending.add(chain.first());
    -143            return appending;
    -144        }
    -145        appending.ensureCapacity(steps);
    -146        int limit = steps - 1, splits = chain.size() - 1;
    -147        float step = 1f / steps, change = 0f;
    -148        for (int i = 0; i < limit; i++) {
    -149            float interp = interpolation.apply(change);
    -150            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -151            int idx = (int)splint;
    -152            appending.add(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    -153            change += step;
    -154        }
    -155        appending.add(chain.get(splits));
    -156        return appending;
    -157    }
    -158
    -159    /**
    -160     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses the specified
    -161     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    -162     * end of {@code appending} and produces a total of {@code steps} colors.
    -163     * @param appending a FloatList that will be appended to
    -164     * @param steps how many steps the gradient should use; usually greater than 2
    -165     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    -166     * @param chain an array or varargs of packed float YCwCm colors that this will interpolate through in order
    -167     * @return {@code appending}, after adding the gradient to the end
    -168     */
    -169    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    -170        if (appending == null)
    -171            return null;
    -172        if(chain == null)
    -173            return appending;
    -174        if (steps <= 0 || chain.length == 0) {
    -175            return appending;
    -176        }
    -177        if (steps == 1 || chain.length == 1) {
    -178            appending.add(chain[0]);
    -179            return appending;
    -180        }
    -181        appending.ensureCapacity(steps);
    -182        int limit = steps - 1, splits = chain.length - 1;
    -183        float step = 1f / steps, change = 0f;
    -184        for (int i = 0; i < limit; i++) {
    -185            float interp = interpolation.apply(change);
    -186            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    -187            int idx = (int)splint;
    -188            appending.add(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    -189            change += step;
    -190        }
    -191        appending.add(chain[splits]);
    -192        return appending;
    -193    }
    -194
    -195    /**
    -196     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    -197     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -198     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -199     * number of steps, it just doesn't append {@code end} in the last step.
    -200     * @param appending a FloatList that will be appended to
    -201     * @param start the packed float YCwCm color to start with
    -202     * @param end the packed float YCwCm color to end just before
    -203     * @param steps how many steps the gradient should use; usually greater than 2
    -204     * @return {@code appending}, after adding the gradient to its end
    -205     */
    -206    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    -207        return appendPartialGradient(appending, start, end, steps, Interpolation.linear);
    -208    }
    -209    /**
    -210     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    -211     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    -212     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    -213     * number of steps, it just doesn't append {@code end} in the last step.
    -214     * @param appending a FloatList that will be appended to
    -215     * @param start the packed float YCwCm color to start with
    -216     * @param end the packed float YCwCm color to end just before
    -217     * @param steps how many steps the gradient should use; usually greater than 2
    -218     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    -219     * @return {@code appending}, after adding the gradient to its end
    -220     */
    -221    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    -222        if(appending == null)
    -223            return null;
    -224        if(steps <= 0) {
    -225            return appending;
    -226        }
    -227        if(steps == 1) {
    -228            appending.add(start);
    -229            return appending;
    -230        }
    -231        int limit = steps;
    -232        float step = 1f / steps, change = 0f;
    -233        for (int i = 0; i < limit; i++) {
    -234            appending.add(FloatColors.lerpFloatColors(start, end, interpolation.apply(change)));
    -235            change += step;
    -236        }
    -237        return appending;
    -238    }
    -239}
    +004import com.github.tommyettinger.colorful.pure.Interpolations;
    +005import com.github.tommyettinger.colorful.pure.Interpolations.Interpolation;
    +006import com.github.tommyettinger.colorful.pure.MathTools;
    +007import com.github.tommyettinger.ds.FloatList;
    +008
    +009/**
    +010 * Static methods for handling gradients of smoothly-changing colors, typically inside of {@link FloatList}s.
    +011 * The intent is for the FloatList to be used as a sequence of packed float YCwCm colors. You can create a new
    +012 * FloatList gradient with {@link #makeGradient(float, float, int, Interpolation)}, but any FloatList will work
    +013 * (although it only makes sense if it contains packed float colors or is empty). Once you have a FloatList, you can
    +014 * pass it to {@link #appendGradient(FloatList, float, float, int, Interpolation)} to make a gradient between two
    +015 * colors, or {@link #appendGradientChain(FloatList, int, Interpolation, float...)} to make a gradient between more
    +016 * than two colors. You can also customize each section between colors with
    +017 * {@link #appendPartialGradient(FloatList, float, float, int, Interpolation)}, which is just like appendGradient() but
    +018 * doesn't add the end color (since it is the start color of the next partial gradient, until you finally end by
    +019 * appending just the end). Using appendPartialGradient(), you can have each transition use a different number of steps.
    +020 */
    +021public class GradientTools {
    +022    /**
    +023     * No need to instantiate.
    +024     */
    +025    private GradientTools(){
    +026    }
    +027
    +028    /**
    +029     * Creates a FloatList gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color
    +030     * {@code end}, taking the specified number of steps and using linear interpolation.
    +031     * @param start the packed float YCwCm color to start with
    +032     * @param end the packed float YCwCm color to end on
    +033     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +034     * @return a new FloatList that contains the requested gradient
    +035     */
    +036    public static FloatList makeGradient(float start, float end, int steps) {
    +037        return makeGradient(start, end, steps, Interpolations.linear);
    +038    }
    +039    /**
    +040     * Creates a FloatList gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color
    +041     * {@code end}, taking the specified number of steps and using the specified Interpolation for how it transitions.
    +042     * @param start the packed float YCwCm color to start with
    +043     * @param end the packed float YCwCm color to end on
    +044     * @param steps how many steps the gradient should use; usually greater than 2, and must be non-negative
    +045     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +046     * @return a new FloatList that contains the requested gradient
    +047     */
    +048    public static FloatList makeGradient(float start, float end, int steps, Interpolation interpolation) {
    +049        FloatList appending = new FloatList(steps);
    +050        if(steps <= 0) {
    +051            return appending;
    +052        }
    +053        if(steps == 1) {
    +054            appending.add(start);
    +055            return appending;
    +056        }
    +057        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +058        return appending;
    +059    }
    +060
    +061    /**
    +062     * Appends a gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color {@code end},
    +063     * taking the specified number of steps and using linear Interpolation for how it transitions.
    +064     * @param appending a FloatList that will be appended to
    +065     * @param start the packed float YCwCm color to start with
    +066     * @param end the packed float YCwCm color to end on
    +067     * @param steps how many steps the gradient should use; usually greater than 2
    +068     * @return {@code appending}, after adding the gradient to the end
    +069     */
    +070    public static FloatList appendGradient(FloatList appending, float start, float end, int steps) {
    +071        return appendGradient(appending, start, end, steps, Interpolations.linear);
    +072    }
    +073    /**
    +074     * Appends a gradient from the packed float YCwCm color {@code start} to the packed float YCwCm color {@code end},
    +075     * taking the specified number of steps and using the specified Interpolation for how it transitions.
    +076     * @param appending a FloatList that will be appended to
    +077     * @param start the packed float YCwCm color to start with
    +078     * @param end the packed float YCwCm color to end on
    +079     * @param steps how many steps the gradient should use; usually greater than 2
    +080     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +081     * @return {@code appending}, after adding the gradient to the end
    +082     */
    +083    public static FloatList appendGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation) {
    +084        if(appending == null)
    +085            return null;
    +086        if(steps <= 0) {
    +087            return appending;
    +088        }
    +089        if(steps == 1) {
    +090            appending.add(start);
    +091            return appending;
    +092        }
    +093        appending.ensureCapacity(steps);
    +094        appendPartialGradient(appending, start, end, steps - 1, interpolation).add(end);
    +095        return appending;
    +096    }
    +097
    +098    /**
    +099     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses linear
    +100     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +101     * {@code steps} colors.
    +102     * @param appending a FloatList that will be appended to
    +103     * @param steps how many steps the gradient should use; usually greater than 2
    +104     * @param chain an array or varargs of packed float YCwCm colors that this will interpolate through in order
    +105     * @return {@code appending}, after adding the gradient to the end
    +106     */
    +107    public static FloatList appendGradientChain(FloatList appending, int steps, float... chain) {
    +108        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +109    }
    +110
    +111    /**
    +112     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses linear
    +113     * Interpolation for the whole gradient. Appends to the end of {@code appending} and produces a total of
    +114     * {@code steps} colors.
    +115     * @param appending a FloatList that will be appended to
    +116     * @param steps how many steps the gradient should use; usually greater than 2
    +117     * @param chain a FloatList of packed float YCwCm colors that this will interpolate through in order
    +118     * @return {@code appending}, after adding the gradient to the end
    +119     */
    +120    public static FloatList appendGradientChain(FloatList appending, int steps, FloatList chain) {
    +121        return appendGradientChain(appending, steps, Interpolations.linear, chain);
    +122    }
    +123
    +124    /**
    +125     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses the specified
    +126     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +127     * end of {@code appending} and produces a total of {@code steps} colors.
    +128     * @param appending a FloatList that will be appended to
    +129     * @param steps how many steps the gradient should use; usually greater than 2
    +130     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +131     * @param chain a FloatList of packed float YCwCm colors that this will interpolate through in order
    +132     * @return {@code appending}, after adding the gradient to the end
    +133     */
    +134    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, FloatList chain) {
    +135        if (appending == null)
    +136            return null;
    +137        if(chain == null)
    +138            return appending;
    +139        if (steps <= 0 || chain.size() == 0) {
    +140            return appending;
    +141        }
    +142        if (steps == 1 || chain.size() == 1) {
    +143            appending.add(chain.first());
    +144            return appending;
    +145        }
    +146        appending.ensureCapacity(steps);
    +147        int limit = steps - 1, splits = chain.size() - 1;
    +148        float step = 1f / steps, change = 0f;
    +149        for (int i = 0; i < limit; i++) {
    +150            float interp = interpolation.apply(change);
    +151            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +152            int idx = (int)splint;
    +153            appending.add(FloatColors.lerpFloatColors(chain.get(idx), chain.get(idx+1), MathTools.norm(idx, idx +1, splint)));
    +154            change += step;
    +155        }
    +156        appending.add(chain.get(splits));
    +157        return appending;
    +158    }
    +159
    +160    /**
    +161     * Appends a gradient between several packed float YCwCm colors provided in {@code chain}. This uses the specified
    +162     * Interpolation for the whole gradient, which can make some colors use smaller sections than others. Appends to the
    +163     * end of {@code appending} and produces a total of {@code steps} colors.
    +164     * @param appending a FloatList that will be appended to
    +165     * @param steps how many steps the gradient should use; usually greater than 2
    +166     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions to end
    +167     * @param chain an array or varargs of packed float YCwCm colors that this will interpolate through in order
    +168     * @return {@code appending}, after adding the gradient to the end
    +169     */
    +170    public static FloatList appendGradientChain(FloatList appending, int steps, Interpolation interpolation, float... chain) {
    +171        if (appending == null)
    +172            return null;
    +173        if(chain == null)
    +174            return appending;
    +175        if (steps <= 0 || chain.length == 0) {
    +176            return appending;
    +177        }
    +178        if (steps == 1 || chain.length == 1) {
    +179            appending.add(chain[0]);
    +180            return appending;
    +181        }
    +182        appending.ensureCapacity(steps);
    +183        int limit = steps - 1, splits = chain.length - 1;
    +184        float step = 1f / steps, change = 0f;
    +185        for (int i = 0; i < limit; i++) {
    +186            float interp = interpolation.apply(change);
    +187            float splint = Math.min(Math.max(interp * splits, 0f), splits - 0.000001f);
    +188            int idx = (int)splint;
    +189            appending.add(FloatColors.lerpFloatColors(chain[idx], chain[idx+1], MathTools.norm(idx, idx +1, splint)));
    +190            change += step;
    +191        }
    +192        appending.add(chain[splits]);
    +193        return appending;
    +194    }
    +195
    +196    /**
    +197     * Exactly like {@link #appendGradient(FloatList, float, float, int)}, but does not include
    +198     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +199     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +200     * number of steps, it just doesn't append {@code end} in the last step.
    +201     * @param appending a FloatList that will be appended to
    +202     * @param start the packed float YCwCm color to start with
    +203     * @param end the packed float YCwCm color to end just before
    +204     * @param steps how many steps the gradient should use; usually greater than 2
    +205     * @return {@code appending}, after adding the gradient to its end
    +206     */
    +207    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps) {
    +208        return appendPartialGradient(appending, start, end, steps, Interpolations.linear);
    +209    }
    +210    /**
    +211     * Exactly like {@link #appendGradient(FloatList, float, float, int, Interpolation)}, but does not include
    +212     * {@code end} in what it appends to {@code appending}. This is intended for the implementation of chained
    +213     * gradients, where the end of a previous gradient becomes the start of the next one. This still uses the specified
    +214     * number of steps, it just doesn't append {@code end} in the last step.
    +215     * @param appending a FloatList that will be appended to
    +216     * @param start the packed float YCwCm color to start with
    +217     * @param end the packed float YCwCm color to end just before
    +218     * @param steps how many steps the gradient should use; usually greater than 2
    +219     * @param interpolation a libGDX Interpolation that can be used to customize how start transitions toward end
    +220     * @return {@code appending}, after adding the gradient to its end
    +221     */
    +222    public static FloatList appendPartialGradient(FloatList appending, float start, float end, int steps, Interpolation interpolation){
    +223        if(appending == null)
    +224            return null;
    +225        if(steps <= 0) {
    +226            return appending;
    +227        }
    +228        if(steps == 1) {
    +229            appending.add(start);
    +230            return appending;
    +231        }
    +232        int limit = steps;
    +233        float step = 1f / steps, change = 0f;
    +234        for (int i = 0; i < limit; i++) {
    +235            appending.add(FloatColors.lerpFloatColors(start, end, interpolation.apply(change)));
    +236            change += step;
    +237        }
    +238        return appending;
    +239    }
    +240}
     
     
     
    diff --git a/docs/colorful-pure/apidocs/type-search-index.js b/docs/colorful-pure/apidocs/type-search-index.js
    index 75d8c14f..b94d7053 100644
    --- a/docs/colorful-pure/apidocs/type-search-index.js
    +++ b/docs/colorful-pure/apidocs/type-search-index.js
    @@ -1 +1 @@
    -typeSearchIndex = [{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.BiasGain"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.Bounce"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.BounceIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.BounceOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.Elastic"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.ElasticIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.ElasticOut"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.Exp"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.ExpIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.ExpOut"},{"p":"com.github.tommyettinger.colorful.pure","l":"FloatColors"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation"},{"p":"com.github.tommyettinger.colorful.pure","l":"MathTools"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.ipt","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.Pow"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.PowIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.PowOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.Swing"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.SwingIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolation.SwingOut"}];updateSearchResults();
    \ No newline at end of file
    +typeSearchIndex = [{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.BiasGain"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.Bounce"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.BounceIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.BounceOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","l":"ColorTools"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.Elastic"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.ElasticIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.ElasticOut"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.Exp"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.ExpIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.ExpOut"},{"p":"com.github.tommyettinger.colorful.pure","l":"FloatColors"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.ipt","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","l":"GradientTools"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.Interpolation"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations"},{"p":"com.github.tommyettinger.colorful.pure","l":"MathTools"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.ipt","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure.ycwcm","l":"Palette"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.Pow"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.PowIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.PowOut"},{"p":"com.github.tommyettinger.colorful.pure.cielab","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.hsluv","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.ipt_hq","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.oklab","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure.rgb","l":"SimplePalette"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.Swing"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.SwingIn"},{"p":"com.github.tommyettinger.colorful.pure","l":"Interpolations.SwingOut"}];updateSearchResults();
    \ No newline at end of file
    diff --git a/docs/colorful/apidocs/allclasses-index.html b/docs/colorful/apidocs/allclasses-index.html
    index 87f37ba4..f07815b3 100644
    --- a/docs/colorful/apidocs/allclasses-index.html
    +++ b/docs/colorful/apidocs/allclasses-index.html
    @@ -2,7 +2,7 @@
     
     
     
    -All Classes and Interfaces (colorful 0.8.2 API)
    +All Classes and Interfaces (colorful 0.8.3 API)
     
     
     
    @@ -255,8 +255,9 @@ 

    All Classes and Interfaces<

    -
    Some alternative approximations to sin(), cos(), asin(), acos(), atan(), and atan2(), including the option to measure - most values in turns instead of radians (where 1 turn equals 2pi radians).
    +
    Various trigonometric approximations, using a lookup table for sin() and cos(), a non-tabular approximation for + sinSmooth() and cosSmooth(), a Padé approximant for tan(), and Taylor series for the inverses of sin(), cos(), and + tan().
    diff --git a/docs/colorful/apidocs/allpackages-index.html b/docs/colorful/apidocs/allpackages-index.html index ac3d1a15..2bf3f19b 100644 --- a/docs/colorful/apidocs/allpackages-index.html +++ b/docs/colorful/apidocs/allpackages-index.html @@ -2,7 +2,7 @@ -All Packages (colorful 0.8.2 API) +All Packages (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html index d37f38a1..4380f283 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/FloatColors.html @@ -2,7 +2,7 @@ -FloatColors (colorful 0.8.2 API) +FloatColors (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html index 4a5dae32..7ea47c62 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/Shaders.html @@ -2,7 +2,7 @@ -Shaders (colorful 0.8.2 API) +Shaders (colorful 0.8.3 API) @@ -80,7 +80,7 @@

    Class Shaders

    extends Object
    Shader code to construct a ShaderProgram that can render the specialized colors produced by the rest of this library. The shader code is meant for use in a SpriteBatch; a convenience - method, makeBatch(), is provided to generate and return a SpriteBatch that uses a correct ShaderProgram. + method, makeYCwCmBatch(), is provided to generate and return a SpriteBatch that uses a correct ShaderProgram. Many of the shaders here are experimental and meant as a basis for user code, rather than a complete solution. If you aren't familiar with shaders in libGDX, see this libGDX wiki article for more information. @@ -116,66 +116,66 @@

    Field Summary

    Modifier and Type
    Field
    Description
    -
    static final String
    - +
    static String
    +
    -
    Where the magic happens; this converts a batch color from the YCwCm format (used by colorful's ycwcm package) to - RGBA.
    +
    Takes a batch color in CIE LAB format (but ranging from 0 to 1 instead of its normal larger range).
    static String
    - +
    -
    Takes a batch color in CIE LAB format (but ranging from 0 to 1 instead of its normal larger range).
    +
    Makes the colors in the given textures almost-grayscale, then moves their chromatic channels much closer to the + batch color, without changing the lightness.
    static String
    - +
    Makes the colors in the given textures almost-grayscale, then moves their chromatic channels much closer to the - batch color, without changing the lightness.
    + batch color's chromatic channels, without changing the lightness.
    static String
    - +
    -
    Makes the colors in the given textures almost-grayscale, then moves their chromatic channels much closer to the - batch color's chromatic channels, without changing the lightness.
    -
    -
    static String
    - -
    A specialized shader that can reduce lightness differences in the output colors, saturate/desaturate them, and can be configured to use some of the existing lightness in the image to add to a main flat lightness.
    -
    static String
    - -
    -
    The fragment shader counterpart to vertexShaderDayNight; must be used with that vertex shader.
    -
    static String
    - +
    -
    A drop-in replacement for the default fragment shader that eliminates lightness differences in the output colors.
    +
    The fragment shader counterpart to vertexShaderDayNight; must be used with that vertex shader.
    -
    static final String
    - +
    static String
    +
    -
    A simple shader that uses multiplicative blending with "normal" RGBA colors, and is simpler than - fragmentShaderRGBA but can make changes in color smoother.
    +
    A drop-in replacement for the default fragment shader that eliminates lightness differences in the output colors.
    static final String
    -
    A variant on fragmentShader that adjusts luma to make mid-range colors darker, while keeping light +
    A variant on fragmentShaderYCwCm that adjusts luma to make mid-range colors darker, while keeping light colors light.
    -
    static String
    - +
    static final String
    +
    +
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative), and + increases contrast somewhat, making the lightness change more sharply or harshly.
    +
    +
    static String
    + +
    This is an alias for fragmentShaderIPT.
    +
    static final String
    + +
    +
    Treats the color as hue, saturation, lightness, and...
    +
    static final String
    - +
    -
    Treats the color as hue, saturation, lightness, and...
    +
    Cycles hue, but not lightness; otherwise this is like fragmentShaderHSLC3 without contrast, and keeping + alpha intact.
    static final String
    @@ -203,74 +203,86 @@

    Field Summary

    One of the more useful HSL shaders here, this takes a batch color as hue, saturation, lightness, and power, with hue as a target hue and power used to determine how much of the target color should be used.
    -
    static final String
    - +
    static String
    +
    -
    Cycles hue, but not lightness; otherwise this is like fragmentShaderHSLC3 without contrast, and keeping - alpha intact.
    +
    Just like fragmentShaderOklab, but uses the HSLuv color space instead of the Oklab one.
    static String
    - +
    -
    Just like fragmentShaderOklab, but uses the HSLuv color space instead of the Oklab one.
    -
    -
    static String
    - -
    Just like fragmentShaderInvertedLightness, but instead of inverting lightness, this tries to change only hue, without changing lightness or (generally) saturation.
    -
    static String
    - -
    +
    static String
    + +
    Just like fragmentShaderInvertedRGB, but internally converts to Oklab, so it can invert just lightness without changing color hue or saturation.
    -
    static final String
    - -
    +
    static final String
    + +
    The simplest possible color-inverting shader for a SpriteBatch, this just takes each RGB channel and subtracts it from 1.0 to get the value this uses.
    -
    static String
    - -
    -
    Similar to fragmentShader, but this uses the very perceptually-accurate IPT color space as described by - Ebner and Fairchild, instead of the custom YCwCm color space.
    -
    static String
    - +
    +
    Similar to fragmentShaderYCwCm, but this uses the very perceptually-accurate IPT color space as described by + Ebner and Fairchild, instead of the custom YCwCm color space.
    +
    +
    static String
    + +
    Just like fragmentShaderIPT, but gamma-corrects the input and output RGB values (which improves lightness uniformity) and uses an exponential step internally to change how colors are distributed within the gamut.
    -
    static final String
    - -
    +
    static final String
    + +
    An alternative shader that effectively reduces luma contrast, bringing all but the darkest colors to the upper-mid luma range.
    -
    static String
    - +
    static final String
    + +
    +
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative), and + reduces contrast somewhat, making the lightness more murky and uniform.
    +
    +
    static final String
    +
    -
    Just like fragmentShaderIPT_HQ, but uses the Oklab color space instead of the very similar IPT_HQ one.
    +
    A simple shader that uses multiplicative blending with "normal" RGBA colors, and is simpler than + fragmentShaderRGBA but can make changes in color smoother.
    -
    static final String
    - +
    static String
    +
    +
    Just like fragmentShaderIPT_HQ, but uses the Oklab color space instead of the very similar IPT_HQ one.
    +
    +
    static final String
    + +
    This is supposed to look for RGBA colors that are similar to search, and if it finds one, to replace it with replace (also an RGBA color).
    +
    static final String
    + +
    +
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative).
    +
    static final String
    - +
    -
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative).
    +
    I can't even remember what this does, to be honest.
    static final String
    - +
    -
    I can't even remember what this does, to be honest.
    +
    Where the magic happens; this converts a batch color from the YCwCm format (used by colorful's ycwcm package) to + RGBA.
    static final String
    @@ -345,18 +357,6 @@

    Method Summary

    Method
    Description
    static com.badlogic.gdx.graphics.g2d.SpriteBatch
    - -
    -
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShader - from this class, making it able to render YCwCm colors from the ycwcm package.
    -
    -
    static com.badlogic.gdx.graphics.g2d.SpriteBatch
    -
    makeBatch(float contrast)
    -
    -
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShader - from this class, making it able to render YCwCm colors from the ycwcm package.
    -
    -
    static com.badlogic.gdx.graphics.g2d.SpriteBatch
    Prepares and returns a new SpriteBatch that uses vertexShaderHSLC and fragmentShaderHSLC @@ -365,17 +365,35 @@

    Method Summary

    change, and contrast change.
    static com.badlogic.gdx.graphics.glutils.ShaderProgram
    - +
    A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to lighten an image, and also smooths changes well.
    -
    static com.badlogic.gdx.graphics.glutils.ShaderProgram
    - +
    static com.badlogic.gdx.graphics.g2d.SpriteBatch
    +
    makeRGBABatch(float contrast)
    +
    Prepares and returns a new SpriteBatch that uses vertexShader and fragmentShaderHigherContrastRGBA + from this class, making it able to render RGBA colors from the libGDX or the rgb package.
    +
    +
    static com.badlogic.gdx.graphics.glutils.ShaderProgram
    + +
    A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to lighten an image.
    +
    static com.badlogic.gdx.graphics.g2d.SpriteBatch
    + +
    +
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShaderYCwCm + from this class, making it able to render YCwCm colors from the ycwcm package.
    +
    +
    static com.badlogic.gdx.graphics.g2d.SpriteBatch
    +
    makeYCwCmBatch(float contrast)
    +
    +
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShaderYCwCm + from this class, making it able to render YCwCm colors from the ycwcm package.
    +
    @@ -436,9 +454,9 @@

    fragmentShaderRGBA

  • -
    -

    fragmentShaderGammaRGBA

    -
    public static final String fragmentShaderGammaRGBA
    +
    +

    fragmentShaderMultiplyRGBA

    +
    public static final String fragmentShaderMultiplyRGBA
    A simple shader that uses multiplicative blending with "normal" RGBA colors, and is simpler than fragmentShaderRGBA but can make changes in color smoother. With the default SpriteBatch ShaderProgram, white is the neutral color, 50% gray darkens a color by about 50%, and black darkens a color to black, but @@ -455,38 +473,86 @@

    fragmentShaderGammaRGBA


    An earlier version of this attempted to use some useful code by CypherCove in gdx-tween, but the current version doesn't share any code, and doesn't really do any gamma correction either. It does less... gamma... un-correction - than fragmentShaderRGBA, though, so if the source images are gamma-corrected this should be fine.
    + than fragmentShaderRGBA, though, so if the source images are gamma-corrected this should be fine. +
    + This was called fragmentShaderGammaRGBA, but it doesn't do any gamma-correction now. It still seems quite + smooth. Where fragmentShaderRGBA adds the batch color to the pixel colors, this multiplies them.
  • See Also:
  • -
    -

    fragmentShader

    -
    public static final String fragmentShader
    +
    +

    fragmentShaderHigherContrastRGBA

    + +
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative), and + increases contrast somewhat, making the lightness change more sharply or harshly. + With the default SpriteBatch ShaderProgram, white is the neutral color, 50% gray darkens a color by about 50%, + and black darkens a color to black, but nothing can brighten a color. With this, 50% gray is the neutral color, + white adds 0.5 to the RGB channels (brightening it and also desaturating it), and black subtracts 0.5 from the + RGB channels (darkening and desaturating, but not to black unless the color is already somewhat dark). +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + Meant for use with vertexShader.
    +
    +
    See Also:
    +
    + +
    +
    +
    +
  • +
  • +
    +

    fragmentShaderLowerContrastRGBA

    + +
    A simple shader that uses additive blending with "normal" RGBA colors (alpha is still multiplicative), and + reduces contrast somewhat, making the lightness more murky and uniform. + With the default SpriteBatch ShaderProgram, white is the neutral color, 50% gray darkens a color by about 50%, + and black darkens a color to black, but nothing can brighten a color. With this, 50% gray is the neutral color, + white adds 0.5 to the RGB channels (brightening it and also desaturating it), and black subtracts 0.5 from the + RGB channels (darkening and desaturating, but not to black unless the color is already somewhat dark). +
    + You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + Meant for use with vertexShader.
    +
    +
  • +
  • +
    +

    fragmentShaderYCwCm

    +
    public static final String fragmentShaderYCwCm
    Where the magic happens; this converts a batch color from the YCwCm format (used by colorful's ycwcm package) to RGBA. The vertex color will be split up into 4 channels just as a normal shader does, but the channels here are luma, chromatic warmth, chromatic mildness, and alpha; alpha acts just like a typical RGBA shader, but the others are additive instead of multiplicative, with 0.5 as a neutral value. This does not support the "tweak" features that ColorfulBatch does, which include multiplicative counterparts to the additive operations this supports on luma, chromatic warmth, and chromatic mildness, plus a contrast adjustment. If you want to adjust - contrast globally, you can use makeBatch(float) to set the contrast for a new Batch with a new shader. + contrast globally, you can use makeYCwCmBatch(float) to set the contrast for a new Batch with a new shader.
    - You can generate RGB colors using any of various methods in the rgb package, such as - ColorTools.rgb(float, float, float, float). + You can generate YCwCm colors using any of various methods in the ycwcm package, such as + ColorTools.ycwcm(float, float, float, float).
    - Meant for use with vertexShader.
    + Meant for use with vertexShader. +
    + This was called fragmentShader, a name which dates back to when this was the only one in this file. It is + not the only one anymore.
  • See Also:
    @@ -495,8 +561,8 @@

    fragmentShader

  • fragmentShaderHigherContrast

    -
    public static final String fragmentShaderHigherContrast
    -
    A variant on fragmentShader that adjusts luma to make mid-range colors darker, while keeping light +
    public static final String fragmentShaderHigherContrast
    +
    A variant on fragmentShaderYCwCm that adjusts luma to make mid-range colors darker, while keeping light colors light. This is not the same as ColorfulBatch even when the contrast for ColorfulBatch's tweak is the same as what this uses (1.375 here, which is roughly 0.875f in a tweak value). ColorfulBatch does some work in the vertex shader so it may be a little faster than this approach, and it seems to have less severe effects on @@ -519,7 +585,7 @@

    fragmentShaderHigherContrast

  • fragmentShaderLowerContrast

    -
    public static final String fragmentShaderLowerContrast
    +
    public static final String fragmentShaderLowerContrast
    An alternative shader that effectively reduces luma contrast, bringing all but the darkest colors to the upper-mid luma range. This is not the same as ColorfulBatch even when the contrast for ColorfulBatch's tweak is the same as what this uses (0.625 here, which is roughly 0.125f in a tweak value). ColorfulBatch does @@ -535,8 +601,8 @@

    fragmentShaderLowerContrast

  • fragmentShaderIPT

    -
    public static String fragmentShaderIPT
    -
    Similar to fragmentShader, but this uses the very perceptually-accurate IPT color space as described by +
    public static String fragmentShaderIPT
    +
    Similar to fragmentShaderYCwCm, but this uses the very perceptually-accurate IPT color space as described by Ebner and Fairchild, instead of the custom YCwCm color space. IPT doesn't really need that much more computation to be done by the shader, but tends to make gradual changes in color much smoother. If comparing to YCwCm, then Y (luma) is like I (intensity) here, so when a Batch color has 0 for I (stored in the r channel), it makes the @@ -563,7 +629,7 @@

    fragmentShaderIPT

  • fragmentShaderIPT_HQ

    - +
    Just like fragmentShaderIPT, but gamma-corrects the input and output RGB values (which improves lightness uniformity) and uses an exponential step internally to change how colors are distributed within the gamut. These steps are more computationally expensive than the bare-bones ones in fragmentShaderIPT, but @@ -579,7 +645,7 @@

    fragmentShaderIPT_HQ

  • fragmentShaderOklab

    -
    public static String fragmentShaderOklab
    +
    public static String fragmentShaderOklab
    Just like fragmentShaderIPT_HQ, but uses the Oklab color space instead of the very similar IPT_HQ one. This also gamma-corrects the inputs and outputs, though it uses subtly different math internally. Oklab colors tend to have more variation on their L channel, which represents lightness, than their A or B channels, which @@ -598,7 +664,7 @@

    fragmentShaderOklab

  • vertexShaderHSI

    -
    public static final String vertexShaderHSI
    +
    public static final String vertexShaderHSI
    A vertex shader that does the bulk of processing HSI-format batch colors and converting them to a format fragmentShaderHSI can use. Since HSI is only a cylindrical/spherical adaptation of IPT, with identical I components and the combination of H and S in polar coordinates mapping to P and T in Cartesian coordinates, @@ -627,7 +693,7 @@

    vertexShaderHSI

  • fragmentShaderHSI

    -
    public static String fragmentShaderHSI
    +
    public static String fragmentShaderHSI
    This is an alias for fragmentShaderIPT. If used with vertexShaderHSI, you can specify a batch color using an HSL-like system.
    @@ -643,12 +709,12 @@

    fragmentShaderHSI

  • partialCodeHSL

    -
    public static final String partialCodeHSL
    +
    public static final String partialCodeHSL
    Not a full shader, this is a snippet used by most of the other HSL-based shaders to implement the complex rgb2hsl() and hsl2rgb() methods. There are also comments in the code snippet that you can use if you want to change the distribution of colors across the color wheel.
    - Credit to Sam Hocevar, https://gamedev.stackexchange.com/a/59808 . + Credit to Sam Hocevar.
    EXPERIMENTAL. Meant more for reading and editing than serious usage.
    @@ -664,7 +730,7 @@

    partialCodeHSL

  • partialCodeHSLStretched

    -
    public static final String partialCodeHSLStretched
    +
    public static final String partialCodeHSLStretched
    Adjusted-hue version of partialCodeHSL, supplying HSL to-and-from RGB conversions with a smaller range of hue used for cyan and a larger range for orange. Not currently used. This is pretty much only meant so people reading the source code and trying different variations on HSL can see some of the attempts I made. @@ -685,7 +751,7 @@

    partialCodeHSLStretched

  • partialHueRodrigues

    -
    public static final String partialHueRodrigues
    +
    public static final String partialHueRodrigues
    This GLSL snippet takes an RGB vec3 and a float that represents a hue rotation in radians, and returns the rotated RGB vec3. It is not a full shader, and is used by inserting it into shader code to provide the applyHue() method to that code. @@ -705,7 +771,7 @@

    partialHueRodrigues

  • fragmentShaderHSL

    -
    public static final String fragmentShaderHSL
    +
    public static final String fragmentShaderHSL
    Treats the color as hue, saturation, lightness, and... uh... well, this is pretty much only useful when the batch color's a is 1 . You probably want fragmentShaderHSLC or fragmentShaderHSLA.
    @@ -723,7 +789,7 @@

    fragmentShaderHSL

  • fragmentShaderRotateHSL

    -
    public static final String fragmentShaderRotateHSL
    +
    public static final String fragmentShaderRotateHSL
    I can't even remember what this does, to be honest. It's probably not what you want. Instead, you probably want fragmentShaderHSLC or fragmentShaderHSLA.
    @@ -741,7 +807,7 @@

    fragmentShaderRotateHSL

  • vertexShaderHSLC

    -
    public static final String vertexShaderHSLC
    +
    public static final String vertexShaderHSLC
    This is similar to the default vertex shader from libGDX, but also sets a varying value for contrast. It is needed if you use fragmentShaderHSLC.
    @@ -757,7 +823,7 @@

    vertexShaderHSLC

  • fragmentShaderHSLC

    -
    public static final String fragmentShaderHSLC
    +
    public static final String fragmentShaderHSLC
    Allows changing Hue/Saturation/Lightness/Contrast, with hue as a rotation. If hue continuously goes from 0 to 1, then 0 to 1, 0 to 1, and so on, then this will smoothly rotate the hue of the image.
    @@ -783,7 +849,7 @@

    fragmentShaderHSLC

  • fragmentShaderHSLA

    -
    public static final String fragmentShaderHSLA
    +
    public static final String fragmentShaderHSLA
    Allows changing Hue/Saturation/Lightness/Alpha, with hue as a rotation.
    You can generate HSLA colors using methods like FloatColors.rgb2hsl(float, float, float, float). @@ -806,7 +872,7 @@

    fragmentShaderHSLA

  • fragmentShaderHSLC2

    -
    public static final String fragmentShaderHSLC2
    +
    public static final String fragmentShaderHSLC2
    Generally a lower-quality hue rotation than fragmentShaderHSLC; this is here as a work in progress.
    You can generate HSLC colors using methods like FloatColors.rgb2hsl(float, float, float, float). @@ -828,7 +894,7 @@

    fragmentShaderHSLC2

  • fragmentShaderHSLC3

    -
    public static final String fragmentShaderHSLC3
    +
    public static final String fragmentShaderHSLC3
    Cycles lightness in a psychedelic way as hue and lightness change; not a general-purpose usage.
    You can generate HSLC colors using methods like FloatColors.rgb2hsl(float, float, float, float). @@ -848,9 +914,9 @@

    fragmentShaderHSLC3

  • -
    -

    fragmentShaderHSLPsychedelic

    -
    public static final String fragmentShaderHSLPsychedelic
    +
    +

    fragmentShaderHSL4

    +
    public static final String fragmentShaderHSL4
    Cycles hue, but not lightness; otherwise this is like fragmentShaderHSLC3 without contrast, and keeping alpha intact. Internally, this uses Sam Hocevar's RGB/HSL conversion instead of Andrey-Postelzhuk's HSLC code.
    @@ -863,7 +929,7 @@

    fragmentShaderHSLPsychedelic

    See Also:
  • @@ -872,7 +938,7 @@

    fragmentShaderHSLPsychedelic

  • fragmentShaderHSLP

    -
    public static final String fragmentShaderHSLP
    +
    public static final String fragmentShaderHSLP
    One of the more useful HSL shaders here, this takes a batch color as hue, saturation, lightness, and power, with hue as a target hue and power used to determine how much of the target color should be used. There is no neutral value for hue, saturation, or lightness, but if power is 0, then the source color will be used @@ -882,6 +948,8 @@

    fragmentShaderHSLP

    as black, the 0.3 to 0.7 range as most colors, and 1.0 white; saturation is clamped to a smaller value as lightness moves away from 0.5 (toward black or white).
    + Expects the vertex shader to be vertexShader, not the HSLC variant. +
    You can generate HSL(P) colors using methods like FloatColors.rgb2hsl(float, float, float, float).
    See Also:
    @@ -896,7 +964,7 @@

    fragmentShaderHSLP

  • fragmentShaderReplacement

    -
    public static final String fragmentShaderReplacement
    +
    public static final String fragmentShaderReplacement
    This is supposed to look for RGBA colors that are similar to search, and if it finds one, to replace it with replace (also an RGBA color). It isn't great at the searching part.
    @@ -917,7 +985,7 @@

    fragmentShaderReplacement

  • fragmentShaderFlatLightness

    - +
    A drop-in replacement for the default fragment shader that eliminates lightness differences in the output colors. Specifically, it does the normal SpriteBatch shader's step with the multiplicative batch color, converts to IPT, sets intensity to 0.5, shrinks the P and T components so the color is less saturated, and then converts back to @@ -942,7 +1010,7 @@

    fragmentShaderFlatLightness

  • fragmentShaderConfigurableContrast

    - +
    A specialized shader that can reduce lightness differences in the output colors, saturate/desaturate them, and can be configured to use some of the existing lightness in the image to add to a main flat lightness. Specifically, it takes the fragment color (typically a pixel in a texture), converts to IPT, does a calculation @@ -971,7 +1039,7 @@

    fragmentShaderConfigurableContrast

  • vertexShaderDayNight

    - +
    A day/night cycle shader that can be used without any other parts of this library. This only needs setting the uniform u_timeOfDay to any float; the rate at which you change this float affects how fast the day/night cycle occurs. This is meant to be used with fragmentShaderDayNight. Together, they make the color @@ -989,7 +1057,7 @@

    vertexShaderDayNight

  • fragmentShaderDayNight

    - +
    The fragment shader counterpart to vertexShaderDayNight; must be used with that vertex shader. See its docs for more info, particularly about the one uniform this needs set. This uses an RGBA batch color.
    @@ -1002,7 +1070,7 @@

    fragmentShaderDayNight

  • fragmentShaderCielab

    - +
    Takes a batch color in CIE LAB format (but ranging from 0 to 1 instead of its normal larger range). Adapted from This ShaderToy by nmz.
    @@ -1015,12 +1083,12 @@

    fragmentShaderCielab

  • fragmentShaderColorize

    - +
    Makes the colors in the given textures almost-grayscale, then moves their chromatic channels much closer to the batch color, without changing the lightness. The result is almost all the same hue as the batch color, and can be gray if the batch color is any grayscale color. This uses an RGB batch color for simpler usage in most code that - doesn't already use colorful-gdx. There is some contribution from the original texture, so even if the batch - color is gray, then the result will probably have some very muted colors. I hope this shader is... bearable. + doesn't already use colorful-gdx. There can be some contribution from the original texture, so even if the batch + color is gray, then the result will probably have some very muted colors.
    You can generate RGB colors using any of various methods in the rgb package, such as ColorTools.rgb(float, float, float, float). @@ -1031,7 +1099,7 @@

    fragmentShaderColorize

  • fragmentShaderColorizeOklab

    - +
    Makes the colors in the given textures almost-grayscale, then moves their chromatic channels much closer to the batch color's chromatic channels, without changing the lightness. The result is almost all the same hue as the batch color, and can be gray if the batch color is any grayscale color. The lightness of the batch color is used @@ -1049,7 +1117,7 @@

    fragmentShaderColorizeOklab

  • fragmentShaderInvertedRGB

    -
    public static final String fragmentShaderInvertedRGB
    +
    public static final String fragmentShaderInvertedRGB
    The simplest possible color-inverting shader for a SpriteBatch, this just takes each RGB channel and subtracts it from 1.0 to get the value this uses. This uses an RGBA batch color.
    @@ -1070,7 +1138,7 @@

    fragmentShaderInvertedRGB

  • fragmentShaderInvertedLightness

    - +
    Just like fragmentShaderInvertedRGB, but internally converts to Oklab, so it can invert just lightness without changing color hue or saturation. This uses an RGBA batch color.
    @@ -1083,7 +1151,7 @@

    fragmentShaderInvertedLightness

  • fragmentShaderInvertedChroma

    - +
    Just like fragmentShaderInvertedLightness, but instead of inverting lightness, this tries to change only hue, without changing lightness or (generally) saturation. This works internally by negating the A and B components of the color (as Oklab). This uses an RGBA batch color. @@ -1097,7 +1165,7 @@

    fragmentShaderInvertedChroma

  • vertexShaderHsluv

    -
    public static final String vertexShaderHsluv
    +
    public static final String vertexShaderHsluv
    This is similar to the default vertex shader from libGDX, but also does some expensive setup work for HSLuv batch colors per-vertex instead of per-fragment. It is needed if you use fragmentShaderHsluv.
    @@ -1113,7 +1181,7 @@

    vertexShaderHsluv

  • fragmentShaderHsluv

    -
    public static String fragmentShaderHsluv
    +
    public static String fragmentShaderHsluv
    Just like fragmentShaderOklab, but uses the HSLuv color space instead of the Oklab one. This also gamma-corrects the inputs and outputs, though it uses subtly different math internally.
    @@ -1148,7 +1216,7 @@

    Method Details

  • makeRGBAShader

    -
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeRGBAShader()
    +
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeRGBAShader()
    A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to lighten an image. You can assign the result to a SpriteBatch with its SpriteBatch.setShader(ShaderProgram) method. @@ -1162,26 +1230,55 @@

    makeRGBAShader

  • -
    -

    makeGammaRGBAShader

    -
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeGammaRGBAShader()
    +
    +

    makeMultiplyRGBAShader

    +
    public static com.badlogic.gdx.graphics.glutils.ShaderProgram makeMultiplyRGBAShader()
    A simple helper method that builds the simplest shader here; this shader allows tinting with light colors to lighten an image, and also smooths changes well. You can assign the result to a SpriteBatch with its SpriteBatch.setShader(ShaderProgram) method.
    You can generate RGB colors using any of various methods in the rgb package, such as + ColorTools.rgb(float, float, float, float). +
    + This was called makeGammaRGBAShader, but because it doesn't currently do any gamma correction, naming it + makeMultiplyRGBAShader seems more appropriate. makeRGBAShader() is the additive counterpart.
    +
    +
    Returns:
    +
    a ShaderProgram that uses the RGBA shader fragmentShaderMultiplyRGBA
    +
    +
    +
  • +
  • +
    +

    makeRGBABatch

    +
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeRGBABatch(float contrast)
    +
    Prepares and returns a new SpriteBatch that uses vertexShader and fragmentShaderHigherContrastRGBA + from this class, making it able to render RGBA colors from the libGDX or the rgb package. This also takes a + contrast parameter, which modifies the contrast in the higher-contrast fragment shader; if greater than + 1.0 it will make light colors lighter and dark colors darker, while if it is less than 1.0 it will make all but + the darkest colors closer to the upper-middle-range of lightness. If you want to adjust contrast per-sprite, use + a ColorfulBatch (those can adjust colors in more ways); you can + simply use new ColorfulBatch() to make one of those. Note that a SpriteBatch like this produces + won't be able to render a ColorfulSprite, but ColorfulBatch can. + ColorfulBatch also will calculate contrast differently from the shader this uses. It also takes a contrast in its + tweak value that is limited to a 0.0 to 1.0 range, rather than 0.0 on up here. One potential use for this method + is to "deep-fry" a scene's image by using very high contrast (5.0 or higher). +
    + You can generate RGB colors using any of various methods in the rgb package, such as ColorTools.rgb(float, float, float, float).
    +
    Parameters:
    +
    contrast - how much contrast should be emphasized; higher than 1.0 is more contrasting, and this should usually be between 0.1 and 5.0
    Returns:
    -
    a ShaderProgram that uses the RGBA shader fragmentShaderGammaRGBA
    +
    a freshly allocated SpriteBatch that will also have a new ShaderProgram for rendering RGB with contrast
  • -
    -

    makeBatch

    -
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatch()
    -
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShader +
    +

    makeYCwCmBatch

    +
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeYCwCmBatch()
    +
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShaderYCwCm from this class, making it able to render YCwCm colors from the ycwcm package. It won't be a ColorfulBatch (those can adjust colors in more ways); you can simply use new ColorfulBatch() to make one of those. Note that a SpriteBatch like this produces won't be able to render a ColorfulSprite, @@ -1196,10 +1293,10 @@

    makeBatch

  • -
    -

    makeBatch

    -
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatch(float contrast)
    -
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShader +
    +

    makeYCwCmBatch

    +
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeYCwCmBatch(float contrast)
    +
    Prepares and returns a new SpriteBatch that uses the default vertexShader and fragmentShaderYCwCm from this class, making it able to render YCwCm colors from the ycwcm package. This also takes a contrast parameter; if greater than 1.0 it will make light colors lighter and dark colors darker, while if it is less than 1.0 it will make all but the darkest colors closer to the upper-middle-range of lightness. @@ -1223,7 +1320,7 @@

    makeBatch

  • makeBatchHSLC

    -
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatchHSLC()
    +
    public static com.badlogic.gdx.graphics.g2d.SpriteBatch makeBatchHSLC()
    Prepares and returns a new SpriteBatch that uses vertexShaderHSLC and fragmentShaderHSLC from this class, making it interpret the SpriteBatch's color, as set by SpriteBatch.setColor(float, float, float, float), to be hue rotation, saturation change, lightness diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html index d4fa99d7..0d77a002 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/TrigTools.html @@ -2,7 +2,7 @@ -TrigTools (colorful 0.8.2 API) +TrigTools (colorful 0.8.3 API) @@ -45,14 +45,14 @@
    @@ -76,30 +76,134 @@

    Class TrigTools


  • -
    public class TrigTools +
    public final class TrigTools extends Object
    -
    Some alternative approximations to sin(), cos(), asin(), acos(), atan(), and atan2(), including the option to measure - most values in turns instead of radians (where 1 turn equals 2pi radians). The convention here is to have methods - that take input in turns or produce output in turns use a _ suffix, like sin_(double), for turns to - never be returned as a negative value but for negative turn inputs to be accepted, and for the output type to match - the input type (float input gives float output, double input gives double output). There are also some methods that - measure turns in degrees, either from -180 to 180 for atan2Degrees(float, float) or from 0 to 360 for - atan2Degrees360(float, float). +
    Various trigonometric approximations, using a lookup table for sin() and cos(), a non-tabular approximation for + sinSmooth() and cosSmooth(), a Padé approximant for tan(), and Taylor series for the inverses of sin(), cos(), and + tan(). This supplies variants for radians, degrees, and turns. This also has an atan2() approximation defined with + output in radians, degrees, and turns. The lookup-table-based sin() and cos() can be extraordinarily fast if the 64KB + table can stay in a processor cache, while the "smooth" approximations may have higher quality but perform less + quickly compared to an in-cache lookup table.
    - Created by Tommy Ettinger on 8/6/2019.
    + This is primarily derived from libGDX's MathUtils class. The main new functionalities are the variants that take or + return measurements in turns, smooth/non-tabular sinSmooth() and cosSmooth(), and double variants in + general. +
    + The asin(), acos(), and atan() methods all + use Taylor series approximations from the 1955 research study "Approximations for Digital Computers," by RAND + Corporation; though one might think such code would be obsolete over 60 years later, the approximations from that + study seem to have higher accuracy and speed than most attempts in later decades, often those aimed at DSP usage. + Even older is the basis for sinSmooth() and cosSmooth(); the versions here are updated to be more precise, but are + closely related to a 7th-century sine approximation by Bhaskara I. The update was given in + this Stack Exchange answer by WimC. Also from Stack Exchange, + this Stack Exchange answer by Soonts provided the tan() + approximation used here.
      - +
    • -
      -

      Constructor Summary

      -
      Constructors
      -
      -
      Constructor
      +
      +

      Field Summary

      +
      Fields
      +
      +
      Modifier and Type
      +
      Field
      Description
      - -
       
      +
      static final float
      + +
      +
      Multiply by this to convert from degrees to radians.
      +
      +
      static final double
      + +
      +
      Multiply by this to convert from degrees to radians.
      +
      +
      static final float
      + +
      +
      PI divided by 2f; the same as HALF_PI.
      +
      +
      static final double
      + +
      +
      Math.PI divided by 2.0; the same as HALF_PI_D.
      +
      +
      static final float
      + +
      +
      PI divided by 2f; the same as ETA.
      +
      +
      static final double
      + +
      +
      Math.PI divided by 2.0; the same as ETA_D.
      +
      +
      static final float
      + +
      +
      The float value that is closer than any other to + pi, the ratio of the circumference of a circle to its + diameter.
      +
      +
      static final double
      + +
      +
      The double value that is closer than any other to + pi, the ratio of the circumference of a circle to its + diameter.
      +
      +
      static final float
      + +
      +
      1.0f divided by PI.
      +
      +
      static final double
      + +
      +
      1.0 divided by PI.
      +
      +
      static final float
      + +
      +
      2f times PI; the same as TAU.
      +
      +
      static final double
      + +
      +
      2.0 times Math.PI; the same as TAU_D.
      +
      +
      static final float
      + +
      +
      PI divided by 4f.
      +
      +
      static final double
      + +
      +
      Math.PI divided by 4.0.
      +
      +
      static final float
      + +
      +
      Multiply by this to convert from radians to degrees.
      +
      +
      static final double
      + +
      +
      Multiply by this to convert from radians to degrees.
      +
      +
      static final float
      + +
      +
      2f times PI; the same as PI2.
      +
      +
      static final double
      + +
      +
      2.0 times Math.PI; the same as PI2_D.
      +
    • @@ -115,206 +219,261 @@

      Method Summary

      Method
      Description
      static double
      -
      acos(double x)
      +
      acos(double a)
      -
      Arc cosine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise).
      +
      Returns arccosine in radians; less accurate than Math.acos but may be faster.
      static float
      -
      acos(float x)
      +
      acos(float a)
      -
      Arc cosine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise).
      +
      Returns arccosine in radians; less accurate than Math.acos but may be faster.
      static double
      -
      acos_(double x)
      +
      acosDeg(double a)
      -
      Inverse cosine function (arccos) but with output measured in turns instead of radians.
      +
      Returns arccosine in degrees.
      static float
      -
      acos_(float x)
      +
      acosDeg(float a)
      -
      Inverse cosine function (arccos) but with output measured in turns instead of radians.
      +
      Returns arccosine in degrees.
      static double
      -
      asin(double x)
      +
      acosTurns(double a)
      -
      Arc sine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise).
      +
      Returns arccosine in turns.
      static float
      -
      asin(float x)
      +
      acosTurns(float a)
      -
      Arc sine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise).
      +
      Returns arccosine in turns.
      static double
      -
      asin_(double x)
      +
      asin(double a)
      -
      Inverse sine function (arcsine) but with output measured in turns instead of radians.
      +
      Returns arcsine in radians; less accurate than Math.asin but may be faster.
      static float
      -
      asin_(float x)
      +
      asin(float a)
      -
      Inverse sine function (arcsine) but with output measured in turns instead of radians.
      +
      Returns arcsine in radians; less accurate than Math.asin but may be faster.
      +
      +
      static double
      +
      asinDeg(double a)
      +
      +
      Returns arcsine in degrees.
      +
      +
      static float
      +
      asinDeg(float a)
      +
      +
      Returns arcsine in degrees.
      +
      +
      static double
      +
      asinTurns(double a)
      +
      +
      Returns arcsine in turns.
      +
      +
      static float
      +
      asinTurns(float a)
      +
      +
      Returns arcsine in turns.
      static double
      atan(double i)
      -
      Arc tangent approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise).
      +
      Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise).
      static float
      atan(float i)
      -
      Arc tangent approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise).
      +
      Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise).
      static double
      atan2(double y, double x)
      -
      Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 - approximation.
      +
      Close approximation of the frequently-used trigonometric method atan2, using radians.
      static float
      atan2(float y, float x)
      -
      Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 - approximation.
      +
      Close approximation of the frequently-used trigonometric method atan2, using radians.
      static double
      -
      atan2_(double y, +
      atan2Deg(double y, double x)
      -
      Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as - doubles and returning an angle measured in turns from 0.0 to 1.0 (inclusive), with one cycle over the range - equivalent to 360 degrees or 2PI radians.
      +
      Close approximation of the frequently-used trigonometric method atan2, using positive or negative degrees.
      static float
      -
      atan2_(float y, +
      atan2Deg(float y, float x)
      -
      Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as floats - and returning an angle measured in turns from 0.0f to 1.0f, with one cycle over the range equivalent to 360 - degrees or 2PI radians.
      +
      Close approximation of the frequently-used trigonometric method atan2, using positive or negative degrees.
      static double
      -
      atan2Degrees(double y, +
      atan2Deg360(double y, double x)
      -
      Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision - than libGDX's atan2 approximation.
      +
      Close approximation of the frequently-used trigonometric method atan2, using non-negative degrees only.
      static float
      -
      atan2Degrees(float y, +
      atan2Deg360(float y, float x)
      -
      Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision - than libGDX's atan2 approximation.
      +
      Close approximation of the frequently-used trigonometric method atan2, using non-negative degrees only.
      static double
      -
      atan2Degrees360(double y, +
      atan2Turns(double y, double x)
      -
      Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as - doubles and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range - equivalent to 2PI radians or 1 turn.
      +
      Close approximation of the frequently-used trigonometric method atan2, using non-negative turns only.
      static float
      -
      atan2Degrees360(float y, +
      atan2Turns(float y, float x)
      -
      Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as - floats and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range - equivalent to 2PI radians or 1 turn.
      +
      Close approximation of the frequently-used trigonometric method atan2, using non-negative turns only.
      static double
      -
      atanDegrees(double i)
      +
      atanDeg(double i)
      -
      Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise).
      +
      Arc tangent approximation returning a value measured in positive or negative degrees, using an algorithm from the + 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 11's algorithm, + which is the fourth-fastest and fourth-least precise).
      static float
      -
      atanDegrees(float i)
      +
      atanDeg(float i)
      -
      Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise).
      +
      Arc tangent approximation returning a value measured in positive or negative degrees, using an algorithm from the + 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 11's algorithm, + which is the fourth-fastest and fourth-least precise).
      static double
      -
      cos(double radians)
      +
      atanTurns(double i)
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x - faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise - and sometimes-faster MathUtils.cos() method.
      +
      Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise).
      static float
      -
      cos(float radians)
      +
      atanTurns(float i)
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x - faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should - consider its more-precise and sometimes-faster MathUtils.cos() method.
      +
      Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise).
      static double
      -
      cos_(double turns)
      +
      atanUnchecked(double i)
      -
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one - turn is equal to 360 degrees or two*PI radians.
      +
      A variant on atan(float) that does not tolerate infinite inputs for speed reasons.
      -
      static float
      -
      cos_(float turns)
      +
      static double
      +
      atanUncheckedDeg(double i)
      +
      +
      A variant on atanDeg(float) that does not tolerate infinite inputs for speed reasons.
      +
      +
      static double
      + +
      +
      A variant on atanTurns(float) that does not tolerate infinite inputs for speed reasons.
      +
      +
      static double
      +
      cos(double radians)
      +
      +
      A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century.
      +
      +
      static float
      +
      cos(float radians)
      +
      +
      A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century.
      +
      +
      static double
      +
      cosDeg(double degrees)
      -
      A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it - also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
      +
      A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century.
      static float
      -
      cosDegrees(float degrees)
      +
      cosDeg(float degrees)
      -
      A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x - faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should - consider its more-precise and sometimes-faster MathUtils.cosDeg() method.
      +
      A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century.
      +
      +
      static double
      +
      cosTurns(double turns)
      +
      +
      A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century.
      +
      +
      static float
      +
      cosTurns(float turns)
      +
      +
      A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century.
      static double
      sin(double radians)
      -
      A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x - faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise - and sometimes-faster MathUtils.sin() method.
      +
      A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century.
      static float
      sin(float radians)
      -
      A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x - faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should - consider its more-precise and sometimes-faster MathUtils.sin() method.
      +
      A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century.
      static double
      -
      sin_(double turns)
      +
      sinDeg(double degrees)
      -
      A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one - turn is equal to 360 degrees or two*PI radians.
      +
      A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century.
      static float
      -
      sin_(float turns)
      +
      sinDeg(float degrees)
      -
      A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it - also takes and returns a float); one turn is equal to 360 degrees or two*PI radians.
      +
      A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century.
      -
      static float
      -
      sinDegrees(float degrees)
      +
      static double
      +
      sinTurns(double turns)
      +
      +
      A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century.
      +
      +
      static float
      +
      sinTurns(float turns)
      +
      +
      A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century.
      +
      +
      static double
      +
      tan(double radians)
      +
      +
      Returns the tangent in radians, using a Padé approximant.
      +
      +
      static float
      +
      tan(float radians)
      +
      +
      Returns the tangent in radians, using a Padé approximant.
      +
      +
      static double
      +
      tanDeg(double degrees)
      +
      +
      Returns the tangent in degrees, using a Padé approximant.
      +
      +
      static float
      +
      tanDeg(float degrees)
      +
      +
      Returns the tangent in degrees, using a Padé approximant.
      +
      +
      static double
      +
      tanTurns(double turns)
      -
      A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x - faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should - consider its more-precise and sometimes-faster MathUtils.sinDeg() method.
      +
      Returns the tangent in turns, using a Padé approximant.
      +
      +
      static float
      +
      tanTurns(float turns)
      +
      +
      Returns the tangent in turns, using a Padé approximant.
      @@ -328,15 +487,283 @@

      Methods inherited from cl

      - +
    • -
      -

      Constructor Details

      +
      +

      Field Details

      @@ -348,759 +775,882 @@

      TrigTools

      Method Details

      • -
        -

        sin

        -
        public static double sin(double radians)
        -
        A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x - faster sin() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise - and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a - lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better - with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians, - which may technically be any double (but this will lose precision on fairly large doubles, such as those that are - larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This - is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at - all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for - potentially higher errors, though. -
        - The error for this double version is extremely close to the float version, sin(float), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. -
        - The technique for sine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
        +
        +

        tan

        +
        public static float tan(float radians)
        +
        Returns the tangent in radians, using a Padé approximant. + Padé approximants tend to be most accurate when they aren't producing results of extreme magnitude; in the tan() + function, those results occur on and near odd multiples of PI/2, and this method is least accurate when + given inputs near those multiples. +
        For inputs between -1.57 to 1.57 (just inside half-pi), separated by 0x1p-20f, + absolute error is 0.00890192, relative error is 0.00000090, and the maximum error is 17.98901367 when given + 1.56999838. The maximum error might seem concerning, but it's the difference between the correct 1253.22167969 + and the 1235.23266602 this returns, so for many purposes the difference won't be noticeable. +
        For inputs between -1.55 to 1.55 (getting less close to half-pi), separated by 0x1p-20f, absolute error is + 0.00023368, relative error is -0.00000009, and the maximum error is 0.02355957 when given -1.54996467. The + maximum error is the difference between the correct -47.99691010 and the -47.97335052 this returns. +
        While you don't have to use a dedicated method for tan(), and you can use sin(x)/cos(x), + approximating tan() in this way is very susceptible to error building up from any of sin(), cos() or the + division. Where this tan() has a maximum error in the -1.55 to 1.55 range of 0.02355957, the simpler division + technique on the same range has a maximum error of 1.25724030 (about 50 times worse), as well as larger absolute + and relative errors. Casting the double result of Math.tan(double) to float will get the highest + precision, but can be anywhere from 2.5x to nearly 4x slower than this, depending on JVM. +
        Based on this Stack Exchange answer by Soonts.
        Parameters:
        -
        radians - an angle in radians as a double, often from 0 to pi * 2, though not required to be.
        +
        radians - a float angle in radians, where 0 to PI2 is one rotation
        Returns:
        -
        the sine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
        +
        a float approximation of tan()
      • -
        -

        cos

        -
        public static double cos(double radians)
        -
        A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x - faster cos() calls in benchmarking; if you have access to libGDX you should consider its sometimes-more-precise - and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a - lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better - with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians, - which may technically be any double (but this will lose precision on fairly large doubles, such as those that are - larger than Long.MAX_VALUE, because those doubles themselves will lose precision at that scale). This - is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at - all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for - potentially higher errors, though. -
        - The error for this double version is extremely close to the float version, cos(float), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. -
        - The technique for cosine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
        +
        +

        tanDeg

        +
        public static float tanDeg(float degrees)
        +
        Returns the tangent in degrees, using a Padé approximant. + Based on this Stack Exchange answer.
        +
        +
        Parameters:
        +
        degrees - an angle in degrees, where 0 to 360 is one rotation
        +
        Returns:
        +
        a float approximation of tan()
        +
        +
        +
      • +
      • +
        +

        tanTurns

        +
        public static float tanTurns(float turns)
        +
        Returns the tangent in turns, using a Padé approximant. + Based on this Stack Exchange answer.
        Parameters:
        -
        radians - an angle in radians as a double, often from 0 to pi * 2, though not required to be.
        +
        turns - an angle in turns, where 0 to 1 is one rotation
        Returns:
        -
        the cosine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
        +
        a float approximation of tan()
        +
        +
        +
      • +
      • +
        +

        tan

        +
        public static double tan(double radians)
        +
        Returns the tangent in radians, using a Padé approximant. + Based on this Stack Exchange answer.
        +
        +
        Parameters:
        +
        radians - a double angle in radians, where 0 to PI2 is one rotation
        +
        Returns:
        +
        a double approximation of tan()
        +
        +
        +
      • +
      • +
        +

        tanDeg

        +
        public static double tanDeg(double degrees)
        +
        Returns the tangent in degrees, using a Padé approximant. + Based on this Stack Exchange answer.
        +
        +
        Parameters:
        +
        degrees - an angle in degrees, where 0 to 360 is one rotation
        +
        Returns:
        +
        a double approximation of tan()
        +
        +
        +
      • +
      • +
        +

        tanTurns

        +
        public static double tanTurns(double turns)
        +
        Returns the tangent in turns, using a Padé approximant. + Based on this Stack Exchange answer.
        +
        +
        Parameters:
        +
        turns - an angle in turns, where 0 to 1 is one rotation
        +
        Returns:
        +
        a double approximation of tan()
      • sin

        -
        public static float sin(float radians)
        -
        A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x - faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should - consider its more-precise and sometimes-faster MathUtils.sin() method. Because this method doesn't rely on a - lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better - with this method than with MathUtils. Takes the same arguments Math.sin() does, so one angle in radians, - which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This - is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - sin(). The difference between the result of this method and Math.sin(double) should be under 0.0011 at - all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for - potentially higher errors, though. +
        public static float sin(float radians)
        +
        A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century. + This takes an input in radians, and takes and returns floats. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of sin(); in particular, only 16384 + outputs are possible from MathUtils.sin(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible sin() returns, you can use this.
        - The error for this float version is extremely close to the double version, sin(double), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. -
        - The technique for sine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
        + Credit to This Stack Exchange answer by WimC.
        Parameters:
        -
        radians - an angle in radians as a float, often from 0 to pi * 2, though not required to be.
        +
        radians - an angle in radians; most precise between -PI2 and PI2
        Returns:
        -
        the sine of the given angle, as a float between -1f and 1f (both inclusive)
        +
        the approximate sine of the given angle, from -1 to 1 inclusive
      • cos

        -
        public static float cos(float radians)
        -
        A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x - faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX you should - consider its more-precise and sometimes-faster MathUtils.cos() method. Because this method doesn't rely on a - lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better - with this method than with MathUtils. Takes the same arguments Math.cos() does, so one angle in radians, - which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). This - is closely related to a cubic sway, but the shape of the output when graphed is almost identical to - cos(). The difference between the result of this method and Math.cos(double) should be under 0.0011 at - all points between -pi and pi, with an average difference of about 0.0005; not all points have been checked for - potentially higher errors, though. -
        - The error for this float version is extremely close to the double version, cos(double), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. +
        public static float cos(float radians)
        +
        A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century. This takes an input in radians, and takes and returns floats. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of cos(); in particular, only 16384 + outputs are possible from MathUtils.cos(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible cos() returns, you can use this.
        - The technique for cosine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
        + Credit to This Stack Exchange answer by WimC.
        Parameters:
        -
        radians - an angle in radians as a float, often from 0 to pi * 2, though not required to be.
        +
        radians - an angle in radians; most precise between -PI2 and PI2
        Returns:
        -
        the cosine of the given angle, as a float between -1f and 1f (both inclusive)
        +
        the approximate cosine of the given angle, from -1 to 1 inclusive
      • -
        -

        sinDegrees

        -
        public static float sinDegrees(float degrees)
        -
        A fairly-close approximation of Math.sin(double) that can be significantly faster (between 8x and 80x - faster sin() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should - consider its more-precise and sometimes-faster MathUtils.sinDeg() method. Because this method doesn't rely on a - lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better - with this method than with MathUtils. Takes one angle in degrees, - which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The - difference between the result of this method and Math.sin(double) should be under 0.0011 at - all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for - potentially higher errors, though. -
        - The error for this float version is extremely close to the double version, sin(double), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. -
        - Unlike in previous versions of this method, the sign of the input doesn't affect performance here, at least not - by a measurable amount. +
        +

        sin

        +
        public static double sin(double radians)
        +
        A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century. + This takes an input in radians, and takes and returns doubles. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of sin(); in particular, only 16384 + outputs are possible from MathUtils.sin(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible sin() returns, you can use this.
        - The technique for sine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
        + Credit to This Stack Exchange answer by WimC.
        Parameters:
        -
        degrees - an angle in degrees as a float, often from 0 to 360, though not required to be.
        +
        radians - an angle in radians; most precise between -PI2 and PI2
        Returns:
        -
        the sine of the given angle, as a float between -1f and 1f (both inclusive)
        +
        the approximate sine of the given angle, from -1 to 1 inclusive
      • -
        -

        cosDegrees

        -
        public static float cosDegrees(float degrees)
        -
        A fairly-close approximation of Math.cos(double) that can be significantly faster (between 8x and 80x - faster cos() calls in benchmarking, and both takes and returns floats; if you have access to libGDX, you should - consider its more-precise and sometimes-faster MathUtils.cosDeg() method. Because this method doesn't rely on a - lookup table, where libGDX's MathUtils does, applications that have a bottleneck on memory may perform better - with this method than with MathUtils. Takes one angle in degrees, - which may technically be any float (but this will lose precision on fairly large floats, such as those that are - larger than Integer.MAX_VALUE, because those floats themselves will lose precision at that scale). The - difference between the result of this method and Math.cos(double) should be under 0.0011 at - all points between -360 and 360, with an average difference of about 0.0005; not all points have been checked for - potentially higher errors, though. -
        - The error for this float version is extremely close to the double version, cos(double), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. -
        - Unlike in previous versions of this method, the sign of the input doesn't affect performance here, at least not - by a measurable amount. +
        +

        cos

        +
        public static double cos(double radians)
        +
        A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century. This takes an input in radians, and takes and returns doubles. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of cos(); in particular, only 16384 + outputs are possible from MathUtils.cos(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible cos() returns, you can use this.
        - The technique for cosine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any float to the valid input range.
        + Credit to This Stack Exchange answer by WimC.
        Parameters:
        -
        degrees - an angle in degrees as a float, often from 0 to pi * 2, though not required to be.
        +
        radians - an angle in radians; most precise between -PI2 and PI2
        Returns:
        -
        the cosine of the given angle, as a float between -1f and 1f (both inclusive)
        +
        the approximate cosine of the given angle, from -1 to 1 inclusive
      • -
        -

        sin_

        -
        public static double sin_(double turns)
        -
        A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians; one - turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; - to make a sine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide - the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also - called brad (with 256 brad equal to 360 degrees), you would divide by 256.0 or multiply by 0.00390625 before - passing that value here. The brad case is especially useful because you can use a byte for any brad values, and - adding up those brad values will wrap correctly (256 brad goes back to 0) while keeping perfect precision for the - results (you still divide by 256.0 when you pass the brad value to this method). +
        +

        sinDeg

        +
        public static float sinDeg(float degrees)
        +
        A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century. + This takes an input in degrees, and takes and returns floats. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of sinDeg(); in particular, only 16384 + outputs are possible from MathUtils.sinDeg(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible sinDeg() returns, you can use this.
        - The error for this double version is extremely close to the float version, sin_(float), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. + Credit to This Stack Exchange answer by WimC.
        +
        +
        Parameters:
        +
        degrees - an angle in degrees; most precise between -360 and 360
        +
        Returns:
        +
        the approximate sine of the given angle, from -1 to 1 inclusive
        +
        +
        +
      • +
      • +
        +

        cosDeg

        +
        public static float cosDeg(float degrees)
        +
        A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century. This takes an input in degrees, and takes and returns floats. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of cosDeg(); in particular, only 16384 + outputs are possible from MathUtils.cosDeg(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible cosDeg() returns, you can use this.
        - The technique for sine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
        + Credit to This Stack Exchange answer by WimC.
    Parameters:
    -
    turns - an angle as a fraction of a turn as a double, with 0.5 here equivalent to PI radians in cos(double)
    +
    degrees - an angle in degrees; most precise between -360 and 360
    Returns:
    -
    the sine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    +
    the approximate cosine of the given angle, from -1 to 1 inclusive
  • -
    -

    cos_

    -
    public static double cos_(double turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians; one - turn is equal to 360 degrees or two*PI radians. This can be useful as a building block for other measurements; - to make a cosine method that takes its input in grad (with 400 grad equal to 360 degrees), you would just divide - the grad value by 400.0 (or multiply it by 0.0025) and pass it to this method. Similarly for binary degrees, also - called brad (with 256 brad equal to 360 degrees), you would divide by 256.0 or multiply by 0.00390625 before - passing that value here. The brad case is especially useful because you can use a byte for any brad values, and - adding up those brad values will wrap correctly (256 brad goes back to 0) while keeping perfect precision for the - results (you still divide by 256.0 when you pass the brad value to this method). +
    +

    sinDeg

    +
    public static double sinDeg(double degrees)
    +
    A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century. + This takes an input in degrees, and takes and returns doubles. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of sinDeg(); in particular, only 16384 + outputs are possible from MathUtils.sinDeg(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible sinDeg() returns, you can use this.
    - The error for this double version is extremely close to the float version, cos_(float), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. + Credit to This Stack Exchange answer by WimC.
    +
    +
    Parameters:
    +
    degrees - an angle in degrees; most precise between -360 and 360
    +
    Returns:
    +
    the approximate sine of the given angle, from -1 to 1 inclusive
    +
    +
    +
  • +
  • +
    +

    cosDeg

    +
    public static double cosDeg(double degrees)
    +
    A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century. This takes an input in degrees, and takes and returns doubles. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of cosDeg(); in particular, only 16384 + outputs are possible from MathUtils.cosDeg(float), and about half of those are duplicates, so if you need + more possible results in-between the roughly 8192 possible cosDeg() returns, you can use this.
    - The technique for cosine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    + Credit to This Stack Exchange answer by WimC.
  • Parameters:
    -
    turns - an angle as a fraction of a turn as a double, with 0.5 here equivalent to PI radians in cos(double)
    +
    degrees - an angle in degrees; most precise between -360 and 360
    Returns:
    -
    the cosine of the given angle, as a double between -1.0 and 1.0 (both inclusive)
    +
    the approximate cosine of the given angle, from -1 to 1 inclusive
  • -
    -

    sin_

    -
    public static float sin_(float turns)
    -
    A variation on Math.sin(double) that takes its input as a fraction of a turn instead of in radians (it - also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a - building block for other measurements; to make a sine method that takes its input in grad (with 400 grad equal to - 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this - method. Similarly for binary degrees, also called brad (with 256 brad equal to 360 degrees), you would divide by - 256.0 or multiply by 0.00390625 before passing that value here. The brad case is especially useful because you - can use a byte for any brad values, and adding up those brad values will wrap correctly (256 brad goes back to 0) - while keeping perfect precision for the results (you still divide by 256.0 when you pass the brad value to this - method). +
    +

    sinTurns

    +
    public static float sinTurns(float turns)
    +
    A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century. + This takes an input in turns, and takes and returns floats. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of sin(); in particular, only 16384 + outputs are possible from MathUtils.sin(float), and about half of those are duplicates, so if you + need more possible results in-between the roughly 8192 possible sin() returns, you can use this.
    - The error for this float version is extremely close to the double version, sin_(double), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. + Credit to This Stack Exchange answer by WimC.
    +
    +
    Parameters:
    +
    turns - an angle in turns; most precise between -1 and 1
    +
    Returns:
    +
    the approximate sine of the given angle, from -1 to 1 inclusive
    +
    +
    +
  • +
  • +
    +

    cosTurns

    +
    public static float cosTurns(float turns)
    +
    A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century. This takes an input in turns, and takes and returns floats. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of cos(); in particular, only 16384 + outputs are possible from MathUtils.cos(float), and about half of those are duplicates, so if you + need more possible results in-between the roughly 8192 possible cos() returns, you can use this.
    - The technique for sine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    + Credit to This Stack Exchange answer by WimC.
  • Parameters:
    -
    turns - an angle as a fraction of a turn as a float, with 0.5 here equivalent to PI radians in cos(double)
    +
    turns - an angle in turns; most precise between -1 and 1
    Returns:
    -
    the sine of the given angle, as a float between -1.0 and 1.0 (both inclusive)
    +
    the approximate cosine of the given angle, from -1 to 1 inclusive
  • -
    -

    cos_

    -
    public static float cos_(float turns)
    -
    A variation on Math.cos(double) that takes its input as a fraction of a turn instead of in radians (it - also takes and returns a float); one turn is equal to 360 degrees or two*PI radians. This can be useful as a - building block for other measurements; to make a cosine method that takes its input in grad (with 400 grad equal - to 360 degrees), you would just divide the grad value by 400.0 (or multiply it by 0.0025) and pass it to this - method. Similarly for binary degrees, also called brad (with 256 brad equal to 360 degrees), you would divide by - 256.0 or multiply by 0.00390625 before passing that value here. The brad case is especially useful because you - can use a byte for any brad values, and adding up those brad values will wrap correctly (256 brad goes back to 0) - while keeping perfect precision for the results (you still divide by 256.0 when you pass the brad value to this - method). +
    +

    sinTurns

    +
    public static double sinTurns(double turns)
    +
    A smooth sine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th century. + This takes an input in turns, and takes and returns doubles. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of sin(); in particular, only 16384 + outputs are possible from MathUtils.sin(float), and about half of those are duplicates, so if you + need more possible results in-between the roughly 8192 possible sin() returns, you can use this.
    - The error for this float version is extremely close to the float version, cos_(double), so you should - choose based on what type you have as input and/or want to return rather than on quality concerns. Coercion - between float and double takes about as long as this method normally takes to run (or longer), so if you have - floats you should usually use methods that take floats (or return floats, if assigning the result to a float), - and likewise for doubles. + Credit to This Stack Exchange answer by WimC.
    +
    +
    Parameters:
    +
    turns - an angle in turns; most precise between -1 and 1
    +
    Returns:
    +
    the approximate sine of the given angle, from -1 to 1 inclusive
    +
    +
    +
  • +
  • +
    +

    cosTurns

    +
    public static double cosTurns(double turns)
    +
    A smooth cosine approximation (not table-based) built around Bhaskara I's sine approximation from the 7th + century. This takes an input in turns, and takes and returns doubles. + This was updated more recently than the 7th century, and has better precision than the original. You may want to + use this if you notice statistical issues with the tabular approximation of cos(); in particular, only 16384 + outputs are possible from MathUtils.cos(float), and about half of those are duplicates, so if you + need more possible results in-between the roughly 8192 possible cos() returns, you can use this.
    - The technique for cosine approximation is mostly from - this archived DevMaster thread, - with credit to "Nick". Changes have been made to accelerate wrapping from any double to the valid input range.
    + Credit to This Stack Exchange answer by WimC.
  • Parameters:
    -
    turns - an angle as a fraction of a turn as a float, with 0.5 here equivalent to PI radians in cos(double)
    +
    turns - an angle in turns; most precise between -1 and 1
    Returns:
    -
    the cosine of the given angle, as a float between -1.0 and 1.0 (both inclusive)
    +
    the approximate cosine of the given angle, from -1 to 1 inclusive
  • -
    -

    atan

    -
    public static double atan(double i)
    -
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), - but is somewhat less precise than Math's implementation.
    +
    +

    atanUnchecked

    +
    public static double atanUnchecked(double i)
    +
    A variant on atan(float) that does not tolerate infinite inputs for speed reasons. This can be given a double + parameter, but is otherwise the same as atan(float), and returns a float like that method. It uses the same approximation, + from sheet 11 of "Approximations for Digital Computers." This is mostly meant to be used inside + atan2(float, float), but it may be a tiny bit faster than atan(float) in other code.
    Parameters:
    -
    i - an input to the inverse tangent function; any double is accepted
    +
    i - any finite double or float, but more commonly a float
    Returns:
    -
    an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +
    an output from the inverse tangent function in radians, from -HALF_PI to HALF_PI inclusive
  • -
    -

    atan

    -
    public static float atan(float i)
    -
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), - but is somewhat less precise than Math's implementation.
    +
    +

    atanUncheckedTurns

    +
    public static double atanUncheckedTurns(double i)
    +
    A variant on atanTurns(float) that does not tolerate infinite inputs for speed reasons. This can be given a double + parameter, but is otherwise the same as atanTurns(float), but returns a double in case external code needs higher precision. + It uses the same approximation, from sheet 11 of "Approximations for Digital Computers." This is mostly meant to be used inside + atan2Turns(float, float), but it may be a tiny bit faster than atanTurns(float) in other code.
    Parameters:
    -
    i - an input to the inverse tangent function; any float is accepted
    +
    i - any finite double or float, but more commonly a float
    Returns:
    -
    an output from the inverse tangent function, from PI/-2.0 to PI/2.0 inclusive
    +
    an output from the inverse tangent function in turns, from -0.25 to 0.25 inclusive
  • -
    -

    atan2

    -
    public static double atan2(double y, - double x)
    -
    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 - approximation. Maximum error is below 0.00009 radians. - Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in radians. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for - Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; - MathUtils seems to have worse average error, though. -
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(double) - method, and the small code to make that work as atan2() was worked out from Wikipedia. -
    - See also atan2_(double, double) if you don't want a mess converting to degrees or some other - measurement, since that method returns an angle from 0f (equal to 0 degrees) to 1f (equal to 360 degrees). You - can also use atan2Degrees(double, double) or atan2Degrees360(double, double) to produce a - result in degrees, either from -180 to 180 or 0 to 360.
    +
    +

    atanUncheckedDeg

    +
    public static double atanUncheckedDeg(double i)
    +
    A variant on atanDeg(float) that does not tolerate infinite inputs for speed reasons. This can be given a double + parameter, but is otherwise the same as atanDeg(float), and returns a float like that method. It uses the same approximation, + from sheet 11 of "Approximations for Digital Computers." This is mostly meant to be used inside + atan2(float, float), but it may be a tiny bit faster than atanDeg(float) in other code.
    Parameters:
    -
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +
    i - any finite double or float, but more commonly a float
    Returns:
    -
    the angle to the given point, in radians as a double; ranges from -PI to PI
    +
    an output from the inverse tangent function in degrees, from -90 to 90 inclusive
  • atan2

    -
    public static float atan2(float y, +
    public static float atan2(float y, float x)
    -
    Close approximation of the frequently-used trigonometric method atan2, with higher precision than libGDX's atan2 - approximation. Maximum error is below 0.00009 radians. - Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in radians. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for - Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; - MathUtils seems to have worse average error, though. +
    Close approximation of the frequently-used trigonometric method atan2, using radians. Average error is + 1.057E-6 radians; maximum error is 1.922E-6. Takes y and x (in that unusual order) as + floats, and returns the angle from the origin to that point in radians. It is about 4 times faster than + Math.atan2(double, double) (roughly 15 ns instead of roughly 60 ns for Math, on Java 8 HotSpot).
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(float) - method, and the small code to make that work as atan2() was worked out from Wikipedia. -
    - See also atan2_(float, float) if you don't want a mess converting to degrees or some other measurement, - since that method returns an angle from 0f (equal to 0 degrees) to 1f (equal to 360 degrees). You can also use - atan2Degrees(float, float) or atan2Degrees360(float, float) to produce a result in degrees, - either from -180 to 180 or 0 to 360.
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(float) method, and that cleanly + translates to atan2().
    Parameters:
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    the angle to the given point, in radians as a float; ranges from -PI to PI
    +
    the angle to the given point, in radians as a float; ranges from -PI to PI
  • -
    -

    atan2_

    -
    public static double atan2_(double y, - double x)
    -
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as - doubles and returning an angle measured in turns from 0.0 to 1.0 (inclusive), with one cycle over the range - equivalent to 360 degrees or 2PI radians. You can multiply the angle by 6.2831855f to change to radians, - or by 360f to change to degrees. Takes y and x (in that unusual order) as doubles. Will never return a - negative number, which may help avoid costly floating-point modulus when you actually want a positive number. -
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(float) - method, and the small code to make that work as atan2_() was worked out from Wikipedia. +
    +

    atan2Deg

    +
    public static float atan2Deg(float y, + float x)
    +
    Close approximation of the frequently-used trigonometric method atan2, using positive or negative degrees. + Average absolute error is 0.00006037 degrees; relative error is 0 degrees, maximum error is 0.00010396 degrees. + Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in degrees.
    - Note that atan2(double, double) returns an angle in radians and can return negative results, which may - be fine for many tasks; these two methods are extremely close in implementation and speed. There are also - atan2Degrees(double, double) and atan2Degrees360(double, double), which provide an angle in - degrees, either from -180 to 180 or 0 to 360.
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(float) method, and that cleanly + translates to atan2Deg().
    Parameters:
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    the angle to the given point, as a double from 0.0 to 1.0, inclusive
    +
    the angle to the given point, in degrees as a float; ranges from -180 to 180
  • -
    -

    atan2_

    -
    public static float atan2_(float y, +
    +

    atan2Deg360

    +
    public static float atan2Deg360(float y, float x)
    -
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as floats - and returning an angle measured in turns from 0.0f to 1.0f, with one cycle over the range equivalent to 360 - degrees or 2PI radians. You can multiply the angle by 6.2831855f to change to radians, or by 360f - to change to degrees. Takes y and x (in that unusual order) as floats. Will never return a negative number, which - may help avoid costly floating-point modulus when you actually want a positive number. -
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(float) - method, and the small code to make that work as atan2_() was worked out from Wikipedia. +
    Close approximation of the frequently-used trigonometric method atan2, using non-negative degrees only. + Average absolute error is 0.00006045 degrees; relative error is 0 degrees; maximum error is 0.00011178 degrees. + Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in degrees.
    - Note that atan2(float, float) returns an angle in radians and can return negative results, which may - be fine for many tasks; these two methods are extremely close in implementation and speed. There are also - atan2Degrees(float, float) and atan2Degrees360(float, float), which provide an angle in - degrees, either from -180 to 180 or 0 to 360.
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(float) method, and that cleanly + translates to atan2Deg360().
    Parameters:
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    the angle to the given point, as a float from 0.0f to 1.0f, inclusive
    +
    the angle to the given point, in degrees as a float; ranges from 0 to 360
  • -
    -

    atanDegrees

    -
    public static double atanDegrees(double i)
    -
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), - but is somewhat less precise than Math's implementation. This implementation can return negative or positive - results in degrees.
    +
    +

    atan2Turns

    +
    public static float atan2Turns(float y, + float x)
    +
    Close approximation of the frequently-used trigonometric method atan2, using non-negative turns only. + Average absolute error is 0.00000030 turns; relative error is 0 turns; maximum error is 0.00000017 turns. + Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in turns. + Because this always returns a float between 0.0 (inclusive) and 1.0 (exclusive), it can be useful for various + kinds of calculations that must store angles as a small fraction, such as packing a hue angle into a byte. +
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(float) method, and that cleanly + translates to atan2Turns().
    Parameters:
    -
    i - an input to the inverse tangent function; any double is accepted
    +
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    an output from the inverse tangent function in degrees, from -90 to 90 inclusive
    +
    the angle to the given point, in turns as a float; ranges from 0.0f to 1.0f
  • -
    -

    atanDegrees

    -
    public static float atanDegrees(float i)
    -
    Arc tangent approximation measured in degrees, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 9's algorithm, which is the - second-fastest and second-least precise). This method is usually much faster than Math.atan(double), - but is somewhat less precise than Math's implementation. This implementation can return negative or positive - results in degrees.
    +
    +

    atan2

    +
    public static double atan2(double y, + double x)
    +
    Close approximation of the frequently-used trigonometric method atan2, using radians. Average error is + 1.057E-6 radians; maximum error is 1.922E-6. Takes y and x (in that unusual order) as + doubles, and returns the angle from the origin to that point in radians. It is about 4 times faster than + Math.atan2(double, double) (roughly 15 ns instead of roughly 60 ns for Math, on Java 8 HotSpot). +
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(double) method, and that cleanly + translates to atan2().
    Parameters:
    -
    i - an input to the inverse tangent function; any float is accepted
    +
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    +
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    an output from the inverse tangent function, from -90 to 90 inclusive
    +
    the angle to the given point, in radians as a double; ranges from -PI to PI
  • -
    -

    atan2Degrees

    -
    public static double atan2Degrees(double y, +
    +

    atan2Deg

    +
    public static double atan2Deg(double y, double x)
    -
    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision - than libGDX's atan2 approximation. The range for this is -180 to 180. +
    Close approximation of the frequently-used trigonometric method atan2, using positive or negative degrees. + Average absolute error is 0.00006037 degrees; relative error is 0 degrees, maximum error is 0.00010396 degrees. Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in degrees. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for - Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; - MathUtils seems to have worse average error, as well. -
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(double) - method, and the small code to make that work as atan2Degrees() was worked out from Wikipedia.
    - See also atan2_(double, double) for a version that returns a measurement as a fraction of a turn, or - atan2(double, double) for the typical radians. You - can also use atan2Degrees360(double, double) to produce a result in degrees from 0 to 360.
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(double) method, and that cleanly + translates to atan2Deg().
    Parameters:
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    the angle to the given point, in radians as a double; ranges from -180 to 180
    +
    the angle to the given point, in degrees as a double; ranges from -180 to 180
  • -
    -

    atan2Degrees

    -
    public static float atan2Degrees(float y, - float x)
    -
    Close approximation of the frequently-used trigonometric method atan2 measured in degrees, with higher precision - than libGDX's atan2 approximation. The range for this is -180 to 180. - Takes y and x (in that unusual order) as floats, and returns the angle from the origin to that point in degrees. - It is about 5 times faster than Math.atan2(double, double) (roughly 12 ns instead of roughly 62 ns for - Math, on Java 8 HotSpot). It is slightly faster than libGDX' MathUtils approximation of the same method; - MathUtils seems to have worse average error, as well. -
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(float) - method, and the small code to make that work as atan2Degrees() was worked out from Wikipedia. +
    +

    atan2Deg360

    +
    public static double atan2Deg360(double y, + double x)
    +
    Close approximation of the frequently-used trigonometric method atan2, using non-negative degrees only. + Average absolute error is 0.00006045 degrees; relative error is 0 degrees; maximum error is 0.00011178 degrees. + Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in degrees.
    - See also atan2_(float, float) for a version that returns a measurement as a fraction of a turn, or - atan2(float, float) for the typical radians. You - can also use atan2Degrees360(float, float) to produce a result in degrees from 0 to 360.
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(double) method, and that cleanly + translates to atan2Deg360().
    Parameters:
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    the angle to the given point, in radians as a float; ranges from -180 to 180
    +
    the angle to the given point, in degrees as a double; ranges from 0 to 360
  • -
    -

    atan2Degrees360

    -
    public static double atan2Degrees360(double y, +
    +

    atan2Turns

    +
    public static double atan2Turns(double y, double x)
    -
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as - doubles and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range - equivalent to 2PI radians or 1 turn. Takes y and x (in that unusual order) as doubles. Will never return a - negative number, which may help avoid costly floating-point modulus when you actually want a positive number. -
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(double) - method, and the small code to make that work as atan2Degrees360() was worked out from Wikipedia. +
    Close approximation of the frequently-used trigonometric method atan2, using non-negative turns only. + Average absolute error is 0.00000030 turns; relative error is 0 turns; maximum error is 0.00000017 turns. + Takes y and x (in that unusual order) as doubles, and returns the angle from the origin to that point in turns. + Because this always returns a double between 0.0 (inclusive) and 1.0 (exclusive), it can be useful for various + kinds of calculations that must store angles as a small fraction, such as packing a hue angle into a byte.
    - See also atan2_(double, double) for a version that returns a measurement as a fraction of a turn, or - atan2(double, double) for the typical radians. You - can also use atan2Degrees(double, double) to produce a result in degrees from -180 to 180.
    + Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This is sheet + 11's algorithm, which is the fourth-fastest and fourth-least precise. The algorithms on sheets 8-10 are faster, but only by + a very small degree, and are considerably less precise. That study provides an atan(double) method, and that cleanly + translates to atan2Turns().
    Parameters:
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    Returns:
    -
    the angle to the given point, as a double from 0.0 to 360.0, inclusive
    +
    the angle to the given point, in turns as a double; ranges from 0.0 to 1.0
  • -
    -

    atan2Degrees360

    -
    public static float atan2Degrees360(float y, - float x)
    -
    Altered-range approximation of the frequently-used trigonometric method atan2, taking y and x positions as - floats and returning an angle measured in turns from 0.0 to 360.0 (inclusive), with one cycle over the range - equivalent to 2PI radians or 1 turn. Takes y and x (in that unusual order) as floats. Will never return a - negative number, which may help avoid costly floating-point modulus when you actually want a positive number. -
    - Credit for this goes to the 1955 research study "Approximations for Digital Computers," by RAND Corporation. This - is sheet 9's algorithm, which is the second-fastest and second-least precise. The algorithm on sheet 8 is faster, - but only by a very small degree, and is considerably less precise. That study provides an atan(float) - method, and the small code to make that work as atan2Degrees360() was worked out from Wikipedia. -
    - See also atan2_(float, float) for a version that returns a measurement as a fraction of a turn, or - atan2(float, float) for the typical radians. You - can also use atan2Degrees(float, float) to produce a result in degrees from -180 to 180.
    +
    +

    asin

    +
    public static float asin(float a)
    +
    Returns arcsine in radians; less accurate than Math.asin but may be faster. Average error of 0.000028447 radians (0.0016298931 + degrees), largest error of 0.000067592 radians (0.0038727364 degrees). This implementation does not return NaN if given an + out-of-range input (Math.asin does return NaN), unless the input is NaN.
    Parameters:
    -
    y - y-component of the point to find the angle towards; note the parameter order is unusual by convention
    -
    x - x-component of the point to find the angle towards; note the parameter order is unusual by convention
    +
    a - asin is defined only when a is between -1f and 1f, inclusive
    Returns:
    -
    the angle to the given point, as a float from 0.0 to 360.0, inclusive
    +
    between -HALF_PI and HALF_PI when a is in the defined range
  • -
    -

    asin

    -
    public static float asin(float x)
    -
    Arc sine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.asin(double), but is somewhat less - precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils.
    +
    +

    asinDeg

    +
    public static float asinDeg(float a)
    +
    Returns arcsine in degrees. This implementation does not return NaN if given an + out-of-range input (Math.asin does return NaN), unless the input is NaN.
    Parameters:
    -
    x - an input to the inverse sine function, from -1 to 1 inclusive
    +
    a - asin is defined only when a is between -1f and 1f, inclusive
    Returns:
    -
    an output from the inverse sine function, from PI/-2.0 to PI/2.0 inclusive.
    +
    between -90 and 90 when a is in the defined range
    +
    +
    +
  • +
  • +
    +

    asinTurns

    +
    public static float asinTurns(float a)
    +
    Returns arcsine in turns. This implementation does not return NaN if given an + out-of-range input (Math.asin does return NaN), unless the input is NaN. + Note that unlike atan2Turns(float, float), this can return negative turn values.
    +
    +
    Parameters:
    +
    a - asin is defined only when a is between -1f and 1f, inclusive
    +
    Returns:
    +
    between -0.25 and 0.25 when a is in the defined range
  • acos

    -
    public static float acos(float x)
    -
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.acos(double), but is somewhat less - precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils. -
    - Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    +
    public static float acos(float a)
    +
    Returns arccosine in radians; less accurate than Math.acos but may be faster. Average error of 0.00002845 radians (0.0016300649 + degrees), largest error of 0.000067548 radians (0.0038702153 degrees). This implementation does not return NaN if given an + out-of-range input (Math.acos does return NaN), unless the input is NaN.
    Parameters:
    -
    x - an input to the inverse cosine function, from -1 to 1 inclusive
    +
    a - acos is defined only when a is between -1f and 1f, inclusive
    Returns:
    -
    an output from the inverse cosine function, from 0 to PI inclusive.
    +
    between 0 and PI when a is in the defined range
    +
    +
    +
  • +
  • +
    +

    acosDeg

    +
    public static float acosDeg(float a)
    +
    Returns arccosine in degrees. This implementation does not return NaN if given an + out-of-range input (Math.acos does return NaN), unless the input is NaN.
    +
    +
    Parameters:
    +
    a - acos is defined only when a is between -1f and 1f, inclusive
    +
    Returns:
    +
    between 0 and 180 when a is in the defined range
    +
    +
    +
  • +
  • +
    +

    acosTurns

    +
    public static float acosTurns(float a)
    +
    Returns arccosine in turns. This implementation does not return NaN if given an + out-of-range input (Math.acos does return NaN), unless the input is NaN.
    +
    +
    Parameters:
    +
    a - acos is defined only when a is between -1f and 1f, inclusive
    +
    Returns:
    +
    between 0 and 0.5 when a is in the defined range
  • asin

    -
    public static double asin(double x)
    -
    Arc sine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.asin(double), but is somewhat less - precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except - that this takes a double and returns a double. -
    - Accuracy: absolute error 0.000028447, relative error -0.000000033, max error 0.000067592 .
    +
    public static double asin(double a)
    +
    Returns arcsine in radians; less accurate than Math.asin but may be faster. Average error of 0.000028447 radians (0.0016298931 + degrees), largest error of 0.000067592 radians (0.0038727364 degrees). This implementation does not return NaN if given an + out-of-range input (Math.asin does return NaN), unless the input is NaN.
    +
    +
    Parameters:
    +
    a - asin is defined only when a is between -1.0 and 1.0, inclusive
    +
    Returns:
    +
    between -HALF_PI and HALF_PI when a is in the defined range
    +
    +
    +
  • +
  • +
    +

    asinDeg

    +
    public static double asinDeg(double a)
    +
    Returns arcsine in degrees. This implementation does not return NaN if given an + out-of-range input (Math.asin does return NaN), unless the input is NaN.
    +
    +
    Parameters:
    +
    a - asin is defined only when a is between -1.0 and 1.0, inclusive
    +
    Returns:
    +
    between -90 and 90 when a is in the defined range
    +
    +
    +
  • +
  • +
    +

    asinTurns

    +
    public static double asinTurns(double a)
    +
    Returns arcsine in turns. This implementation does not return NaN if given an + out-of-range input (Math.asin does return NaN), unless the input is NaN. + Note that unlike atan2Turns(double, double), this can return negative turn values.
    Parameters:
    -
    x - an input to the inverse sine function, from -1 to 1 inclusive
    +
    a - asin is defined only when a is between -1.0 and 1.0, inclusive
    Returns:
    -
    an output from the inverse sine function, from PI/-2.0 to PI/2.0 inclusive.
    +
    between -0.25 and 0.25 when a is in the defined range
  • acos

    -
    public static double acos(double x)
    -
    Arc cosine approximation with very low error, using an algorithm from the 1955 research study - "Approximations for Digital Computers," by RAND Corporation (this is sheet 35's algorithm, which is the fastest - and least precise). This method is usually much faster than Math.acos(double), but is somewhat less - precise than Math's implementation. It is currently the same as libGDX's approximation in their MathUtils, except - that this takes a double and returns a double. -
    - Accuracy: absolute error 0.000028450, relative error -0.000000011, max error 0.000067548 .
    +
    public static double acos(double a)
    +
    Returns arccosine in radians; less accurate than Math.acos but may be faster. Average error of 0.00002845 radians (0.0016300649 + degrees), largest error of 0.000067548 radians (0.0038702153 degrees). This implementation does not return NaN if given an + out-of-range input (Math.acos does return NaN), unless the input is NaN.
    Parameters:
    -
    x - an input to the inverse cosine function, from -1 to 1 inclusive
    +
    a - acos is defined only when a is between -1.0 and 1.0, inclusive
    Returns:
    -
    an output from the inverse cosine function, from 0 to PI inclusive.
    +
    between 0 and PI when a is in the defined range
  • -
    -

    asin_

    -
    public static double asin_(double x)
    -
    Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this - range from 0.75 (inclusive) to 1.0 (exclusive), and continuing past that to 0.0 (inclusive) to 0.25 (inclusive). -
    - This method is extremely similar to the non-turn approximation, but it never returns a negative result.
    +
    +

    acosDeg

    +
    public static double acosDeg(double a)
    +
    Returns arccosine in degrees. This implementation does not return NaN if given an + out-of-range input (Math.acos does return NaN), unless the input is NaN.
    Parameters:
    -
    x - a double from -1.0 to 1.0 (both inclusive), usually the output of sin_() or cos_()
    +
    a - acos is defined only when a is between -1.0 and 1.0, inclusive
    Returns:
    -
    one of the values that would produce n if it were passed to sin_(double)
    +
    between 0 and 180 when a is in the defined range
  • -
    -

    acos_

    -
    public static double acos_(double x)
    -
    Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this - range from 0.0 (inclusive) to 0.5 (inclusive). -
    - This method is extremely similar to the non-turn approximation.
    +
    +

    acosTurns

    +
    public static double acosTurns(double a)
    +
    Returns arccosine in turns. This implementation does not return NaN if given an + out-of-range input (Math.acos does return NaN), unless the input is NaN.
    Parameters:
    -
    x - a double from -1.0 to 1.0 (both inclusive), usually the output of sin_() or cos_()
    +
    a - acos is defined only when a is between -1.0 and 1.0, inclusive
    Returns:
    -
    one of the values that would produce n if it were passed to cos_(double)
    +
    between 0 and 0.5 when a is in the defined range
  • -
    -

    asin_

    -
    public static float asin_(float x)
    -
    Inverse sine function (arcsine) but with output measured in turns instead of radians. Possible results for this - range from 0.75f (inclusive) to 1.0f (exclusive), and continuing past that to 0.0f (inclusive) to 0.25f - (inclusive). -
    - This method is extremely similar to the non-turn approximation, but it never returns a negative result.
    +
    +

    atan

    +
    public static float atan(float i)
    +
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise). This + method is usually about 4x faster than Math.atan(double), but is somewhat less precise than Math's implementation. + For finite inputs only, you may get a tiny speedup by using atanUnchecked(double), but this method will be correct + enough for infinite inputs, and atanUnchecked() will not be.
    Parameters:
    -
    x - a float from -1.0f to 1.0f (both inclusive), usually the output of sin_() or cos_()
    +
    i - an input to the inverse tangent function; any float is accepted
    Returns:
    -
    one of the values that would produce n if it were passed to sin_(float)
    +
    an output from the inverse tangent function in radians, from -HALF_PI to HALF_PI inclusive
    +
    See Also:
    +
    + +
  • -
    -

    acos_

    -
    public static float acos_(float x)
    -
    Inverse cosine function (arccos) but with output measured in turns instead of radians. Possible results for this - range from 0.0f (inclusive) to 0.5f (inclusive). -
    - This method is extremely similar to the non-turn approximation.
    +
    +

    atanDeg

    +
    public static float atanDeg(float i)
    +
    Arc tangent approximation returning a value measured in positive or negative degrees, using an algorithm from the + 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 11's algorithm, + which is the fourth-fastest and fourth-least precise). + For finite inputs only, you may get a tiny speedup by using atanUncheckedDeg(double), but this method will be correct + enough for infinite inputs, and atanUncheckedDeg() will not be.
    +
    +
    Parameters:
    +
    i - an input to the inverse tangent function; any float is accepted
    +
    Returns:
    +
    an output from the inverse tangent function in degrees, from -90 to 90 inclusive
    +
    See Also:
    +
    + +
    +
    +
    +
  • +
  • +
    +

    atanTurns

    +
    public static float atanTurns(float i)
    +
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise). + For finite inputs only, you may get a tiny speedup by using atanUncheckedTurns(double), but this method will be correct + enough for infinite inputs, and atanUncheckedTurns() will not be.
    +
    +
    Parameters:
    +
    i - an input to the inverse tangent function; any float is accepted
    +
    Returns:
    +
    an output from the inverse tangent function in turns, from -0.25 to 0.25 inclusive
    +
    See Also:
    +
    + +
    +
    +
    +
  • +
  • +
    +

    atan

    +
    public static double atan(double i)
    +
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise). This + method is usually about 4x faster than Math.atan(double), but is somewhat less precise than Math's implementation. + For finite inputs only, you may get a tiny speedup by using atanUnchecked(double), but this method will be correct + enough for infinite inputs, and atanUnchecked() will not be.
    +
    +
    Parameters:
    +
    i - an input to the inverse tangent function; any double is accepted
    +
    Returns:
    +
    an output from the inverse tangent function in radians, from -HALF_PI to HALF_PI inclusive
    +
    See Also:
    +
    + +
    +
    +
    +
  • +
  • +
    +

    atanDeg

    +
    public static double atanDeg(double i)
    +
    Arc tangent approximation returning a value measured in positive or negative degrees, using an algorithm from the + 1955 research study "Approximations for Digital Computers," by RAND Corporation (this is sheet 11's algorithm, + which is the fourth-fastest and fourth-least precise). + For finite inputs only, you may get a tiny speedup by using atanUncheckedDeg(double), but this method will be correct + enough for infinite inputs, and atanUncheckedDeg() will not be.
    +
    +
    Parameters:
    +
    i - an input to the inverse tangent function; any double is accepted
    +
    Returns:
    +
    an output from the inverse tangent function in degrees, from -90 to 90 inclusive
    +
    See Also:
    +
    + +
    +
    +
    +
  • +
  • +
    +

    atanTurns

    +
    public static double atanTurns(double i)
    +
    Arc tangent approximation with very low error, using an algorithm from the 1955 research study "Approximations for Digital + Computers," by RAND Corporation (this is sheet 11's algorithm, which is the fourth-fastest and fourth-least precise). + For finite inputs only, you may get a tiny speedup by using atanUncheckedTurns(double), but this method will be correct + enough for infinite inputs, and atanUncheckedTurns() will not be.
    Parameters:
    -
    x - a float from -1.0f to 1.0f (both inclusive), usually the output of sin_() or cos_()
    +
    i - an input to the inverse tangent function; any double is accepted
    Returns:
    -
    one of the values that would produce n if it were passed to cos_(float)
    +
    an output from the inverse tangent function in turns, from -0.25 to 0.25 inclusive
    +
    See Also:
    +
    + +
  • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorTools.html index 3ef1a390..f6dc574d 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorTools.html @@ -2,7 +2,7 @@ -ColorTools (colorful 0.8.2 API) +ColorTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulBatch.html index 477471d5..40107531 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulBatch.html @@ -2,7 +2,7 @@ -ColorfulBatch (colorful 0.8.2 API) +ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulSprite.html index d87defdf..34b4910a 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/ColorfulSprite.html @@ -2,7 +2,7 @@ -ColorfulSprite (colorful 0.8.2 API) +ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/GradientTools.html index 625cd5dc..32b70b5a 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/GradientTools.html @@ -2,7 +2,7 @@ -GradientTools (colorful 0.8.2 API) +GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/Palette.html index 610c020c..5bfcdc20 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/Palette.html @@ -2,7 +2,7 @@ -Palette (colorful 0.8.2 API) +Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/SimplePalette.html index eb300141..7d6dbc8f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/SimplePalette.html @@ -2,7 +2,7 @@ -SimplePalette (colorful 0.8.2 API) +SimplePalette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorTools.html index b5af2905..cda7b30b 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.cielab.ColorTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.cielab.ColorTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulBatch.html index 5e89b066..f13065c1 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulBatch.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.cielab.ColorfulBatch (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.cielab.ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulSprite.html index 7d808213..192a22e8 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/ColorfulSprite.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.cielab.ColorfulSprite (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.cielab.ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/GradientTools.html index 2330f5bd..873f4094 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/GradientTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.cielab.GradientTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.cielab.GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/Palette.html index 2c5177d0..1d2cce94 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/Palette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.cielab.Palette (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.cielab.Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/SimplePalette.html index 61b06d40..3efb5d7a 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/class-use/SimplePalette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.cielab.SimplePalette (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.cielab.SimplePalette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-summary.html index ff231684..9eacb813 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-summary.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.cielab (colorful 0.8.2 API) +com.github.tommyettinger.colorful.cielab (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-tree.html index d91a4549..49ec8041 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-tree.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.cielab Class Hierarchy (colorful 0.8.2 API) +com.github.tommyettinger.colorful.cielab Class Hierarchy (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-use.html index 8c1eee9b..1c3e9982 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/cielab/package-use.html @@ -2,7 +2,7 @@ -Uses of Package com.github.tommyettinger.colorful.cielab (colorful 0.8.2 API) +Uses of Package com.github.tommyettinger.colorful.cielab (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html index 4ca3ed1b..76995108 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/FloatColors.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.FloatColors (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.FloatColors (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html index 69f68c9d..43e3d48d 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/Shaders.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.Shaders (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.Shaders (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html index 369c84a3..7d12cf15 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/class-use/TrigTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.TrigTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.TrigTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorTools.html index 1d781d0c..a5971d58 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorTools.html @@ -2,7 +2,7 @@ -ColorTools (colorful 0.8.2 API) +ColorTools (colorful 0.8.3 API) @@ -1024,7 +1024,7 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f, inclusive. This is different from chroma(float); see that method's documentation for details.
    @@ -1038,7 +1038,7 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    +
    public static float lightness(float encoded)
    Defined as per HSL; normally you only need channelL(float) to get accurate lightness for HSLuv. This ranges from 0.0f (black) to 1.0f (white).
    @@ -1052,7 +1052,7 @@

    lightness

  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased).
    @@ -1067,7 +1067,7 @@

    hue

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -1100,7 +1100,7 @@

    toEditedFloat

  • editHSLuv

    -
    public static float editHSLuv(float encoded, +
    public static float editHSLuv(float encoded, float addH, float addS, float addL, @@ -1124,7 +1124,7 @@

    editHSLuv

  • editHSLuv

    -
    public static float editHSLuv(float encoded, +
    public static float editHSLuv(float encoded, float addH, float addS, float addL, @@ -1160,7 +1160,7 @@

    editHSLuv

  • channelH

    -
    public static float channelH(float encoded)
    +
    public static float channelH(float encoded)
    The "H" channel of the given packed float in HSLuv format, which is its hue; ranges from 0.0f to 1.0f . You can edit the H of a color with rotateH(float, float).
    @@ -1174,7 +1174,7 @@

    channelH

  • channelS

    -
    public static float channelS(float encoded)
    +
    public static float channelS(float encoded)
    The "S" channel of the given packed float in HSLuv format, which is its saturation; ranges from 0.0f to 1.0f . You can edit the S of a color with enrich(float, float) and dullen(float, float).
    @@ -1188,7 +1188,7 @@

    channelS

  • channelL

    -
    public static float channelL(float encoded)
    +
    public static float channelL(float encoded)
    The "L" channel of the given packed float in HSLuv format, which is its lightness; ranges from 0.0f to 1.0f . You can edit the L of a color with lighten(float, float) and darken(float, float).
    @@ -1202,7 +1202,7 @@

    channelL

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -1228,7 +1228,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -1254,7 +1254,7 @@

    darken

  • enrich

    -
    public static float enrich(float start, +
    public static float enrich(float start, float change)
    Moves the color of start away from grayscale by change (saturating the color). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1277,7 +1277,7 @@

    enrich

  • dullen

    -
    public static float dullen(float start, +
    public static float dullen(float start, float change)
    Brings the color of start closer to grayscale by change (desaturating the color). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -1300,7 +1300,7 @@

    dullen

  • rotateH

    -
    public static float rotateH(float start, +
    public static float rotateH(float start, float change)
    Cycles the hue of the packed float color by change. If change is 0f, this returns start as-is. If change is positive, this rotates from red to orange to yellow to green, and so on. If change is negative, this instead @@ -1320,7 +1320,7 @@

    rotateH

  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -1345,7 +1345,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -1370,7 +1370,7 @@

    fade

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float HSLuv color mainColor and another HSLuv color that it should be made to contrast with, gets a packed float HSLuv color with roughly inverted lightness but the same hue, saturation, and alpha. @@ -1393,7 +1393,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float HSLuv color mainColor and another HSLuv color that it should be made to contrast with, gets a packed float HSLuv color with L that should be quite different from contrastingColor's L, @@ -1415,7 +1415,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that with the original L. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness. @@ -1433,7 +1433,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive HSLuv color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1452,7 +1452,7 @@

    lessenChange

  • inGamut

    -
    public static boolean inGamut(float packed)
    +
    public static boolean inGamut(float packed)
    Returns true always; HSLuv colors are always in-gamut.
    Parameters:
    @@ -1465,7 +1465,7 @@

    inGamut

  • inGamut

    -
    public static boolean inGamut(float H, +
    public static boolean inGamut(float H, float S, float L)
    Returns true if S and L are each between 0 and 1; if valid, HSLuv colors are always in-gamut.
    @@ -1482,7 +1482,7 @@

    inGamut

  • limitToGamut

    -
    public static float limitToGamut(float packed)
    +
    public static float limitToGamut(float packed)
    Returns its argument unchanged; HSLuv colors are always in-gamut.
    Parameters:
    @@ -1495,7 +1495,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float H, +
    public static float limitToGamut(float H, float S, float L)
    Identical to calling clamp(float, float, float, float) with 1f as its last parameter.
    @@ -1512,7 +1512,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float H, +
    public static float limitToGamut(float H, float S, float L, float alpha)
    @@ -1531,7 +1531,7 @@

    limitToGamut

  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1554,7 +1554,7 @@

    randomEdit

  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut and should be uniformly distributed.
    Parameters:
    @@ -1567,7 +1567,7 @@

    randomColor

  • lerpFloatColors

    -
    public static float lerpFloatColors(float start, +
    public static float lerpFloatColors(float start, float end, float change)
    Interpolates from the packed float color start towards end by change. Both start and end should be packed colors, @@ -1586,7 +1586,7 @@

    lerpFloatColors

  • lerpFloatColorsBlended

    -
    public static float lerpFloatColorsBlended(float start, +
    public static float lerpFloatColorsBlended(float start, float end, float change)
    Interpolates from the packed float color start towards end by change, but keeps the alpha of start and uses the @@ -1606,7 +1606,7 @@

    lerpFloatColorsBlended

  • mix

    -
    public static float mix(float color0, +
    public static float mix(float color0, float color1)
    Returns a 1:1 mix of color0 and color1. All colors should use the same color space. This is the same as calling lerpFloatColors(float, float, float) with a change of 0.5.
    @@ -1622,7 +1622,7 @@

    mix

  • mix

    -
    public static float mix(float color0, +
    public static float mix(float color0, float color1, float color2)
    Returns a 1:1:1 mix of color0, color1, and color2. All colors should use the same color space.
    @@ -1639,7 +1639,7 @@

    mix

  • mix

    -
    public static float mix(float color0, +
    public static float mix(float color0, float color1, float color2, float color3)
    @@ -1658,7 +1658,7 @@

    mix

  • mix

    -
    public static float mix(float... colors)
    +
    public static float mix(float... colors)
    Given several colors, this gets an even mix of all colors in equal measure. If colors is null or has no items, this returns 0f (usually transparent in most color spaces).
    @@ -1672,7 +1672,7 @@

    mix

  • mix

    -
    public static float mix(float[] colors, +
    public static float mix(float[] colors, int offset, int size)
    Given several colors, this gets an even mix of all colors in equal measure. diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulBatch.html index 66ba4e1c..2d083c62 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulBatch.html @@ -2,7 +2,7 @@ -ColorfulBatch (colorful 0.8.2 API) +ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulSprite.html index c31215f2..fffc72eb 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/ColorfulSprite.html @@ -2,7 +2,7 @@ -ColorfulSprite (colorful 0.8.2 API) +ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/GradientTools.html index aaeef9a4..a4325f69 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/GradientTools.html @@ -2,7 +2,7 @@ -GradientTools (colorful 0.8.2 API) +GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/Palette.html index 58b37f37..379dd465 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/Palette.html @@ -2,7 +2,7 @@ -Palette (colorful 0.8.2 API) +Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/SimplePalette.html index 08210155..dea07353 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/SimplePalette.html @@ -2,7 +2,7 @@ -SimplePalette (colorful 0.8.2 API) +SimplePalette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorTools.html index 6fd17ea6..b00ade1f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.hsluv.ColorTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.hsluv.ColorTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulBatch.html index 182039c7..209674c2 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulBatch.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.hsluv.ColorfulBatch (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.hsluv.ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulSprite.html index 831dcdd1..2717c583 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/ColorfulSprite.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.hsluv.ColorfulSprite (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.hsluv.ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/GradientTools.html index 5775b624..92892322 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/GradientTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.hsluv.GradientTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.hsluv.GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/Palette.html index 9ed7ed40..65664bc9 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/Palette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.hsluv.Palette (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.hsluv.Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/SimplePalette.html index 85c3b716..d4ba3d34 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/class-use/SimplePalette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.hsluv.SimplePalette (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.hsluv.SimplePalette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-summary.html index 6307055e..fcab8dfe 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-summary.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.hsluv (colorful 0.8.2 API) +com.github.tommyettinger.colorful.hsluv (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-tree.html index 711b5203..72ae2cda 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-tree.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.hsluv Class Hierarchy (colorful 0.8.2 API) +com.github.tommyettinger.colorful.hsluv Class Hierarchy (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-use.html index 119508e7..8ceef4d9 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/hsluv/package-use.html @@ -2,7 +2,7 @@ -Uses of Package com.github.tommyettinger.colorful.hsluv (colorful 0.8.2 API) +Uses of Package com.github.tommyettinger.colorful.hsluv (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html index c4544b1f..aa1f3eae 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorTools.html @@ -2,7 +2,7 @@ -ColorTools (colorful 0.8.2 API) +ColorTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html index 653730d1..8426106d 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulBatch.html @@ -2,7 +2,7 @@ -ColorfulBatch (colorful 0.8.2 API) +ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html index cad54868..733b4c3f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/ColorfulSprite.html @@ -2,7 +2,7 @@ -ColorfulSprite (colorful 0.8.2 API) +ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/GradientTools.html index 8fdf4704..484e4c2a 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/GradientTools.html @@ -2,7 +2,7 @@ -GradientTools (colorful 0.8.2 API) +GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html index f7e180d0..fb0cb6a1 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/Palette.html @@ -2,7 +2,7 @@ -Palette (colorful 0.8.2 API) +Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html index 7c491834..58b7f28e 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.ColorTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt.ColorTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html index 404deed6..4b548052 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulBatch.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulBatch (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html index 3982d6dc..a6f35af2 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/ColorfulSprite.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulSprite (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt.ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/GradientTools.html index 21ea7f57..d17420ce 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/GradientTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.GradientTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt.GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html index 5abd9ed0..6997d3f3 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/class-use/Palette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt.Palette (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt.Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html index 467929ef..614f749c 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-summary.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.ipt (colorful 0.8.2 API) +com.github.tommyettinger.colorful.ipt (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html index 02fbdcd9..eb669f20 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-tree.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.ipt Class Hierarchy (colorful 0.8.2 API) +com.github.tommyettinger.colorful.ipt Class Hierarchy (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html index b9704faf..4573cd11 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt/package-use.html @@ -2,7 +2,7 @@ -Uses of Package com.github.tommyettinger.colorful.ipt (colorful 0.8.2 API) +Uses of Package com.github.tommyettinger.colorful.ipt (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html index 195701fb..4c17aed4 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorTools.html @@ -2,7 +2,7 @@ -ColorTools (colorful 0.8.2 API) +ColorTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html index 694fc35a..802fd396 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulBatch.html @@ -2,7 +2,7 @@ -ColorfulBatch (colorful 0.8.2 API) +ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html index 620970d0..19c6a5c9 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/ColorfulSprite.html @@ -2,7 +2,7 @@ -ColorfulSprite (colorful 0.8.2 API) +ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/GradientTools.html index 59652239..77efb7a0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/GradientTools.html @@ -2,7 +2,7 @@ -GradientTools (colorful 0.8.2 API) +GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html index 168ee816..aba4703c 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/Palette.html @@ -2,7 +2,7 @@ -Palette (colorful 0.8.2 API) +Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html index bac6ab39..d2192265 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/SimplePalette.html @@ -2,7 +2,7 @@ -SimplePalette (colorful 0.8.2 API) +SimplePalette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html index f9541642..99aacdab 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html index ed443cf7..0715aaf0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulBatch.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html index 65e948d2..a3678ecb 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/ColorfulSprite.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/GradientTools.html index a07687e6..1b2f14d0 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/GradientTools.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.GradientTools (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html index decfe328..c4d43a47 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/Palette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.Palette (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.Palette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html index 3921b4f7..e625185b 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/class-use/SimplePalette.html @@ -2,7 +2,7 @@ -Uses of Class com.github.tommyettinger.colorful.ipt_hq.SimplePalette (colorful 0.8.2 API) +Uses of Class com.github.tommyettinger.colorful.ipt_hq.SimplePalette (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html index f5457d1a..cd3ecc9f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-summary.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.ipt_hq (colorful 0.8.2 API) +com.github.tommyettinger.colorful.ipt_hq (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html index b8cc4fcb..b2d13e0a 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-tree.html @@ -2,7 +2,7 @@ -com.github.tommyettinger.colorful.ipt_hq Class Hierarchy (colorful 0.8.2 API) +com.github.tommyettinger.colorful.ipt_hq Class Hierarchy (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html index 6dfd6a12..4b481d9f 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/ipt_hq/package-use.html @@ -2,7 +2,7 @@ -Uses of Package com.github.tommyettinger.colorful.ipt_hq (colorful 0.8.2 API) +Uses of Package com.github.tommyettinger.colorful.ipt_hq (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html index 6272d5da..c4d4304a 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorTools.html @@ -2,7 +2,7 @@ -ColorTools (colorful 0.8.2 API) +ColorTools (colorful 0.8.3 API) @@ -177,6 +177,18 @@

    Method Summary

    or black).
    static float
    +
    distance(float encodedA, + float encodedB)
    +
    +
    Gets the actual Euclidean distance between two colors as packed Oklab floats.
    +
    +
    static float
    +
    distanceSquared(float encodedA, + float encodedB)
    +
    +
    Gets the squared Euclidean distance between two colors as packed Oklab floats.
    +
    +
    static float
    dullen(float start, float change)
    @@ -553,7 +565,7 @@

    oklab

  • forwardLight

    -
    public static float forwardLight(float L)
    +
    public static float forwardLight(float L)
    Changes the curve of a requested L value so that it matches the internally-used curve. This takes a curve with a very-dark area similar to sRGB (a very small one), and makes it significantly larger. This is typically used on "to Oklab" conversions.
    @@ -568,7 +580,7 @@

    forwardLight

  • reverseLight

    -
    public static float reverseLight(float L)
    +
    public static float reverseLight(float L)
    Changes the curve of the internally-used lightness when it is output to another format. This makes the very-dark area smaller, matching (kind-of) the curve that the standard sRGB lightness uses. This is typically used on "from Oklab" conversions.
    @@ -583,7 +595,7 @@

    reverseLight

  • toRGBA8888

    -
    public static int toRGBA8888(float packed)
    +
    public static int toRGBA8888(float packed)
    Converts a packed float color in the format produced by oklab(float, float, float, float) to an RGBA8888 int. This format of int can be used with Pixmap and in some other places in libGDX.
    @@ -597,7 +609,7 @@

    toRGBA8888

  • toRGBA

    -
    public static float toRGBA(float packed)
    +
    public static float toRGBA(float packed)
    Converts a packed float color in the format produced by oklab(float, float, float, float) to a packed float in RGBA format. This format of float can be used with the standard SpriteBatch and in some other places in libGDX.
    @@ -612,7 +624,7 @@

    toRGBA

  • toColor

    -
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, +
    public static com.badlogic.gdx.graphics.Color toColor(com.badlogic.gdx.graphics.Color editing, float packed)
    Writes an Oklab-format packed float color (the format produced by oklab(float, float, float, float)) into an RGBA8888 Color as used by libGDX (called editing).
    @@ -628,7 +640,7 @@

    toColor

  • toOklabColor

    -
    public static com.badlogic.gdx.graphics.Color toOklabColor(com.badlogic.gdx.graphics.Color editing, +
    public static com.badlogic.gdx.graphics.Color toOklabColor(com.badlogic.gdx.graphics.Color editing, float oklab)
    Writes an Oklab-format packed float color (the format produced by oklab(float, float, float, float)) into an Oklab-format Color called editing. This is mostly useful if the rest of your application expects @@ -647,7 +659,7 @@

    toOklabColor

  • fromRGBA8888

    -
    public static float fromRGBA8888(int rgba)
    +
    public static float fromRGBA8888(int rgba)
    Takes a color encoded as an RGBA8888 int and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -660,7 +672,7 @@

    fromRGBA8888

  • fromRGBA

    -
    public static float fromRGBA(float packed)
    +
    public static float fromRGBA(float packed)
    Takes a color encoded as an RGBA8888 packed float and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -673,7 +685,7 @@

    fromRGBA

  • fromColor

    -
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    +
    public static float fromColor(com.badlogic.gdx.graphics.Color color)
    Takes a libGDX Color that uses RGBA8888 channels and converts to a packed float in the Oklab format this uses.
    Parameters:
    @@ -686,7 +698,7 @@

    fromColor

  • fromRGBA

    -
    public static float fromRGBA(float r, +
    public static float fromRGBA(float r, float g, float b, float a)
    @@ -705,7 +717,7 @@

    fromRGBA

  • redInt

    -
    public static int redInt(float encoded)
    +
    public static int redInt(float encoded)
    Gets the red channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -718,7 +730,7 @@

    redInt

  • greenInt

    -
    public static int greenInt(float encoded)
    +
    public static int greenInt(float encoded)
    Gets the green channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -731,7 +743,7 @@

    greenInt

  • blueInt

    -
    public static int blueInt(float encoded)
    +
    public static int blueInt(float encoded)
    Gets the blue channel value of the given encoded color, as an int ranging from 0 to 255, inclusive.
    Parameters:
    @@ -744,7 +756,7 @@

    blueInt

  • alphaInt

    -
    public static int alphaInt(float encoded)
    +
    public static int alphaInt(float encoded)
    Gets the alpha channel value of the given encoded color, as an even int ranging from 0 to 254, inclusive. Because of how alpha is stored in libGDX, no odd-number values are possible for alpha.
    @@ -758,7 +770,7 @@

    alphaInt

  • red

    -
    public static float red(float encoded)
    +
    public static float red(float encoded)
    Gets the red channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -771,7 +783,7 @@

    red

  • green

    -
    public static float green(float encoded)
    +
    public static float green(float encoded)
    Gets the green channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -784,7 +796,7 @@

    green

  • blue

    -
    public static float blue(float encoded)
    +
    public static float blue(float encoded)
    Gets the blue channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -797,7 +809,7 @@

    blue

  • alpha

    -
    public static float alpha(float encoded)
    +
    public static float alpha(float encoded)
    Gets the alpha channel value of the given encoded color, as a float from 0.0f to 1.0f, inclusive.
    Parameters:
    @@ -810,7 +822,7 @@

    alpha

  • chroma

    -
    public static float chroma(float encoded)
    +
    public static float chroma(float encoded)
    Gets the "chroma" or "colorfulness" of a given Oklab color. Chroma is similar to saturation in that grayscale values have 0 saturation and 0 chroma, while brighter colors have high saturation and chroma. The difference is that colors that are perceptually more-colorful have higher chroma than colors that are perceptually @@ -830,7 +842,7 @@

    chroma

  • chromaLimit

    -
    public static float chromaLimit(float hue, +
    public static float chromaLimit(float hue, float lightness)
    Given a hue and lightness, this gets the (approximate) maximum chroma possible for that hue-lightness combination. This is useful to know the bounds of chroma(float). This should be no greater @@ -847,7 +859,7 @@

    chromaLimit

  • floatGetHSL

    -
    public static float floatGetHSL(float hue, +
    public static float floatGetHSL(float hue, float saturation, float lightness, float opacity)
    @@ -881,7 +893,7 @@

    floatGetHSL

  • saturation

    -
    public static float saturation(float encoded)
    +
    public static float saturation(float encoded)
    Gets the saturation of the given encoded color as HSL would calculate it, as a float ranging from 0.0f to 1.0f, inclusive. This is different from chroma(float); see that method's documentation for details. It is also different from oklabSaturation(float), which gets the saturation as Oklab understands it rather than how @@ -897,7 +909,7 @@

    saturation

  • lightness

    -
    public static float lightness(float encoded)
    +
    public static float lightness(float encoded)
    Defined as per HSL; normally you only need channelL(float) to get accurate lightness for Oklab. You can also use oklabLightness(float), which is an alias for channelL(). This ranges from 0.0f (black) to 1.0f (white).
    @@ -912,7 +924,7 @@

    lightness

  • hue

    -
    public static float hue(float encoded)
    +
    public static float hue(float encoded)
    Gets the hue of the given encoded color, as a float from 0f (inclusive, red and approaching orange if increased) to 1f (exclusive, red and approaching purple if decreased). You can also use oklabHue(float), which positions the different hues at different values, somewhat, from this, but is more accurate to how Oklab handles @@ -929,7 +941,7 @@

    hue

  • channelL

    -
    public static float channelL(float encoded)
    +
    public static float channelL(float encoded)
    The "L" channel of the given packed float in Oklab format, which is its lightness; ranges from 0.0f to 1.0f . You can edit the L of a color with lighten(float, float) and darken(float, float).
    @@ -943,7 +955,7 @@

    channelL

  • channelA

    -
    public static float channelA(float encoded)
    +
    public static float channelA(float encoded)
    The "A" channel of the given packed float in Oklab format, which when combined with the B channel describes the hue and saturation of a color; ranges from 0f to 1f . If A is 0f, the color will be cooler, more green or blue; if A is 1f, the color will be warmer, from magenta to orange. You can edit the A of a color with @@ -959,7 +971,7 @@

    channelA

  • channelB

    -
    public static float channelB(float encoded)
    +
    public static float channelB(float encoded)
    The "B" channel of the given packed float in Oklab format, which when combined with the A channel describes the hue and saturation of a color; ranges from 0f to 1f . If B is 0f, the color will be more "artificial", more blue or purple; if B is 1f, the color will be more "natural", from green to yellow to orange. You can edit @@ -975,7 +987,7 @@

    channelB

  • toEditedFloat

    -
    public static float toEditedFloat(float basis, +
    public static float toEditedFloat(float basis, float hue, float saturation, float light, @@ -1011,7 +1023,7 @@

    toEditedFloat

  • lighten

    -
    public static float lighten(float start, +
    public static float lighten(float start, float change)
    Interpolates from the packed float color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be a packed color, as from @@ -1036,7 +1048,7 @@

    lighten

  • darken

    -
    public static float darken(float start, +
    public static float darken(float start, float change)
    Interpolates from the packed float color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be a packed color, as from @@ -1061,7 +1073,7 @@

    darken

  • raiseA

    -
    public static float raiseA(float start, +
    public static float raiseA(float start, float change)
    Interpolates from the packed float color start towards a warmer color (orange to magenta) by change. While change should be between 0f (return start as-is) and 1f (return fully warmed), start should be a packed color, as from @@ -1087,7 +1099,7 @@

    raiseA

  • lowerA

    -
    public static float lowerA(float start, +
    public static float lowerA(float start, float change)
    Interpolates from the packed float color start towards a cooler color (green to blue) by change. While change should be between 0f (return start as-is) and 1f (return fully cooled), start should be a packed color, as from @@ -1113,7 +1125,7 @@

    lowerA

  • raiseB

    -
    public static float raiseB(float start, +
    public static float raiseB(float start, float change)
    Interpolates from the packed float color start towards a "natural" color (between green and orange) by change. While change should be between 0f (return start as-is) and 1f (return fully natural), start should be a packed color, as @@ -1139,7 +1151,7 @@

    raiseB

  • lowerB

    -
    public static float lowerB(float start, +
    public static float lowerB(float start, float change)
    Interpolates from the packed float color start towards an "artificial" color (between blue and purple) by change. While change should be between 0f (return start as-is) and 1f (return fully artificial), start should be a packed color, as @@ -1165,7 +1177,7 @@

    lowerB

  • blot

    -
    public static float blot(float start, +
    public static float blot(float start, float change)
    Interpolates from the packed float color start towards that color made opaque by change. While change should be between 0f (return start as-is) and 1f (return start with full alpha), start should be a packed color, as from @@ -1190,7 +1202,7 @@

    blot

  • fade

    -
    public static float fade(float start, +
    public static float fade(float start, float change)
    Interpolates from the packed float color start towards transparent by change. While change should be between 0 (return start as-is) and 1f (return the color with 0 alpha), start should be a packed color, as from @@ -1215,7 +1227,7 @@

    fade

  • dullen

    -
    public static float dullen(float start, +
    public static float dullen(float start, float change)
    Brings the chromatic components of start closer to grayscale by change (desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be a packed color, as @@ -1239,7 +1251,7 @@

    dullen

  • enrich

    -
    public static float enrich(float start, +
    public static float enrich(float start, float change)
    Pushes the chromatic components of start away from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be a packed color, as @@ -1264,7 +1276,7 @@

    enrich

  • inverseLightness

    -
    public static float inverseLightness(float mainColor, +
    public static float inverseLightness(float mainColor, float contrastingColor)
    Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with roughly inverted L but the same chromatic channels and opacity (A and B @@ -1290,7 +1302,7 @@

    inverseLightness

  • differentiateLightness

    -
    public static float differentiateLightness(float mainColor, +
    public static float differentiateLightness(float mainColor, float contrastingColor)
    Given a packed float Oklab color mainColor and another Oklab color that it should be made to contrast with, gets a packed float Oklab color with L that should be quite different from contrastingColor's L, @@ -1313,7 +1325,7 @@

    differentiateLightness

  • offsetLightness

    -
    public static float offsetLightness(float mainColor)
    +
    public static float offsetLightness(float mainColor)
    Pretty simple; adds 0.5 to the given color's L and wraps it around if it would go above 1.0, then averages that with the original L. This means light colors become darker, and dark colors become lighter, with almost all results in the middle-range of possible lightness.
    @@ -1328,7 +1340,7 @@

    offsetLightness

  • lessenChange

    -
    public static float lessenChange(float color, +
    public static float lessenChange(float color, float fraction)
    Makes the additive Oklab color stored in color cause less of a change when used as a tint, as if it were mixed with neutral gray. When fraction is 1.0, this returns color unchanged; when fraction is 0.0, it @@ -1346,7 +1358,7 @@

    lessenChange

  • randomEdit

    -
    public static float randomEdit(float color, +
    public static float randomEdit(float color, long seed, float variance)
    Makes a quasi-randomly-edited variant on the given color, allowing typically a small amount of @@ -1370,14 +1382,14 @@

    randomEdit

  • getRawGamutValue

    -
    public static byte getRawGamutValue(int index)
    +
    public static byte getRawGamutValue(int index)
    Given a 1D int index between 0 and 65535 (both inclusive), this treats the 1D index as two parts (lightness and hue angle, both from 0 to 255) and gets the distance from grayscale to the edge of the gamut at that lightness and hue. The index can be constructed from a lightness value L from 0 to 255, and a hue value H from 0 to 255 with: (L << 8 | H) or the simpler equivalent (L * 256 + H). These assume L and H have been limited to the 0 to 255 range already. This does not bounds-check index. Because hue is not typically measured between 0 and 255, getting that value is a bit different; you can use - TrigTools.atan2_(float, float) (with an Oklab color's B for y, then its A for x) and multiply it by 256 + TrigTools.atan2Turns(float, float) (with an Oklab color's B for y, then its A for x) and multiply it by 256 to get H.
    The distance this returns is a byte between 0 and 84 (both inclusive), as the Euclidean distance from the center @@ -1385,7 +1397,7 @@

    getRawGamutValue

    the index. This is measured in a space from -1 to 1 for both A and B, with the 0 in the center meaning grayscale, and multiplied by 256 to get a meaningful byte value. To return to the A and B values Oklab uses here, you would need to use some trigonometry on the hue (if it's in the 0 to 1 range, you can call - TrigTools.cos_(float) on the hue to almost get A, and TrigTools.sin_(float) to almost get B), + TrigTools.cosTurns(float) on the hue to almost get A, and TrigTools.sinTurns(float) to almost get B), then multiply each of those by the distance, divide each by 256.0, and add 0.5.
    Only intended for the narrow cases where external code needs read-only access to the internal Oklab gamut data. @@ -1403,7 +1415,7 @@

    getRawGamutValue

  • inGamut

    -
    public static boolean inGamut(float packed)
    +
    public static boolean inGamut(float packed)
    Returns true if the given packed float color, as Oklab, is valid to convert losslessly back to RGBA.
    Parameters:
    @@ -1416,7 +1428,7 @@

    inGamut

  • inGamut

    -
    public static boolean inGamut(float L, +
    public static boolean inGamut(float L, float A, float B)
    Returns true if the given Oklab values are valid to convert losslessly back to RGBA.
    @@ -1433,7 +1445,7 @@

    inGamut

  • maximizeSaturation

    -
    public static float maximizeSaturation(float packed)
    +
    public static float maximizeSaturation(float packed)
    Gets the color with the same L as the Oklab color stored in the given packed float, but the furthest A B from gray possible for that lightness while keeping the same hue as the given color. This is very similar to calling enrich(float, float) with a very large change value.
    @@ -1454,7 +1466,7 @@

    maximizeSaturation

  • maximizeSaturation

    -
    public static float maximizeSaturation(float L, +
    public static float maximizeSaturation(float L, float A, float B, float alpha)
    @@ -1482,7 +1494,7 @@

    maximizeSaturation

  • oklabHue

    -
    public static float oklabHue(float packed)
    +
    public static float oklabHue(float packed)
    Gets the hue of the given Oklab float color, but as Oklab understands hue rather than how HSL does. This is different from hue(float), which uses HSL. This gives a float between 0 (inclusive) and 1 (exclusive).
    @@ -1497,7 +1509,7 @@

    oklabHue

  • oklabSaturation

    -
    public static float oklabSaturation(float packed)
    +
    public static float oklabSaturation(float packed)
    Gets the saturation of the given Oklab float color, but as Oklab understands saturation rather than how HSL does. Saturation here is a fraction of the chroma limit (see chromaLimit(float, float)) for a given hue and lightness, and is between 0 and 1 almost all the time. Saturation should always be between 0 (inclusive) and 1 @@ -1513,7 +1525,7 @@

    oklabSaturation

  • oklabLightness

    -
    public static float oklabLightness(float packed)
    +
    public static float oklabLightness(float packed)
    Gets the lightness of the given Oklab float color, but as Oklab understands lightness rather than how HSL does. This is different from lightness(float), which uses HSL. This gives a float between 0 (inclusive) and 1 (inclusive). @@ -1530,7 +1542,7 @@

    oklabLightness

  • oklabByHSL

    -
    public static float oklabByHSL(float hue, +
    public static float oklabByHSL(float hue, float saturation, float lightness, float alpha)
    @@ -1564,7 +1576,7 @@

    oklabByHSL

  • oklabByHCL

    -
    public static float oklabByHCL(float hue, +
    public static float oklabByHCL(float hue, float chroma, float lightness, float alpha)
    @@ -1594,7 +1606,7 @@

    oklabByHCL

  • limitToGamut

    -
    public static float limitToGamut(float packed)
    +
    public static float limitToGamut(float packed)
    Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside the gamut at the same lightness, or if it is already in-gamut, returns the color as-is.
    @@ -1614,7 +1626,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B)
    Checks whether the given Oklab color is in-gamut; if it isn't in-gamut, brings the color just inside @@ -1639,7 +1651,7 @@

    limitToGamut

  • limitToGamut

    -
    public static float limitToGamut(float L, +
    public static float limitToGamut(float L, float A, float B, float alpha)
    @@ -1665,7 +1677,7 @@

    limitToGamut

  • editOklab

    -
    public static float editOklab(float encoded, +
    public static float editOklab(float encoded, float addL, float addA, float addB, @@ -1689,7 +1701,7 @@

    editOklab

  • editOklab

    -
    public static float editOklab(float encoded, +
    public static float editOklab(float encoded, float addL, float addA, float addB, @@ -1726,7 +1738,7 @@

    editOklab

  • randomColor

    -
    public static float randomColor(Random random)
    +
    public static float randomColor(Random random)
    Produces a random packed float color that is always in-gamut (and opaque) and should be uniformly distributed.
    Parameters:
    @@ -1736,6 +1748,47 @@

    randomColor

  • +
  • +
    +

    distanceSquared

    +
    public static float distanceSquared(float encodedA, + float encodedB)
    +
    Gets the squared Euclidean distance between two colors as packed Oklab floats. This is a very approximate measure + of how different two colors are from each other, but in Oklab this measurement is relatively more accurate than + if you used plain RGB as the color space, or even IPT_HQ. The result should typically be rather small; lightness + can only be 1 unit of distance apart at most (from black to white), and the A and B channels are usually just a + tiny bit away from the vertical lightness axis. A result of 1 may be the largest this can produce, but it is very + possible that somewhat larger results can happen. Note that this is squared, so it isn't an admissible metric for + some usage, like summing up distances.
    +
    +
    Parameters:
    +
    encodedA - a packed Oklab float
    +
    encodedB - a packed Oklab float
    +
    Returns:
    +
    the squared Euclidean distance between encodedA and encodedB; usually less than 1.0f
    +
    +
    +
  • +
  • +
    +

    distance

    +
    public static float distance(float encodedA, + float encodedB)
    +
    Gets the actual Euclidean distance between two colors as packed Oklab floats. This is an approximate measure + of how different two colors are from each other, but in Oklab this measurement is relatively more accurate than + if you used plain RGB as the color space, or even IPT_HQ. The result should typically be rather small; lightness + can only be 1 unit of distance apart at most (from black to white), and the A and B channels are usually just a + tiny bit away from the vertical lightness axis. A result of 1 may be the largest this can produce, but it is very + possible that somewhat larger results can happen.
    +
    +
    Parameters:
    +
    encodedA - a packed Oklab float
    +
    encodedB - a packed Oklab float
    +
    Returns:
    +
    the Euclidean distance between encodedA and encodedB; usually less than 1.0f
    +
    +
    +
  • diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html index 2319b506..e7de9115 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulBatch.html @@ -2,7 +2,7 @@ -ColorfulBatch (colorful 0.8.2 API) +ColorfulBatch (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html index f8175796..4fa3b962 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/ColorfulSprite.html @@ -2,7 +2,7 @@ -ColorfulSprite (colorful 0.8.2 API) +ColorfulSprite (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/GradientTools.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/GradientTools.html index 099ad38d..b3e52788 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/GradientTools.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/GradientTools.html @@ -2,7 +2,7 @@ -GradientTools (colorful 0.8.2 API) +GradientTools (colorful 0.8.3 API) diff --git a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html index 1e1a29ba..76b4c446 100644 --- a/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html +++ b/docs/colorful/apidocs/com/github/tommyettinger/colorful/oklab/Palette.html @@ -2,7 +2,7 @@ -Palette (colorful 0.8.2 API) +Palette (colorful 0.8.3 API) @@ -103,657 +103,657 @@

    Field Summary

    static final float
    -
    This color constant "Absinthe" has RGBA8888 code 9BF046FF, L 0.8156863, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.37081593, saturation 0.6159092, and chroma 0.209995.
    +
    This color constant "Absinthe" has RGBA8888 code 9BF046FF, L 0.8235294, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.36663744, saturation 0.8408515, and chroma 0.209995.
    static final float
    -
    This color constant "Air Force Blue" has RGBA8888 code 578FC7FF, L 0.5529412, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6840373, saturation 0.29252034, and chroma 0.106691405.
    +
    This color constant "Air Force Blue" has RGBA8888 code 578FC7FF, L 0.5529412, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6871773, saturation 0.5531915, and chroma 0.106691405.
    static final float
    -
    This color constant "Amazonite" has RGBA8888 code 8FC7C7FF, L 0.73333335, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.1686625, and chroma 0.061763234.
    +
    This color constant "Amazonite" has RGBA8888 code 8FC7C7FF, L 0.7372549, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.54428434, saturation 0.39351946, and chroma 0.061763234.
    static final float
    -
    This color constant "Angel Wing" has RGBA8888 code E1F8FAFF, L 0.92941177, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5644313, saturation 0.3712, and chroma 0.029749114.
    +
    This color constant "Angel Wing" has RGBA8888 code E1F8FAFF, L 0.9372549, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5511957, saturation 0.52704626, and chroma 0.029749114.
    static final float
    -
    This color constant "Apple Green" has RGBA8888 code 14E60AFF, L 0.7294118, A 0.3882353, B 0.5803922, alpha 1.0, hue 0.4007443, saturation 0.96435034, and chroma 0.27427328.
    +
    This color constant "Apple Green" has RGBA8888 code 14E60AFF, L 0.7372549, A 0.3882353, B 0.5803922, alpha 1.0, hue 0.3975709, saturation 0.9722222, and chroma 0.27427328.
    static final float
    -
    This color constant "Apricot" has RGBA8888 code FFA53CFF, L 0.7294118, A 0.5254902, B 0.5686275, alpha 1.0, hue 0.19341156, saturation 0.70395154, and chroma 0.14584495.
    +
    This color constant "Apricot" has RGBA8888 code FFA53CFF, L 0.7372549, A 0.5254902, B 0.5686275, alpha 1.0, hue 0.19098291, saturation 0.9904209, and chroma 0.14584495.
    static final float
    -
    This color constant "Aquamarine" has RGBA8888 code C7F1F1FF, L 0.8862745, A 0.47843137, B 0.49411765, alpha 1.0, hue 0.54236877, saturation 0.14938237, and chroma 0.044538103.
    +
    This color constant "Aquamarine" has RGBA8888 code C7F1F1FF, L 0.8980392, A 0.47843137, B 0.49411765, alpha 1.0, hue 0.53142345, saturation 0.443393, and chroma 0.044538103.
    static final float
    -
    This color constant "Army Green" has RGBA8888 code 626200FF, L 0.37254903, A 0.47843137, B 0.54901963, alpha 1.0, hue 0.31596267, saturation 0.7062722, and chroma 0.106691405.
    +
    This color constant "Army Green" has RGBA8888 code 626200FF, L 0.37254903, A 0.47843137, B 0.54901963, alpha 1.0, hue 0.30842525, saturation 0.92855924, and chroma 0.106691405.
    static final float
    -
    This color constant "Artichoke" has RGBA8888 code 87B48EFF, L 0.65882355, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.4378436, saturation 0.14369221, and chroma 0.071815535.
    +
    This color constant "Artichoke" has RGBA8888 code 87B48EFF, L 0.6627451, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.42620972, saturation 0.34401047, and chroma 0.071815535.
    static final float
    -
    This color constant "Asparagus" has RGBA8888 code 587D3EFF, L 0.4509804, A 0.4627451, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.29466382, and chroma 0.104961164.
    +
    This color constant "Asparagus" has RGBA8888 code 587D3EFF, L 0.4509804, A 0.4627451, B 0.5372549, alpha 1.0, hue 0.36663744, saturation 0.62574995, and chroma 0.104961164.
    static final float
    -
    This color constant "Avocado" has RGBA8888 code 6AA805FF, L 0.58431375, A 0.4392157, B 0.5686275, alpha 1.0, hue 0.3653732, saturation 0.7637348, and chroma 0.18263547.
    +
    This color constant "Avocado" has RGBA8888 code 6AA805FF, L 0.58431375, A 0.4392157, B 0.5686275, alpha 1.0, hue 0.36058098, saturation 0.9563571, and chroma 0.18263547.
    static final float
    -
    This color constant "Banana Pudding" has RGBA8888 code E6D55AFF, L 0.8117647, A 0.48235294, B 0.5647059, alpha 1.0, hue 0.29236877, saturation 0.45877856, and chroma 0.1336143.
    +
    This color constant "Banana Pudding" has RGBA8888 code E6D55AFF, L 0.8235294, A 0.48235294, B 0.5647059, alpha 1.0, hue 0.2867793, saturation 0.7128265, and chroma 0.1336143.
    static final float
    -
    This color constant "Beige" has RGBA8888 code CBAA89FF, L 0.69803923, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.19157475, saturation 0.08972135, and chroma 0.054407768.
    +
    This color constant "Beige" has RGBA8888 code CBAA89FF, L 0.7019608, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.18556869, saturation 0.3384788, and chroma 0.054407768.
    static final float
    -
    This color constant "Black" has RGBA8888 code 000000FF, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +
    This color constant "Black" has RGBA8888 code 000000FF, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Blacklight Glow" has RGBA8888 code 8732D2FF, L 0.40784314, A 0.5647059, B 0.40392157, alpha 1.0, hue 0.84434295, saturation 0.6288005, and chroma 0.23076649.
    +
    This color constant "Blacklight Glow" has RGBA8888 code 8732D2FF, L 0.40784314, A 0.5647059, B 0.40392157, alpha 1.0, hue 0.8480996, saturation 0.79488873, and chroma 0.23076649.
    static final float
    -
    This color constant "Blue" has RGBA8888 code 0000FFFF, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.7323789, saturation 0.97586775, and chroma 0.31835338.
    +
    This color constant "Blue" has RGBA8888 code 0000FFFF, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.73413044, saturation 0.9925803, and chroma 0.31835338.
    static final float
    -
    This color constant "Blue Eye" has RGBA8888 code 4B7DC8FF, L 0.49803922, A 0.48235294, B 0.4392157, alpha 1.0, hue 0.70503896, saturation 0.32641554, and chroma 0.12609385.
    +
    This color constant "Blue Eye" has RGBA8888 code 4B7DC8FF, L 0.49803922, A 0.48235294, B 0.4392157, alpha 1.0, hue 0.7085295, saturation 0.5645155, and chroma 0.12609385.
    static final float
    -
    This color constant "Blue Smoke" has RGBA8888 code 8FABC7FF, L 0.6627451, A 0.49019608, B 0.4745098, alpha 1.0, hue 0.69157475, saturation 0.13795556, and chroma 0.054407768.
    +
    This color constant "Blue Smoke" has RGBA8888 code 8FABC7FF, L 0.6666667, A 0.49019608, B 0.4745098, alpha 1.0, hue 0.6988043, saturation 0.36140317, and chroma 0.054407768.
    static final float
    -
    This color constant "Blue Steel" has RGBA8888 code 7676CAFF, L 0.5137255, A 0.50980395, B 0.4392157, alpha 1.0, hue 0.77546334, saturation 0.32010388, and chroma 0.12265874.
    +
    This color constant "Blue Steel" has RGBA8888 code 7676CAFF, L 0.5137255, A 0.50980395, B 0.4392157, alpha 1.0, hue 0.78142345, saturation 0.5665577, and chroma 0.12265874.
    static final float
    -
    This color constant "Blueberry" has RGBA8888 code 0F377DFF, L 0.22745098, A 0.4862745, B 0.43137255, alpha 1.0, hue 0.71857655, saturation 0.5892011, and chroma 0.13942632.
    +
    This color constant "Blueberry" has RGBA8888 code 0F377DFF, L 0.22745098, A 0.4862745, B 0.43137255, alpha 1.0, hue 0.7221893, saturation 0.8420818, and chroma 0.13942632.
    static final float
    -
    This color constant "Bologna" has RGBA8888 code 98344DFF, L 0.36078432, A 0.5686275, B 0.5058824, alpha 1.0, hue 0.01361084, saturation 0.41545326, and chroma 0.13722007.
    +
    This color constant "Bologna" has RGBA8888 code 98344DFF, L 0.35686275, A 0.5647059, B 0.5058824, alpha 1.0, hue 0.018649152, saturation 0.6583555, and chroma 0.12943782.
    static final float
    -
    This color constant "Boysenberry" has RGBA8888 code 57578FFF, L 0.3764706, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.7840724, saturation 0.09466445, and chroma 0.091942206.
    +
    This color constant "Boysenberry" has RGBA8888 code 57578FFF, L 0.37254903, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.79236877, saturation 0.30004618, and chroma 0.091942206.
    static final float
    -
    This color constant "Brick" has RGBA8888 code D5524AFF, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.07195936, saturation 0.3226597, and chroma 0.15199278.
    +
    This color constant "Brick" has RGBA8888 code D5524AFF, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.073790275, saturation 0.60073465, and chroma 0.15199278.
    static final float
    -
    This color constant "Bright Red" has RGBA8888 code FF3C0AFF, L 0.54509807, A 0.5921569, B 0.5647059, alpha 1.0, hue 0.097439915, saturation 0.844288, and chroma 0.22432896.
    +
    This color constant "Bright Red" has RGBA8888 code FF3C0AFF, L 0.54901963, A 0.5921569, B 0.5647059, alpha 1.0, hue 0.09809959, saturation 0.9803628, and chroma 0.22432896.
    static final float
    -
    This color constant "Bronze Skin 1" has RGBA8888 code 73573BFF, L 0.37254903, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.19157475, saturation 0.19551525, and chroma 0.054407768.
    +
    This color constant "Bronze Skin 1" has RGBA8888 code 73573BFF, L 0.36862746, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.18556869, saturation 0.49134022, and chroma 0.054407768.
    static final float
    -
    This color constant "Bronze Skin 2" has RGBA8888 code 8F7357FF, L 0.4862745, A 0.50980395, B 0.52156866, alpha 1.0, hue 0.18210676, saturation 0.103822224, and chroma 0.0471994.
    +
    This color constant "Bronze Skin 2" has RGBA8888 code 8F7357FF, L 0.4862745, A 0.50980395, B 0.52156866, alpha 1.0, hue 0.17620972, saturation 0.3626056, and chroma 0.0471994.
    static final float
    -
    This color constant "Bronze Skin 3" has RGBA8888 code C49E73FF, L 0.654902, A 0.50980395, B 0.5294118, alpha 1.0, hue 0.19880433, saturation 0.12624669, and chroma 0.061763234.
    +
    This color constant "Bronze Skin 3" has RGBA8888 code C49E73FF, L 0.65882355, A 0.50980395, B 0.5294118, alpha 1.0, hue 0.19291253, saturation 0.3883638, and chroma 0.061763234.
    static final float
    -
    This color constant "Bronze Skin 4" has RGBA8888 code E3C7ABFF, L 0.79607844, A 0.5058824, B 0.5176471, alpha 1.0, hue 0.19880433, saturation 0.0852071, and chroma 0.03705794.
    +
    This color constant "Bronze Skin 4" has RGBA8888 code E3C7ABFF, L 0.8039216, A 0.5058824, B 0.5176471, alpha 1.0, hue 0.189452, saturation 0.3989011, and chroma 0.03705794.
    static final float
    -
    This color constant "Brown Velvet" has RGBA8888 code 4B2837FF, L 0.2, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.96857655, saturation 0.14266118, and chroma 0.059754133.
    +
    This color constant "Brown Velvet" has RGBA8888 code 4B2837FF, L 0.2, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.98019654, saturation 0.42432937, and chroma 0.059754133.
    static final float
    -
    This color constant "Bubble" has RGBA8888 code BFFFFFFF, L 0.91764706, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.81632656, and chroma 0.061763234.
    +
    This color constant "Bubble" has RGBA8888 code BFFFFFFF, L 0.92941177, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.54428434, saturation 1.0400157, and chroma 0.061763234.
    static final float
    -
    This color constant "Bubble Gum" has RGBA8888 code FF50BFFF, L 0.6156863, A 0.60784316, B 0.46666667, alpha 1.0, hue 0.95230013, saturation 0.79658675, and chroma 0.22487247.
    +
    This color constant "Bubble Gum" has RGBA8888 code FF50BFFF, L 0.61960787, A 0.60784316, B 0.46666667, alpha 1.0, hue 0.95571566, saturation 0.939369, and chroma 0.22487247.
    static final float
    -
    This color constant "Bubblegum Pink" has RGBA8888 code FD81FFFF, L 0.7176471, A 0.5803922, B 0.44313726, alpha 1.0, hue 0.9020082, saturation 0.881125, and chroma 0.19616999.
    +
    This color constant "Bubblegum Pink" has RGBA8888 code FD81FFFF, L 0.72156864, A 0.5803922, B 0.44313726, alpha 1.0, hue 0.90640444, saturation 0.97072536, and chroma 0.19616999.
    static final float
    -
    This color constant "Burnt Yellow" has RGBA8888 code D79B0FFF, L 0.65882355, A 0.5058824, B 0.57254905, alpha 1.0, hue 0.23712316, saturation 0.76290655, and chroma 0.14500555.
    +
    This color constant "Burnt Yellow" has RGBA8888 code D79B0FFF, L 0.6627451, A 0.5058824, B 0.57254905, alpha 1.0, hue 0.23330018, saturation 0.9319499, and chroma 0.14500555.
    static final float
    -
    This color constant "Calm Sky" has RGBA8888 code 4AA4FFFF, L 0.627451, A 0.47058824, B 0.42745098, alpha 1.0, hue 0.6887114, saturation 0.9255335, and chroma 0.15595676.
    +
    This color constant "Calm Sky" has RGBA8888 code 4AA4FFFF, L 0.6313726, A 0.47058824, B 0.42745098, alpha 1.0, hue 0.69098294, saturation 0.9656604, and chroma 0.15595676.
    static final float
    -
    This color constant "Carmine" has RGBA8888 code BD1039FF, L 0.3882353, A 0.59607846, B 0.5254902, alpha 1.0, hue 0.04126853, saturation 0.8050748, and chroma 0.198028.
    +
    This color constant "Carmine" has RGBA8888 code BD1039FF, L 0.38431373, A 0.59607846, B 0.5254902, alpha 1.0, hue 0.043443024, saturation 0.9440549, and chroma 0.198028.
    static final float
    -
    This color constant "Cedar Wood" has RGBA8888 code 621800FF, L 0.2, A 0.54901963, B 0.53333336, alpha 1.0, hue 0.095056064, saturation 0.8144353, and chroma 0.11809544.
    +
    This color constant "Cedar Wood" has RGBA8888 code 621800FF, L 0.2, A 0.54901963, B 0.53333336, alpha 1.0, hue 0.09638812, saturation 0.9035079, and chroma 0.11809544.
    static final float
    -
    This color constant "Celadon" has RGBA8888 code AFFFAFFF, L 0.8862745, A 0.44705883, B 0.53333336, alpha 1.0, hue 0.41055703, saturation 0.96378696, and chroma 0.12463325.
    +
    This color constant "Celadon" has RGBA8888 code AFFFAFFF, L 0.89411765, A 0.44705883, B 0.53333336, alpha 1.0, hue 0.4036119, saturation 1.0540925, and chroma 0.12463325.
    static final float
    -
    This color constant "Celery" has RGBA8888 code 7DFF73FF, L 0.84313726, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39695174, saturation 0.8276294, and chroma 0.20078278.
    +
    This color constant "Celery" has RGBA8888 code 7DFF73FF, L 0.85490197, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39260027, saturation 1.0044117, and chroma 0.20078278.
    static final float
    -
    This color constant "Chartreuse" has RGBA8888 code C8FF41FF, L 0.8862745, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34942675, saturation 0.9817451, and chroma 0.2070681.
    +
    This color constant "Chartreuse" has RGBA8888 code C8FF41FF, L 0.89411765, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34525383, saturation 1.0441982, and chroma 0.2070681.
    static final float
    -
    This color constant "Cherry Syrup" has RGBA8888 code 551937FF, L 0.19215687, A 0.5529412, B 0.49019608, alpha 1.0, hue 0.97084755, saturation 0.4832559, and chroma 0.107261956.
    +
    This color constant "Cherry Syrup" has RGBA8888 code 551937FF, L 0.1882353, A 0.5529412, B 0.49019608, alpha 1.0, hue 0.97740346, saturation 0.76443976, and chroma 0.107261956.
    static final float
    -
    This color constant "Chinchilla" has RGBA8888 code 929292FF, L 0.58431375, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0014222222, and chroma 0.0055242716.
    +
    This color constant "Chinchilla" has RGBA8888 code 929292FF, L 0.58431375, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Chipped Granite" has RGBA8888 code A8B9DCFF, L 0.7254902, A 0.49411765, B 0.4745098, alpha 1.0, hue 0.7139029, saturation 0.21914436, and chroma 0.052115876.
    +
    This color constant "Chipped Granite" has RGBA8888 code A8B9DCFF, L 0.73333335, A 0.49411765, B 0.4745098, alpha 1.0, hue 0.7237039, saturation 0.46790484, and chroma 0.052115876.
    static final float
    -
    This color constant "Cloud" has RGBA8888 code EDEDEDFF, L 0.90588236, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.015122874, and chroma 0.0055242716.
    +
    This color constant "Cloud" has RGBA8888 code EDEDEDFF, L 0.91764706, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Coal Black" has RGBA8888 code 131313FF, L 0.05882353, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.015122874, and chroma 0.0055242716.
    +
    This color constant "Coal Black" has RGBA8888 code 131313FF, L 0.05882353, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Cold Iron" has RGBA8888 code 57738FFF, L 0.44705883, A 0.4862745, B 0.4745098, alpha 1.0, hue 0.67138404, saturation 0.1397212, and chroma 0.05767509.
    +
    This color constant "Cold Iron" has RGBA8888 code 57738FFF, L 0.44705883, A 0.4862745, B 0.4745098, alpha 1.0, hue 0.6762097, saturation 0.35306334, and chroma 0.05767509.
    static final float
    -
    This color constant "Corn Silk" has RGBA8888 code C7C78FFF, L 0.7607843, A 0.4862745, B 0.5294118, alpha 1.0, hue 0.31948605, saturation 0.103308514, and chroma 0.064659946.
    +
    This color constant "Corn Silk" has RGBA8888 code C7C78FFF, L 0.76862746, A 0.4862745, B 0.5294118, alpha 1.0, hue 0.30708748, saturation 0.34873483, and chroma 0.064659946.
    static final float
    -
    This color constant "Cornflower Blue" has RGBA8888 code 3C3CF5FF, L 0.3764706, A 0.5058824, B 0.36862746, alpha 1.0, hue 0.75710976, saturation 0.83261603, and chroma 0.26198098.
    +
    This color constant "Cornflower Blue" has RGBA8888 code 3C3CF5FF, L 0.3764706, A 0.5058824, B 0.36862746, alpha 1.0, hue 0.75962687, saturation 0.9183486, and chroma 0.26198098.
    static final float
    -
    This color constant "Cotton Candy" has RGBA8888 code FFDCF5FF, L 0.8901961, A 0.5176471, B 0.49019608, alpha 1.0, hue 0.9192883, saturation 0.38934803, and chroma 0.040217306.
    +
    This color constant "Cotton Candy" has RGBA8888 code FFDCF5FF, L 0.9019608, A 0.5176471, B 0.49019608, alpha 1.0, hue 0.939452, saturation 0.97912085, and chroma 0.040217306.
    static final float
    -
    This color constant "Cream" has RGBA8888 code FFFFBFFF, L 0.9647059, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.31215638, saturation 0.8888889, and chroma 0.071815535.
    +
    This color constant "Cream" has RGBA8888 code FFFFBFFF, L 0.972549, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.30119568, saturation 1.1858541, and chroma 0.071815535.
    static final float
    -
    This color constant "Cricket" has RGBA8888 code 8F8F57FF, L 0.5568628, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.31215638, saturation 0.1962549, and chroma 0.071815535.
    +
    This color constant "Cricket" has RGBA8888 code 8F8F57FF, L 0.5568628, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.30119568, saturation 0.48650423, and chroma 0.071815535.
    static final float
    -
    This color constant "Cyan" has RGBA8888 code 00FFFFFF, L 0.8509804, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.54374534, saturation 0.95340395, and chroma 0.1582875.
    +
    This color constant "Cyan" has RGBA8888 code 00FFFFFF, L 0.85882354, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.5409493, saturation 1.0340465, and chroma 0.1582875.
    static final float
    -
    This color constant "Dark Gray" has RGBA8888 code 494949FF, L 0.2901961, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.003331945, and chroma 0.0055242716.
    +
    This color constant "Dark Gray" has RGBA8888 code 494949FF, L 0.28627452, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Dark Pine" has RGBA8888 code 283405FF, L 0.1764706, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3636593, saturation 0.52099174, and chroma 0.07753685.
    +
    This color constant "Dark Pine" has RGBA8888 code 283405FF, L 0.17254902, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3524291, saturation 0.8695652, and chroma 0.07753685.
    static final float
    -
    This color constant "Dark Skin 1" has RGBA8888 code 573B3BFF, L 0.2627451, A 0.5176471, B 0.5058824, alpha 1.0, hue 0.05119568, saturation 0.04347301, and chroma 0.03705794.
    +
    This color constant "Dark Skin 1" has RGBA8888 code 573B3BFF, L 0.2627451, A 0.5176471, B 0.5058824, alpha 1.0, hue 0.060548004, saturation 0.24478021, and chroma 0.03705794.
    static final float
    -
    This color constant "Dark Skin 2" has RGBA8888 code 73413CFF, L 0.31764707, A 0.5294118, B 0.5137255, alpha 1.0, hue 0.06948605, saturation 0.103308514, and chroma 0.064659946.
    +
    This color constant "Dark Skin 2" has RGBA8888 code 73413CFF, L 0.31764707, A 0.5294118, B 0.5137255, alpha 1.0, hue 0.073790275, saturation 0.36507234, and chroma 0.064659946.
    static final float
    -
    This color constant "Dark Skin 3" has RGBA8888 code 8E5555FF, L 0.4117647, A 0.53333336, B 0.50980395, alpha 1.0, hue 0.045517046, saturation 0.0917525, and chroma 0.069218926.
    +
    This color constant "Dark Skin 3" has RGBA8888 code 8E5555FF, L 0.4117647, A 0.53333336, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.33287132, and chroma 0.069218926.
    static final float
    -
    This color constant "Dark Teal" has RGBA8888 code 234146FF, L 0.23137255, A 0.47843137, B 0.4862745, alpha 1.0, hue 0.59020853, saturation 0.4045211, and chroma 0.050931267.
    +
    This color constant "Dark Teal" has RGBA8888 code 234146FF, L 0.22745098, A 0.47843137, B 0.4862745, alpha 1.0, hue 0.58601886, saturation 0.64788353, and chroma 0.050931267.
    static final float
    -
    This color constant "Deep Jungle" has RGBA8888 code 191E0FFF, L 0.09411765, A 0.4862745, B 0.5137255, alpha 1.0, hue 0.375, saturation 0.2120065, and chroma 0.038669903.
    +
    This color constant "Deep Jungle" has RGBA8888 code 191E0FFF, L 0.09411765, A 0.4862745, B 0.5137255, alpha 1.0, hue 0.3524291, saturation 0.625, and chroma 0.038669903.
    static final float
    -
    This color constant "Deep Purple" has RGBA8888 code 7F007FFF, L 0.29411766, A 0.58431375, B 0.44313726, alpha 1.0, hue 0.9055531, saturation 0.87330574, and chroma 0.20259848.
    +
    This color constant "Deep Purple" has RGBA8888 code 7F007FFF, L 0.29411766, A 0.58431375, B 0.44313726, alpha 1.0, hue 0.90979147, saturation 0.96580774, and chroma 0.20259848.
    static final float
    -
    This color constant "Deep Teal" has RGBA8888 code 055A5CFF, L 0.30980393, A 0.4627451, B 0.4862745, alpha 1.0, hue 0.55616736, saturation 0.80987656, and chroma 0.079095535.
    +
    This color constant "Deep Teal" has RGBA8888 code 055A5CFF, L 0.30588236, A 0.4627451, B 0.4862745, alpha 1.0, hue 0.5511957, saturation 0.9035079, and chroma 0.079095535.
    static final float
    -
    This color constant "Denim Blue" has RGBA8888 code 109CDEFF, L 0.57254905, A 0.45490196, B 0.4392157, alpha 1.0, hue 0.6483954, saturation 0.9083981, and chroma 0.15078327.
    +
    This color constant "Denim Blue" has RGBA8888 code 109CDEFF, L 0.57254905, A 0.45882353, B 0.4392157, alpha 1.0, hue 0.65640444, saturation 0.9013878, and chroma 0.14626285.
    static final float
    -
    This color constant "Desert Rain" has RGBA8888 code 326496FF, L 0.38431373, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6840373, saturation 0.4548087, and chroma 0.106691405.
    +
    This color constant "Desert Rain" has RGBA8888 code 326496FF, L 0.38431373, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6871773, saturation 0.7027027, and chroma 0.106691405.
    static final float
    -
    This color constant "Drab Green" has RGBA8888 code 414123FF, L 0.24705882, A 0.49019608, B 0.52156866, alpha 1.0, hue 0.31789324, saturation 0.20790316, and chroma 0.0471994.
    +
    This color constant "Drab Green" has RGBA8888 code 414123FF, L 0.24313726, A 0.49019608, B 0.52156866, alpha 1.0, hue 0.30119568, saturation 0.5499613, and chroma 0.0471994.
    static final float
    -
    This color constant "Dreary Blue" has RGBA8888 code 3B5773FF, L 0.33333334, A 0.4862745, B 0.47058824, alpha 1.0, hue 0.680514, saturation 0.20566711, and chroma 0.064659946.
    +
    This color constant "Dreary Blue" has RGBA8888 code 3B5773FF, L 0.33333334, A 0.4862745, B 0.47058824, alpha 1.0, hue 0.6855687, saturation 0.44798666, and chroma 0.064659946.
    static final float
    -
    This color constant "Dried Sage" has RGBA8888 code ABE3C5FF, L 0.81960785, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.118390046, and chroma 0.069218926.
    +
    This color constant "Dried Sage" has RGBA8888 code ABE3C5FF, L 0.83137256, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.34176013, and chroma 0.069218926.
    static final float
    -
    This color constant "Driftwood" has RGBA8888 code 8C805AFF, L 0.5137255, A 0.49803922, B 0.5254902, alpha 1.0, hue 0.26221767, saturation 0.12760368, and chroma 0.050931267.
    +
    This color constant "Driftwood" has RGBA8888 code 8C805AFF, L 0.5137255, A 0.49803922, B 0.5254902, alpha 1.0, hue 0.25, saturation 0.4117647, and chroma 0.050931267.
    static final float
    -
    This color constant "Dry Brush" has RGBA8888 code AC9400FF, L 0.5882353, A 0.4862745, B 0.5686275, alpha 1.0, hue 0.28142345, saturation 0.77671087, and chroma 0.13942632.
    +
    This color constant "Dry Brush" has RGBA8888 code AC9400FF, L 0.5921569, A 0.4862745, B 0.5686275, alpha 1.0, hue 0.27629608, saturation 0.96043617, and chroma 0.13942632.
    static final float
    -
    This color constant "Dry Pepper" has RGBA8888 code DA6E0AFF, L 0.5647059, A 0.5411765, B 0.5647059, alpha 1.0, hue 0.15979148, saturation 0.77262974, and chroma 0.15279381.
    +
    This color constant "Dry Pepper" has RGBA8888 code DA6E0AFF, L 0.5647059, A 0.5411765, B 0.5647059, alpha 1.0, hue 0.15858527, saturation 0.9203844, and chroma 0.15279381.
    static final float
    -
    This color constant "Dull Azure" has RGBA8888 code 2378DCFF, L 0.47843137, A 0.4745098, B 0.41960785, alpha 1.0, hue 0.70114374, saturation 0.6228432, and chroma 0.16801417.
    +
    This color constant "Dull Azure" has RGBA8888 code 2378DCFF, L 0.47843137, A 0.4745098, B 0.41960785, alpha 1.0, hue 0.7036233, saturation 0.8188476, and chroma 0.16801417.
    static final float
    -
    This color constant "Dull Green" has RGBA8888 code 53500AFF, L 0.30588236, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30935085, saturation 0.700948, and chroma 0.096477255.
    +
    This color constant "Dull Green" has RGBA8888 code 53500AFF, L 0.3019608, A 0.48235294, B 0.5411765, alpha 1.0, hue 0.30549568, saturation 0.86701477, and chroma 0.08924734.
    static final float
    -
    This color constant "Dull Violet" has RGBA8888 code 73578FFF, L 0.40392157, A 0.5254902, B 0.4627451, alpha 1.0, hue 0.84551346, saturation 0.09549119, and chroma 0.08992863.
    +
    This color constant "Dull Violet" has RGBA8888 code 73578FFF, L 0.40392157, A 0.5254902, B 0.4627451, alpha 1.0, hue 0.8552204, saturation 0.31237683, and chroma 0.08992863.
    static final float
    -
    This color constant "Dun" has RGBA8888 code B5B572FF, L 0.69411767, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.30616736, saturation 0.18171746, and chroma 0.079095535.
    +
    This color constant "Dun" has RGBA8888 code B5B572FF, L 0.7019608, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.29637668, saturation 0.46401364, and chroma 0.079095535.
    static final float
    -
    This color constant "Dust Bunny" has RGBA8888 code BED2F0FF, L 0.80784315, A 0.49411765, B 0.47843137, alpha 1.0, hue 0.70763123, saturation 0.34188035, and chroma 0.044538103.
    +
    This color constant "Dust Bunny" has RGBA8888 code BED2F0FF, L 0.81960785, A 0.49411765, B 0.47843137, alpha 1.0, hue 0.71857655, saturation 0.5998846, and chroma 0.044538103.
    static final float
    -
    This color constant "Dusty Grape" has RGBA8888 code 724072FF, L 0.3372549, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.18195479, and chroma 0.1008085.
    +
    This color constant "Dusty Grape" has RGBA8888 code 724072FF, L 0.3372549, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.44197983, and chroma 0.1008085.
    static final float
    -
    This color constant "Dusty Green" has RGBA8888 code 73AB73FF, L 0.6117647, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.41176948, saturation 0.19803588, and chroma 0.096477255.
    +
    This color constant "Dusty Green" has RGBA8888 code 73AB73FF, L 0.6156863, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.40278715, saturation 0.39375985, and chroma 0.096477255.
    static final float
    -
    This color constant "Dusty Pink" has RGBA8888 code C78FB9FF, L 0.64705884, A 0.5372549, B 0.48235294, alpha 1.0, hue 0.9295985, saturation 0.1030243, and chroma 0.0821242.
    +
    This color constant "Dusty Pink" has RGBA8888 code C78FB9FF, L 0.6509804, A 0.5372549, B 0.48235294, alpha 1.0, hue 0.939452, saturation 0.359011, and chroma 0.0821242.
    static final float
    -
    This color constant "Earwax" has RGBA8888 code BFBF3FFF, L 0.72156864, A 0.4745098, B 0.5686275, alpha 1.0, hue 0.30658844, saturation 0.59262407, and chroma 0.14584495.
    +
    This color constant "Earwax" has RGBA8888 code BFBF3FFF, L 0.7254902, A 0.4745098, B 0.5686275, alpha 1.0, hue 0.30119568, saturation 0.824942, and chroma 0.14584495.
    static final float
    -
    This color constant "Eggplant" has RGBA8888 code 320A46FF, L 0.12156863, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.8534426, saturation 0.74010134, and chroma 0.12265874.
    +
    This color constant "Eggplant" has RGBA8888 code 320A46FF, L 0.12156863, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.860581, saturation 0.8926, and chroma 0.12265874.
    static final float
    -
    This color constant "Electric Blue" has RGBA8888 code 0052F6FF, L 0.4, A 0.48235294, B 0.3764706, alpha 1.0, hue 0.72740346, saturation 0.8384659, and chroma 0.24859223.
    +
    This color constant "Electric Blue" has RGBA8888 code 0052F6FF, L 0.4, A 0.48235294, B 0.3764706, alpha 1.0, hue 0.72956455, saturation 0.9193235, and chroma 0.24859223.
    static final float
    -
    This color constant "Embers" has RGBA8888 code F55A32FF, L 0.57254905, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10581406, saturation 0.668431, and chroma 0.1836353.
    +
    This color constant "Embers" has RGBA8888 code F55A32FF, L 0.5764706, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10637331, saturation 0.86455137, and chroma 0.1836353.
    static final float
    -
    This color constant "Emerald" has RGBA8888 code 00C514FF, L 0.6313726, A 0.4, B 0.57254905, alpha 1.0, hue 0.40009674, saturation 0.984562, and chroma 0.24612474.
    +
    This color constant "Emerald" has RGBA8888 code 00C514FF, L 0.63529414, A 0.4, B 0.57254905, alpha 1.0, hue 0.3965574, saturation 0.9812699, and chroma 0.24612474.
    static final float
    -
    This color constant "Eminence" has RGBA8888 code 3C233CFF, L 0.16862746, A 0.5254902, B 0.48235294, alpha 1.0, hue 0.9036119, saturation 0.1524158, and chroma 0.061763234.
    +
    This color constant "Eminence" has RGBA8888 code 3C233CFF, L 0.16862746, A 0.5254902, B 0.48235294, alpha 1.0, hue 0.9173693, saturation 0.42432937, and chroma 0.061763234.
    static final float
    -
    This color constant "Eucalyptus" has RGBA8888 code 1C8C4EFF, L 0.46666667, A 0.43529412, B 0.5294118, alpha 1.0, hue 0.43210676, saturation 0.8010974, and chroma 0.1415982.
    +
    This color constant "Eucalyptus" has RGBA8888 code 1C8C4EFF, L 0.46666667, A 0.43529412, B 0.5294118, alpha 1.0, hue 0.42620972, saturation 0.8726119, and chroma 0.1415982.
    static final float
    -
    This color constant "Faded Blue" has RGBA8888 code 3F3FBFFF, L 0.33333334, A 0.50980395, B 0.4, alpha 1.0, hue 0.7655599, saturation 0.41548988, and chroma 0.20017387.
    +
    This color constant "Faded Blue" has RGBA8888 code 3F3FBFFF, L 0.33333334, A 0.50980395, B 0.40392157, alpha 1.0, hue 0.76980346, saturation 0.6282279, and chroma 0.19240016.
    static final float
    -
    This color constant "Fawn" has RGBA8888 code BF7F3FFF, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18403731, saturation 0.4331543, and chroma 0.106691405.
    +
    This color constant "Fawn" has RGBA8888 code BF7F3FFF, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18118605, saturation 0.6984303, and chroma 0.106691405.
    static final float
    -
    This color constant "Feather Down" has RGBA8888 code E3E3FFFF, L 0.88235295, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.7676211, saturation 0.6200378, and chroma 0.0353726.
    +
    This color constant "Feather Down" has RGBA8888 code E3E3FFFF, L 0.89411765, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.78898686, saturation 0.9162457, and chroma 0.0353726.
    static final float
    -
    This color constant "Fern Green" has RGBA8888 code 0C5C0CFF, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.40522522, saturation 0.9969778, and chroma 0.14626285.
    +
    This color constant "Fern Green" has RGBA8888 code 0C5C0CFF, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.399282, saturation 0.95390135, and chroma 0.14626285.
    static final float
    -
    This color constant "Flamingo" has RGBA8888 code FC3A8CFF, L 0.5647059, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.8134724, and chroma 0.23076649.
    +
    This color constant "Flamingo" has RGBA8888 code FC3A8CFF, L 0.5647059, A 0.6117647, B 0.49411765, alpha 1.0, hue 0.99452704, saturation 0.90678865, and chroma 0.22296442.
    static final float
    -
    This color constant "Floral Foam" has RGBA8888 code 0F6946FF, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.4596309, saturation 0.893996, and chroma 0.10895567.
    +
    This color constant "Floral Foam" has RGBA8888 code 0F6946FF, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.45250326, saturation 0.90676475, and chroma 0.10895567.
    static final float
    -
    This color constant "Forest Glen" has RGBA8888 code 149605FF, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.40057325, saturation 0.9817451, and chroma 0.2070681.
    +
    This color constant "Forest Glen" has RGBA8888 code 149605FF, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.39636543, saturation 0.9778058, and chroma 0.2070681.
    static final float
    -
    This color constant "Frog Green" has RGBA8888 code 73C805FF, L 0.6784314, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.37081593, saturation 0.78956354, and chroma 0.209995.
    +
    This color constant "Frog Green" has RGBA8888 code 73C805FF, L 0.68235296, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.36663744, saturation 0.96097314, and chroma 0.209995.
    static final float
    -
    This color constant "Fruit Punch" has RGBA8888 code C80078FF, L 0.42745098, A 0.6117647, B 0.48235294, alpha 1.0, hue 0.9750635, saturation 0.85248, and chroma 0.22541466.
    +
    This color constant "Fruit Punch" has RGBA8888 code C80078FF, L 0.42745098, A 0.6117647, B 0.48235294, alpha 1.0, hue 0.9781724, saturation 0.95982176, and chroma 0.22541466.
    static final float
    -
    This color constant "Garter Snake" has RGBA8888 code 64C082FF, L 0.6666667, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.43293634, saturation 0.3960396, and chroma 0.124142565.
    +
    This color constant "Garter Snake" has RGBA8888 code 64C082FF, L 0.67058825, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.42620972, saturation 0.5906595, and chroma 0.124142565.
    static final float
    -
    This color constant "Grape Lollipop" has RGBA8888 code 5A187BFF, L 0.24313726, A 0.5568628, B 0.43529412, alpha 1.0, hue 0.8647537, saturation 0.7002268, and chroma 0.17160846.
    +
    This color constant "Grape Lollipop" has RGBA8888 code 5A187BFF, L 0.23921569, A 0.5568628, B 0.43529412, alpha 1.0, hue 0.86987174, saturation 0.8600672, and chroma 0.17160846.
    static final float
    -
    This color constant "Grape Soda" has RGBA8888 code 410062FF, L 0.16470589, A 0.54901963, B 0.43529412, alpha 1.0, hue 0.8531978, saturation 0.9058, and chroma 0.16172063.
    +
    This color constant "Grape Soda" has RGBA8888 code 410062FF, L 0.16470589, A 0.54901963, B 0.43529412, alpha 1.0, hue 0.8586049, saturation 0.98169184, and chroma 0.16172063.
    static final float
    -
    This color constant "Graphite" has RGBA8888 code 373737FF, L 0.21176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.004326663, and chroma 0.0055242716.
    +
    This color constant "Graphite" has RGBA8888 code 373737FF, L 0.20784314, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0016803193, and chroma 0.0055242716.
    +
    This color constant "Gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Gray Green" has RGBA8888 code 506450FF, L 0.3764706, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.41928825, saturation 0.07537778, and chroma 0.040217306.
    +
    This color constant "Gray Green" has RGBA8888 code 506450FF, L 0.37254903, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.3975709, saturation 0.22222222, and chroma 0.040217306.
    static final float
    -
    This color constant "Green" has RGBA8888 code 00FF00FF, L 0.8, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39883053, saturation 0.9818446, and chroma 0.29610303.
    +
    This color constant "Green" has RGBA8888 code 00FF00FF, L 0.80784315, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39588714, saturation 1.0080564, and chroma 0.29610303.
    static final float
    -
    This color constant "Greyhound" has RGBA8888 code A4A4A4FF, L 0.6509804, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0012193263, and chroma 0.0055242716.
    +
    This color constant "Greyhound" has RGBA8888 code A4A4A4FF, L 0.654902, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Ham" has RGBA8888 code EBACE1FF, L 0.7647059, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.90448654, saturation 0.28008983, and chroma 0.08992863.
    +
    This color constant "Ham" has RGBA8888 code EBACE1FF, L 0.77254903, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.91398114, saturation 0.5830952, and chroma 0.08992863.
    static final float
    -
    This color constant "Heliotrope" has RGBA8888 code FF52FFFF, L 0.6509804, A 0.6117647, B 0.42745098, alpha 1.0, hue 0.90835387, saturation 0.90332043, and chroma 0.26545262.
    +
    This color constant "Heliotrope" has RGBA8888 code FF52FFFF, L 0.654902, A 0.6117647, B 0.42745098, alpha 1.0, hue 0.91158056, saturation 0.9893361, and chroma 0.26545262.
    static final float
    -
    This color constant "Hidden Blue" has RGBA8888 code 186ABDFF, L 0.41568628, A 0.4745098, B 0.42745098, alpha 1.0, hue 0.696238, saturation 0.681662, and chroma 0.15319274.
    +
    This color constant "Hidden Blue" has RGBA8888 code 186ABDFF, L 0.41568628, A 0.4745098, B 0.42745098, alpha 1.0, hue 0.6988043, saturation 0.88249606, and chroma 0.15319274.
    static final float
    -
    This color constant "Honeydew" has RGBA8888 code C7E3ABFF, L 0.8352941, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.375, saturation 0.069975674, and chroma 0.071815535.
    +
    This color constant "Honeydew" has RGBA8888 code C7E3ABFF, L 0.84313726, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.3627901, saturation 0.28811076, and chroma 0.071815535.
    static final float
    -
    This color constant "Hospital Green" has RGBA8888 code 3FBFBFFF, L 0.6666667, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54788184, saturation 0.7316009, and chroma 0.11861114.
    +
    This color constant "Hospital Green" has RGBA8888 code 3FBFBFFF, L 0.67058825, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54428434, saturation 0.83201253, and chroma 0.11861114.
    static final float
    -
    This color constant "Hot Sauce" has RGBA8888 code A5140AFF, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.08136994, saturation 0.8018141, and chroma 0.1836353.
    +
    This color constant "Hot Sauce" has RGBA8888 code A5140AFF, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.0826307, saturation 0.94850093, and chroma 0.1836353.
    static final float
    -
    This color constant "Hunter Green" has RGBA8888 code 1E2D23FF, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.44880432, saturation 0.2366864, and chroma 0.03705794.
    +
    This color constant "Hunter Green" has RGBA8888 code 1E2D23FF, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.42620972, saturation 0.4259177, and chroma 0.03705794.
    static final float
    -
    This color constant "Indigo" has RGBA8888 code 231094FF, L 0.19215687, A 0.5058824, B 0.39607844, alpha 1.0, hue 0.75899065, saturation 0.85232514, and chroma 0.20736265.
    +
    This color constant "Indigo" has RGBA8888 code 231094FF, L 0.1882353, A 0.5058824, B 0.39607844, alpha 1.0, hue 0.76221764, saturation 0.9313146, and chroma 0.20736265.
    static final float
    -
    This color constant "Infection" has RGBA8888 code 96DC19FF, L 0.75686276, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.3624701, saturation 0.743936, and chroma 0.2105755.
    +
    This color constant "Infection" has RGBA8888 code 96DC19FF, L 0.7647059, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.35831934, saturation 0.9158818, and chroma 0.2105755.
    static final float
    -
    This color constant "Iolite" has RGBA8888 code 494973FF, L 0.30980393, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.06848998, and chroma 0.07513822.
    +
    This color constant "Iolite" has RGBA8888 code 494973FF, L 0.30588236, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.25970548, and chroma 0.07513822.
    static final float
    -
    This color constant "Iris" has RGBA8888 code 6241F6FF, L 0.41960785, A 0.5294118, B 0.38039216, alpha 1.0, hue 0.7883731, saturation 0.79392385, and chroma 0.24537967.
    +
    This color constant "Iris" has RGBA8888 code 6241F6FF, L 0.41960785, A 0.5294118, B 0.38039216, alpha 1.0, hue 0.7914705, saturation 0.8999522, and chroma 0.24537967.
    static final float
    -
    This color constant "Iron" has RGBA8888 code 6E6E6EFF, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0020156212, and chroma 0.0055242716.
    +
    This color constant "Iron" has RGBA8888 code 6E6E6EFF, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Ivy Green" has RGBA8888 code 007F00FF, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.4036119, saturation 1.0868253, and chroma 0.18528971.
    +
    This color constant "Ivy Green" has RGBA8888 code 007F00FF, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.3989195, saturation 0.98336864, and chroma 0.18528971.
    static final float
    -
    This color constant "Jade" has RGBA8888 code 3FBF3FFF, L 0.6313726, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4055531, saturation 0.71121687, and chroma 0.20259848.
    +
    This color constant "Jade" has RGBA8888 code 3FBF3FFF, L 0.63529414, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4012713, saturation 0.806468, and chroma 0.20259848.
    static final float
    -
    This color constant "Juicy Grape" has RGBA8888 code 6010D0FF, L 0.32156864, A 0.54901963, B 0.38039216, alpha 1.0, hue 0.81189364, saturation 0.8997464, and chroma 0.2575164.
    +
    This color constant "Juicy Grape" has RGBA8888 code 6010D0FF, L 0.32156864, A 0.54901963, B 0.38039216, alpha 1.0, hue 0.8150709, saturation 0.9616342, and chroma 0.2575164.
    static final float
    -
    This color constant "Kelly Green" has RGBA8888 code 578F57FF, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.40801254, saturation 0.29565728, and chroma 0.107261956.
    +
    This color constant "Kelly Green" has RGBA8888 code 578F57FF, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.39991105, saturation 0.49459895, and chroma 0.107261956.
    static final float
    -
    This color constant "Koa" has RGBA8888 code A04B05FF, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15239218, saturation 0.81816477, and chroma 0.12896542.
    +
    This color constant "Koa" has RGBA8888 code A04B05FF, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15127131, saturation 0.9299811, and chroma 0.12896542.
    static final float
    -
    This color constant "Kyanite" has RGBA8888 code 3B7373FF, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.545517, saturation 0.4471342, and chroma 0.069218926.
    +
    This color constant "Kyanite" has RGBA8888 code 3B7373FF, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.53898686, saturation 0.63432395, and chroma 0.069218926.
    static final float
    -
    This color constant "Lavender" has RGBA8888 code B991FFFF, L 0.67058825, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.82570946, saturation 0.84011585, and chroma 0.14500555.
    +
    This color constant "Lavender" has RGBA8888 code B991FFFF, L 0.6745098, A 0.53333336, B 0.43529412, alpha 1.0, hue 0.83155453, saturation 0.9661873, and chroma 0.14500555.
    static final float
    -
    This color constant "Lead" has RGBA8888 code 5B5B5BFF, L 0.3647059, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716.
    +
    This color constant "Lead" has RGBA8888 code 5B5B5BFF, L 0.36078432, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Light Gray" has RGBA8888 code C9C9C9FF, L 0.78431374, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716.
    +
    This color constant "Light Gray" has RGBA8888 code C9C9C9FF, L 0.7921569, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Light Skin 1" has RGBA8888 code 7E6E60FF, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.0229381, and chroma 0.022777155.
    +
    This color constant "Light Skin 1" has RGBA8888 code 7E6E60FF, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.18976586, and chroma 0.022777155.
    static final float
    -
    This color constant "Light Skin 2" has RGBA8888 code A0695FFF, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.078336, and chroma 0.068331465.
    +
    This color constant "Light Skin 2" has RGBA8888 code A0695FFF, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.2948119, and chroma 0.068331465.
    static final float
    -
    This color constant "Light Skin 3" has RGBA8888 code C07872FF, L 0.5647059, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.070401505, saturation 0.1291548, and chroma 0.0821242.
    +
    This color constant "Light Skin 3" has RGBA8888 code C07872FF, L 0.5686275, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.073790275, saturation 0.39929786, and chroma 0.0821242.
    static final float
    -
    This color constant "Light Skin 4" has RGBA8888 code D08A74FF, L 0.62352943, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.10391619, saturation 0.1947072, and chroma 0.0835974.
    +
    This color constant "Light Skin 4" has RGBA8888 code D08A74FF, L 0.627451, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.105220385, saturation 0.49572846, and chroma 0.0835974.
    static final float
    -
    This color constant "Light Skin 5" has RGBA8888 code E19B7DFF, L 0.6862745, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.2743484, and chroma 0.082864076.
    +
    This color constant "Light Skin 5" has RGBA8888 code E19B7DFF, L 0.6901961, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.5954583, and chroma 0.082864076.
    static final float
    -
    This color constant "Light Skin 6" has RGBA8888 code EBAA8CFF, L 0.73333335, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.30118066, and chroma 0.071815535.
    +
    This color constant "Light Skin 6" has RGBA8888 code EBAA8CFF, L 0.7372549, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.6386771, and chroma 0.071815535.
    static final float
    -
    This color constant "Light Skin 7" has RGBA8888 code F5B99BFF, L 0.78039217, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.138223, saturation 0.38347107, and chroma 0.06652104.
    +
    This color constant "Light Skin 7" has RGBA8888 code F5B99BFF, L 0.7882353, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.13720988, saturation 0.76829535, and chroma 0.06652104.
    static final float
    -
    This color constant "Light Skin 8" has RGBA8888 code F6C8AFFF, L 0.81960785, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.14085212, saturation 0.43699297, and chroma 0.055518243.
    +
    This color constant "Light Skin 8" has RGBA8888 code F6C8AFFF, L 0.827451, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.13941902, saturation 0.8221316, and chroma 0.055518243.
    static final float
    -
    This color constant "Light Skin 9" has RGBA8888 code F5E1D2FF, L 0.8784314, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.16171224, and chroma 0.022777155.
    +
    This color constant "Light Skin 9" has RGBA8888 code F5E1D2FF, L 0.8901961, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.6555548, and chroma 0.022777155.
    static final float
    -
    This color constant "Lilac" has RGBA8888 code D7A5FFFF, L 0.7411765, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.8534426, saturation 0.8283974, and chroma 0.12265874.
    +
    This color constant "Lilac" has RGBA8888 code D7A5FFFF, L 0.7490196, A 0.5372549, B 0.4509804, alpha 1.0, hue 0.860581, saturation 0.9762812, and chroma 0.12265874.
    static final com.badlogic.gdx.utils.FloatArray
    @@ -761,82 +761,82 @@

    Field Summary

    static final float
    -
    This color constant "Lizard Scales" has RGBA8888 code 73733BFF, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.30616736, saturation 0.32533228, and chroma 0.079095535.
    +
    This color constant "Lizard Scales" has RGBA8888 code 73733BFF, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.29637668, saturation 0.63274586, and chroma 0.079095535.
    static final float
    -
    This color constant "Lurid Red" has RGBA8888 code DA2010FF, L 0.4509804, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.08299518, saturation 0.7767863, and chroma 0.21173172.
    +
    This color constant "Lurid Red" has RGBA8888 code DA2010FF, L 0.44705883, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.084052734, saturation 0.89628667, and chroma 0.21173172.
    static final float
    -
    This color constant "Magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9091779, saturation 0.9090322, and chroma 0.31098264.
    +
    This color constant "Magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9119308, saturation 0.96295136, and chroma 0.31098264.
    static final float
    -
    This color constant "Maidenhair Fern" has RGBA8888 code 3B7349FF, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.42320445, saturation 0.3791533, and chroma 0.09260367.
    +
    This color constant "Maidenhair Fern" has RGBA8888 code 3B7349FF, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.41398114, saturation 0.5424141, and chroma 0.09260367.
    static final float
    -
    This color constant "Malachite" has RGBA8888 code 0AD70AFF, L 0.6862745, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.40182015, saturation 0.99775034, and chroma 0.26337513.
    +
    This color constant "Malachite" has RGBA8888 code 0AD70AFF, L 0.6901961, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.39851815, saturation 0.98825276, and chroma 0.26337513.
    static final float
    -
    This color constant "Marsh" has RGBA8888 code 738F57FF, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.375, saturation 0.1515024, and chroma 0.082864076.
    +
    This color constant "Marsh" has RGBA8888 code 738F57FF, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.3644131, saturation 0.45234665, and chroma 0.082864076.
    static final float
    -
    This color constant "Mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.09785124, and chroma 0.1008085.
    +
    This color constant "Mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.3259601, and chroma 0.1008085.
    static final float
    -
    This color constant "Medium Plum" has RGBA8888 code BD10C5FF, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9018202, saturation 0.86487514, and chroma 0.26337513.
    +
    This color constant "Medium Plum" has RGBA8888 code BD10C5FF, L 0.45490196, A 0.60784316, B 0.42352942, alpha 1.0, hue 0.9050996, saturation 0.9399402, and chroma 0.26337513.
    static final float
    -
    This color constant "Medium Teal" has RGBA8888 code 06C491FF, L 0.6509804, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.47172436, saturation 0.9115982, and chroma 0.15477823.
    +
    This color constant "Medium Teal" has RGBA8888 code 06C491FF, L 0.654902, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.46697098, saturation 0.94714576, and chroma 0.15477823.
    static final float
    -
    This color constant "Mild Violet" has RGBA8888 code AB8FC7FF, L 0.62352943, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.84141475, saturation 0.16076855, and chroma 0.079095535.
    +
    This color constant "Mild Violet" has RGBA8888 code AB8FC7FF, L 0.627451, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.8524291, saturation 0.4, and chroma 0.079095535.
    static final float
    -
    This color constant "Mint Green" has RGBA8888 code 4BF05AFF, L 0.7764706, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.40565702, saturation 0.682674, and chroma 0.23076649.
    +
    This color constant "Mint Green" has RGBA8888 code 4BF05AFF, L 0.78431374, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.4019004, saturation 0.7842902, and chroma 0.23076649.
    static final float
    -
    This color constant "Moss Green" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.38294512, saturation 0.6363817, and chroma 0.11062346.
    +
    This color constant "Moss Green" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.94280905, and chroma 0.11062346.
    static final float
    -
    This color constant "Mulberry" has RGBA8888 code 641464FF, L 0.23921569, A 0.5647059, B 0.45490196, alpha 1.0, hue 0.90311134, saturation 0.6878521, and chroma 0.15712644.
    +
    This color constant "Mulberry" has RGBA8888 code 641464FF, L 0.23529412, A 0.5647059, B 0.45490196, alpha 1.0, hue 0.90858525, saturation 0.86163646, and chroma 0.15712644.
    static final float
    -
    This color constant "Mummy Brown" has RGBA8888 code 7F3F00FF, L 0.3254902, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15801254, saturation 0.7598891, and chroma 0.107261956.
    +
    This color constant "Mummy Brown" has RGBA8888 code 7F3F00FF, L 0.32156864, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15640444, saturation 0.93046486, and chroma 0.107261956.
    static final float
    -
    This color constant "Murk" has RGBA8888 code 0F192DFF, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.71857655, saturation 0.28808865, and chroma 0.059754133.
    +
    This color constant "Murk" has RGBA8888 code 0F192DFF, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.72740346, saturation 0.48765984, and chroma 0.059754133.
    static final float
    -
    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.6666667, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.30842525, saturation 0.8074922, and chroma 0.1632233.
    +
    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.6745098, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.3035705, saturation 0.96316457, and chroma 0.1632233.
    static final com.badlogic.gdx.utils.ObjectFloatMap<String>
    @@ -859,547 +859,547 @@

    Field Summary

    static final float
    -
    This color constant "Navy Blue" has RGBA8888 code 162C52FF, L 0.16862746, A 0.49019608, B 0.45882353, alpha 1.0, hue 0.7127991, saturation 0.3497842, and chroma 0.084324345.
    +
    This color constant "Navy Blue" has RGBA8888 code 162C52FF, L 0.16470589, A 0.49019608, B 0.45882353, alpha 1.0, hue 0.71857655, saturation 0.63737744, and chroma 0.084324345.
    static final float
    -
    This color constant "Nightshade" has RGBA8888 code 321623FF, L 0.11764706, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.96857655, saturation 0.25154528, and chroma 0.059754133.
    +
    This color constant "Nightshade" has RGBA8888 code 321623FF, L 0.11372549, A 0.5254902, B 0.49411765, alpha 1.0, hue 0.97740346, saturation 0.5050763, and chroma 0.052115876.
    static final float
    -
    This color constant "Ninja" has RGBA8888 code 1F1F3BFF, L 0.1254902, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.7778107, saturation 0.15748447, and chroma 0.06743233.
    +
    This color constant "Ninja" has RGBA8888 code 1F1F3BFF, L 0.12156863, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.78898686, saturation 0.4022542, and chroma 0.06743233.
    static final float
    -
    This color constant "Ocean Blue" has RGBA8888 code 00007FFF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.7282781, saturation 0.96145123, and chroma 0.20108652.
    +
    This color constant "Ocean Blue" has RGBA8888 code 00007FFF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.73098123, saturation 0.9874258, and chroma 0.20108652.
    static final float
    -
    This color constant "Ochre" has RGBA8888 code 5F3214FF, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15858527, saturation 0.5838377, and chroma 0.079095535.
    +
    This color constant "Ochre" has RGBA8888 code 5F3214FF, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15640444, saturation 0.8320503, and chroma 0.079095535.
    static final float
    -
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, L 0.7058824, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.954483, saturation 0.16594002, and chroma 0.069218926.
    +
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, L 0.70980394, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.96519506, saturation 0.46097723, and chroma 0.069218926.
    static final float
    -
    This color constant "Olive Green" has RGBA8888 code 3B573BFF, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.42138404, saturation 0.19425261, and chroma 0.05767509.
    +
    This color constant "Olive Green" has RGBA8888 code 3B573BFF, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.40640444, saturation 0.3795317, and chroma 0.05767509.
    static final float
    -
    This color constant "Olive Oil" has RGBA8888 code A2A255FF, L 0.62352943, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30935085, saturation 0.3080419, and chroma 0.096477255.
    +
    This color constant "Olive Oil" has RGBA8888 code A2A255FF, L 0.627451, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30119568, saturation 0.6023386, and chroma 0.096477255.
    static final float
    -
    This color constant "Orange" has RGBA8888 code FF7F00FF, L 0.6509804, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.15541562, saturation 0.8137945, and chroma 0.17443058.
    +
    This color constant "Orange" has RGBA8888 code FF7F00FF, L 0.654902, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.1544865, saturation 0.979648, and chroma 0.17443058.
    static final float
    -
    This color constant "Orchid" has RGBA8888 code BD62FFFF, L 0.58431375, A 0.5686275, B 0.4117647, alpha 1.0, hue 0.8552204, saturation 0.9180143, and chroma 0.22269051.
    +
    This color constant "Orchid" has RGBA8888 code BD62FFFF, L 0.5882353, A 0.5686275, B 0.4117647, alpha 1.0, hue 0.8591479, saturation 0.9973804, and chroma 0.22269051.
    static final float
    -
    This color constant "Pastel Sky" has RGBA8888 code ABE3E3FF, L 0.83137256, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.55842525, saturation 0.12433905, and chroma 0.054407768.
    +
    This color constant "Pastel Sky" has RGBA8888 code ABE3E3FF, L 0.8392157, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.3085149, and chroma 0.054407768.
    static final float
    -
    This color constant "Patina" has RGBA8888 code ABC7E3FF, L 0.7647059, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.68210673, saturation 0.22452903, and chroma 0.0471994.
    +
    This color constant "Patina" has RGBA8888 code ABC7E3FF, L 0.77254903, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.689452, saturation 0.4682752, and chroma 0.0471994.
    static final float
    -
    This color constant "Pea Soup" has RGBA8888 code 8EBE55FF, L 0.6784314, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.36230367, saturation 0.3804915, and chroma 0.13854803.
    +
    This color constant "Pea Soup" has RGBA8888 code 8EBE55FF, L 0.68235296, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.35600415, saturation 0.6594257, and chroma 0.13854803.
    static final float
    -
    This color constant "Peach" has RGBA8888 code FFBF81FF, L 0.79607844, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.19064914, saturation 0.6557377, and chroma 0.096477255.
    +
    This color constant "Peach" has RGBA8888 code FFBF81FF, L 0.8039216, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.1871773, saturation 0.962963, and chroma 0.096477255.
    static final float
    -
    This color constant "Peat Bog" has RGBA8888 code 465032FF, L 0.29803923, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.35914788, saturation 0.16971225, and chroma 0.055518243.
    +
    This color constant "Peat Bog" has RGBA8888 code 465032FF, L 0.29411766, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.34359556, saturation 0.4973174, and chroma 0.055518243.
    static final float
    -
    This color constant "Pencil Yellow" has RGBA8888 code FFEA4AFF, L 0.88235295, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.29171178, saturation 0.62957466, and chroma 0.1658202.
    +
    This color constant "Pencil Yellow" has RGBA8888 code FFEA4AFF, L 0.89411765, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.28720093, saturation 0.9385666, and chroma 0.1658202.
    static final float
    -
    This color constant "Periwinkle" has RGBA8888 code 8181FFFF, L 0.5803922, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.77569586, saturation 0.8777893, and chroma 0.17017984.
    +
    This color constant "Periwinkle" has RGBA8888 code 8181FFFF, L 0.58431375, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.779965, saturation 0.95011365, and chroma 0.17017984.
    static final float
    -
    This color constant "Pine Green" has RGBA8888 code 235037FF, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.44383267, saturation 0.5838377, and chroma 0.079095535.
    +
    This color constant "Pine Green" has RGBA8888 code 235037FF, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.43344522, saturation 0.6792316, and chroma 0.079095535.
    static final float
    -
    This color constant "Pink Lemonade" has RGBA8888 code FF6AC5FF, L 0.654902, A 0.5921569, B 0.47058824, alpha 1.0, hue 0.95084393, saturation 0.7901956, and chroma 0.19271713.
    +
    This color constant "Pink Lemonade" has RGBA8888 code FF6AC5FF, L 0.65882355, A 0.5921569, B 0.47058824, alpha 1.0, hue 0.954842, saturation 0.9433962, and chroma 0.19271713.
    static final float
    -
    This color constant "Pink Skin 1" has RGBA8888 code AB7373FF, L 0.5254902, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.05653231, and chroma 0.061763234.
    +
    This color constant "Pink Skin 1" has RGBA8888 code AB7373FF, L 0.5294118, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.2670001, and chroma 0.061763234.
    static final float
    -
    This color constant "Pink Skin 2" has RGBA8888 code C78F8FFF, L 0.6313726, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.1156203, and chroma 0.061763234.
    +
    This color constant "Pink Skin 2" has RGBA8888 code C78F8FFF, L 0.63529414, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.3883638, and chroma 0.061763234.
    static final float
    -
    This color constant "Pink Skin 3" has RGBA8888 code E3ABABFF, L 0.73333335, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.03609712, saturation 0.17939028, and chroma 0.052115876.
    +
    This color constant "Pink Skin 3" has RGBA8888 code E3ABABFF, L 0.7411765, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.044284336, saturation 0.52000785, and chroma 0.052115876.
    static final float
    -
    This color constant "Pink Skin 4" has RGBA8888 code F8D2DAFF, L 0.85490197, A 0.5176471, B 0.49803922, alpha 1.0, hue 0.9823789, saturation 0.30119374, and chroma 0.0353726.
    +
    This color constant "Pink Skin 4" has RGBA8888 code F8D2DAFF, L 0.8627451, A 0.5176471, B 0.49803922, alpha 1.0, hue 1.2950972E-5, saturation 0.71428573, and chroma 0.0353726.
    static final float
    -
    This color constant "Pink Tutu" has RGBA8888 code F8C6FCFF, L 0.8392157, A 0.5294118, B 0.4745098, alpha 1.0, hue 0.88634074, saturation 0.6563932, and chroma 0.07753685.
    +
    This color constant "Pink Tutu" has RGBA8888 code F8C6FCFF, L 0.8509804, A 0.5294118, B 0.4745098, alpha 1.0, hue 0.8975709, saturation 0.90909094, and chroma 0.07753685.
    static final float
    -
    This color constant "Pink Violet" has RGBA8888 code 8F578FFF, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.13027532, and chroma 0.1008085.
    +
    This color constant "Pink Violet" has RGBA8888 code 8F578FFF, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.37792477, and chroma 0.1008085.
    static final float
    -
    This color constant "Pistachio" has RGBA8888 code A2D8A2FF, L 0.7764706, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.41646945, saturation 0.11585842, and chroma 0.08575976.
    +
    This color constant "Pistachio" has RGBA8888 code A2D8A2FF, L 0.78431374, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.40640444, saturation 0.30904725, and chroma 0.08575976.
    static final float
    -
    This color constant "Platinum" has RGBA8888 code DBDBDBFF, L 0.84705883, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.005259698, and chroma 0.0055242716.
    +
    This color constant "Platinum" has RGBA8888 code DBDBDBFF, L 0.85490197, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Plum Juice" has RGBA8888 code A01982FF, L 0.36862746, A 0.59607846, B 0.45882353, alpha 1.0, hue 0.9355687, saturation 0.8027682, and chroma 0.2082438.
    +
    This color constant "Plum Juice" has RGBA8888 code A01982FF, L 0.3647059, A 0.5921569, B 0.45882353, alpha 1.0, hue 0.9371773, saturation 0.88135594, and chroma 0.20108652.
    static final float
    -
    This color constant "Polished Sapphire" has RGBA8888 code 101CDAFF, L 0.2784314, A 0.4862745, B 0.3647059, alpha 1.0, hue 0.73390174, saturation 0.80083245, and chroma 0.2709147.
    +
    This color constant "Polished Sapphire" has RGBA8888 code 101CDAFF, L 0.27450982, A 0.4862745, B 0.3647059, alpha 1.0, hue 0.73599005, saturation 0.898213, and chroma 0.2709147.
    static final float
    -
    This color constant "Pork Chop" has RGBA8888 code FFC0CBFF, L 0.81960785, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.010589795, saturation 0.53777516, and chroma 0.058723815.
    +
    This color constant "Pork Chop" has RGBA8888 code FFC0CBFF, L 0.827451, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.019803474, saturation 0.89580643, and chroma 0.058723815.
    static final float
    -
    This color constant "Powder Blue" has RGBA8888 code 5AC5FFFF, L 0.72156864, A 0.4627451, B 0.4509804, alpha 1.0, hue 0.6465574, saturation 0.8283974, and chroma 0.12265874.
    +
    This color constant "Powder Blue" has RGBA8888 code 5AC5FFFF, L 0.7254902, A 0.4627451, B 0.4509804, alpha 1.0, hue 0.6475709, saturation 0.90909094, and chroma 0.12265874.
    static final float
    -
    This color constant "Prase" has RGBA8888 code 05B450FF, L 0.5882353, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4218265, saturation 0.9324576, and chroma 0.19048727.
    +
    This color constant "Prase" has RGBA8888 code 05B450FF, L 0.5921569, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4173693, saturation 0.9127084, and chroma 0.19048727.
    static final float
    -
    This color constant "Prune" has RGBA8888 code 463246FF, L 0.22352941, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.057617728, and chroma 0.044538103.
    +
    This color constant "Prune" has RGBA8888 code 463246FF, L 0.21960784, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.2591534, and chroma 0.044538103.
    static final float
    -
    This color constant "Prussian Blue" has RGBA8888 code 004A9CFF, L 0.3019608, A 0.47843137, B 0.42352942, alpha 1.0, hue 0.70625466, saturation 0.86775005, and chroma 0.1582875.
    +
    This color constant "Prussian Blue" has RGBA8888 code 004A9CFF, L 0.3019608, A 0.47843137, B 0.42352942, alpha 1.0, hue 0.7090507, saturation 0.98234415, and chroma 0.1582875.
    static final float
    -
    This color constant "Puce" has RGBA8888 code BCAFC0FF, L 0.70980394, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.83601886, saturation 0.025520736, and chroma 0.022777155.
    +
    This color constant "Puce" has RGBA8888 code BCAFC0FF, L 0.7176471, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.875, saturation 0.13797206, and chroma 0.022777155.
    static final float
    -
    This color constant "Purple" has RGBA8888 code DA20E0FF, L 0.5294118, A 0.6156863, B 0.41960785, alpha 1.0, hue 0.90333164, saturation 0.81673986, and chroma 0.28065258.
    +
    This color constant "Purple" has RGBA8888 code DA20E0FF, L 0.5294118, A 0.6156863, B 0.41960785, alpha 1.0, hue 0.90640444, saturation 0.91279775, and chroma 0.28065258.
    static final float
    -
    This color constant "Purple Freesia" has RGBA8888 code 9C41FFFF, L 0.49411765, A 0.5686275, B 0.3882353, alpha 1.0, hue 0.83765215, saturation 0.9001559, and chroma 0.2612811.
    +
    This color constant "Purple Freesia" has RGBA8888 code 9C41FFFF, L 0.49411765, A 0.5647059, B 0.39215687, alpha 1.0, hue 0.83944297, saturation 0.95242125, and chroma 0.25054872.
    static final float
    -
    This color constant "Putty" has RGBA8888 code BF3F3FFF, L 0.44313726, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.06128862, saturation 0.408064, and chroma 0.15595676.
    +
    This color constant "Putty" has RGBA8888 code BF3F3FFF, L 0.4392157, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.063416936, saturation 0.6871843, and chroma 0.15595676.
    static final float
    -
    This color constant "Raspberry" has RGBA8888 code 911437FF, L 0.3019608, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.02692472, saturation 0.73546606, and chroma 0.16247371.
    +
    This color constant "Raspberry" has RGBA8888 code 911437FF, L 0.29803923, A 0.5803922, B 0.5137255, alpha 1.0, hue 0.029965011, saturation 0.9096833, and chroma 0.16247371.
    static final float
    -
    This color constant "Raw Meat" has RGBA8888 code FF8181FF, L 0.6745098, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.05119568, saturation 0.77551675, and chroma 0.13587911.
    +
    This color constant "Raw Meat" has RGBA8888 code FF8181FF, L 0.6784314, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.053987134, saturation 0.9744733, and chroma 0.13587911.
    static final float
    -
    This color constant "Red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.07928106, saturation 0.8972241, and chroma 0.25345513.
    +
    This color constant "Red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.08024464, saturation 0.98868626, and chroma 0.25345513.
    static final float
    -
    This color constant "Redwood" has RGBA8888 code B45A00FF, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15767807, saturation 0.7703894, and chroma 0.13542919.
    +
    This color constant "Redwood" has RGBA8888 code B45A00FF, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15640444, saturation 0.9245003, and chroma 0.13542919.
    static final float
    -
    This color constant "Refreshing Mist" has RGBA8888 code 91EBFFFF, L 0.84313726, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59551346, saturation 0.88296545, and chroma 0.08992863.
    +
    This color constant "Refreshing Mist" has RGBA8888 code 91EBFFFF, L 0.8509804, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59359556, saturation 0.94057864, and chroma 0.08992863.
    static final float
    -
    This color constant "Ripe Plum" has RGBA8888 code AB57ABFF, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.9052252, saturation 0.23956598, and chroma 0.14626285.
    +
    This color constant "Ripe Plum" has RGBA8888 code AB57ABFF, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.911086, saturation 0.5099449, and chroma 0.14626285.
    static final float
    -
    This color constant "Ripped Denim" has RGBA8888 code 699DC3FF, L 0.59607846, A 0.47843137, B 0.46666667, alpha 1.0, hue 0.65858525, saturation 0.21667327, and chroma 0.079095535.
    +
    This color constant "Ripped Denim" has RGBA8888 code 699DC3FF, L 0.6, A 0.47843137, B 0.46666667, alpha 1.0, hue 0.6610861, saturation 0.4492372, and chroma 0.079095535.
    static final float
    -
    This color constant "Robin Egg Blue" has RGBA8888 code 08DED5FF, L 0.7490196, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5297675, saturation 0.90882874, and chroma 0.14709508.
    +
    This color constant "Robin Egg Blue" has RGBA8888 code 08DED5FF, L 0.7529412, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5262961, saturation 0.96043617, and chroma 0.14709508.
    static final float
    -
    This color constant "Rose" has RGBA8888 code E61E78FF, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99192464, saturation 0.7659808, and chroma 0.23076649.
    +
    This color constant "Rose" has RGBA8888 code E61E78FF, L 0.49411765, A 0.6156863, B 0.49411765, alpha 1.0, hue 0.99470973, saturation 0.90959585, and chroma 0.23076649.
    static final float
    -
    This color constant "Roseate Spoonbill" has RGBA8888 code C87DA0FF, L 0.6, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.96592754, saturation 0.13739227, and chroma 0.091942206.
    +
    This color constant "Roseate Spoonbill" has RGBA8888 code C87DA0FF, L 0.6039216, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.9737039, saturation 0.40551752, and chroma 0.091942206.
    static final float
    -
    This color constant "Rough Sapphire" has RGBA8888 code 4A5AFFFF, L 0.45490196, A 0.5019608, B 0.38431373, alpha 1.0, hue 0.75268954, saturation 0.891392, and chroma 0.23050185.
    +
    This color constant "Rough Sapphire" has RGBA8888 code 4A5AFFFF, L 0.45490196, A 0.5019608, B 0.38431373, alpha 1.0, hue 0.75547296, saturation 0.9672412, and chroma 0.23050185.
    static final float
    -
    This color constant "Royal Blue" has RGBA8888 code 0010BDFF, L 0.22745098, A 0.4862745, B 0.37254903, alpha 1.0, hue 0.7329173, saturation 0.8848403, and chroma 0.25537437.
    +
    This color constant "Royal Blue" has RGBA8888 code 0010BDFF, L 0.22745098, A 0.4862745, B 0.37254903, alpha 1.0, hue 0.7351178, saturation 0.94530344, and chroma 0.25537437.
    static final float
    -
    This color constant "Royal Violet" has RGBA8888 code 573B73FF, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.84872866, saturation 0.18195479, and chroma 0.1008085.
    +
    This color constant "Royal Violet" has RGBA8888 code 573B73FF, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.8573997, saturation 0.43411013, and chroma 0.1008085.
    static final float
    -
    This color constant "Saffron" has RGBA8888 code FFD510FF, L 0.83137256, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27457327, saturation 0.8132536, and chroma 0.17789528.
    +
    This color constant "Saffron" has RGBA8888 code FFD510FF, L 0.84313726, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27065513, saturation 0.9467276, and chroma 0.17789528.
    static final float
    -
    This color constant "Sage Green" has RGBA8888 code B4EECAFF, L 0.85490197, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.19143423, and chroma 0.069218926.
    +
    This color constant "Sage Green" has RGBA8888 code B4EECAFF, L 0.8666667, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.47466686, and chroma 0.069218926.
    static final float
    -
    This color constant "Salmon" has RGBA8888 code FF6262FF, L 0.6117647, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06254671, saturation 0.8039996, and chroma 0.17337766.
    +
    This color constant "Salmon" has RGBA8888 code FF6262FF, L 0.6156863, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06443131, saturation 0.9722263, and chroma 0.17337766.
    static final float
    -
    This color constant "Scribe Ink" has RGBA8888 code 280A1EFF, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9378436, saturation 0.51980007, and chroma 0.071815535.
    +
    This color constant "Scribe Ink" has RGBA8888 code 280A1EFF, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9488043, saturation 0.79056937, and chroma 0.071815535.
    static final float
    -
    This color constant "Seafoam" has RGBA8888 code 3CFEA5FF, L 0.827451, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.44880432, saturation 0.81632656, and chroma 0.18528971.
    +
    This color constant "Seafoam" has RGBA8888 code 3CFEA5FF, L 0.8352941, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.4445043, saturation 0.9753916, and chroma 0.18528971.
    static final float
    -
    This color constant "Seal Brown" has RGBA8888 code 551414FF, L 0.17254902, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.07099588, saturation 0.4878964, and chroma 0.09959023.
    +
    This color constant "Seal Brown" has RGBA8888 code 551414FF, L 0.16862746, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.073790275, saturation 0.7892004, and chroma 0.09959023.
    static final float
    -
    This color constant "Seawater" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.543443, saturation 0.89123964, and chroma 0.10141215.
    +
    This color constant "Seawater" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.53898686, saturation 0.95148593, and chroma 0.10141215.
    static final float
    -
    This color constant "Shadow" has RGBA8888 code 252525FF, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.007346189, and chroma 0.0055242716.
    +
    This color constant "Shadow" has RGBA8888 code 252525FF, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Sharp Azure" has RGBA8888 code 007FFFFF, L 0.5137255, A 0.47058824, B 0.4, alpha 1.0, hue 0.704483, saturation 0.9514351, and chroma 0.20765679.
    +
    This color constant "Sharp Azure" has RGBA8888 code 007FFFFF, L 0.5176471, A 0.47058824, B 0.4, alpha 1.0, hue 0.706557, saturation 0.9796796, and chroma 0.20765679.
    static final float
    -
    This color constant "Shining Sky" has RGBA8888 code 55E6FFFF, L 0.8, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5843938, saturation 0.8966475, and chroma 0.13131043.
    +
    This color constant "Shining Sky" has RGBA8888 code 55E6FFFF, L 0.80784315, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5826307, saturation 0.97724336, and chroma 0.13131043.
    static final float
    -
    This color constant "Shrimp" has RGBA8888 code FAA0B9FF, L 0.7411765, A 0.54901963, B 0.49803922, alpha 1.0, hue 0.99364984, saturation 0.59266275, and chroma 0.09773435.
    +
    This color constant "Shrimp" has RGBA8888 code FAA0B9FF, L 0.7490196, A 0.54901963, B 0.49803922, alpha 1.0, hue 1.2950972E-5, saturation 0.8965517, and chroma 0.09773435.
    static final float
    -
    This color constant "Sienna" has RGBA8888 code 7F0000FF, L 0.24705882, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.07915777, saturation 0.8381556, and chroma 0.1555649.
    +
    This color constant "Sienna" has RGBA8888 code 7F0000FF, L 0.24313726, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.080711745, saturation 0.9805362, and chroma 0.1555649.
    static final float
    -
    This color constant "Silver" has RGBA8888 code B6B6B6FF, L 0.7176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0013493, and chroma 0.0055242716.
    +
    This color constant "Silver" has RGBA8888 code B6B6B6FF, L 0.72156864, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Silver Green" has RGBA8888 code 8FC78FFF, L 0.7137255, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.41176948, saturation 0.15616, and chroma 0.096477255.
    +
    This color constant "Silver Green" has RGBA8888 code 8FC78FFF, L 0.72156864, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.40278715, saturation 0.3538132, and chroma 0.096477255.
    static final float
    -
    This color constant "Silver Pink" has RGBA8888 code E3C7E3FF, L 0.8117647, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.12307692, and chroma 0.044538103.
    +
    This color constant "Silver Pink" has RGBA8888 code E3C7E3FF, L 0.8235294, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.4021346, and chroma 0.044538103.
    static final float
    -
    This color constant "Slate Gray" has RGBA8888 code 6E8287FF, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59872866, saturation 0.07457798, and chroma 0.033602834.
    +
    This color constant "Slate Gray" has RGBA8888 code 6E8287FF, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59359556, saturation 0.24037008, and chroma 0.033602834.
    static final float
    -
    This color constant "Slow Creek" has RGBA8888 code 7E9494FF, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5644313, saturation 0.05491124, and chroma 0.029749114.
    +
    This color constant "Slow Creek" has RGBA8888 code 7E9494FF, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5511957, saturation 0.20401792, and chroma 0.029749114.
    static final float
    -
    This color constant "Smog" has RGBA8888 code ABABE3FF, L 0.69803923, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.35029587, and chroma 0.07513822.
    +
    This color constant "Smog" has RGBA8888 code ABABE3FF, L 0.7058824, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.6146363, and chroma 0.07513822.
    static final float
    -
    This color constant "Soap" has RGBA8888 code D7C3FAFF, L 0.8, A 0.5176471, B 0.46666667, alpha 1.0, hue 0.8274942, saturation 0.6699864, and chroma 0.07513822.
    +
    This color constant "Soap" has RGBA8888 code D7C3FAFF, L 0.8117647, A 0.5176471, B 0.46666667, alpha 1.0, hue 0.8389139, saturation 0.8984744, and chroma 0.07513822.
    static final float
    -
    This color constant "Soft Teal" has RGBA8888 code 129880FF, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.49488065, saturation 0.9107692, and chroma 0.12115674.
    +
    This color constant "Soft Teal" has RGBA8888 code 129880FF, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.4894102, saturation 0.93958104, and chroma 0.12115674.
    static final float
    -
    This color constant "Space Blue" has RGBA8888 code 0C2148FF, L 0.1254902, A 0.49019608, B 0.45490196, alpha 1.0, hue 0.7159276, saturation 0.49365115, and chroma 0.091942206.
    +
    This color constant "Space Blue" has RGBA8888 code 0C2148FF, L 0.1254902, A 0.49019608, B 0.45490196, alpha 1.0, hue 0.72136545, saturation 0.7710579, and chroma 0.091942206.
    static final float
    -
    This color constant "Spearmint" has RGBA8888 code 64ABABFF, L 0.61960787, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.5409493, saturation 0.32430163, and chroma 0.07674564.
    +
    This color constant "Spearmint" has RGBA8888 code 64ABABFF, L 0.62352943, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.53480494, saturation 0.5587603, and chroma 0.07674564.
    static final float
    -
    This color constant "Spring Green" has RGBA8888 code 00DE6AFF, L 0.7176471, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42491466, saturation 0.94792074, and chroma 0.21487926.
    +
    This color constant "Spring Green" has RGBA8888 code 00DE6AFF, L 0.72156864, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42098877, saturation 0.9252436, and chroma 0.21487926.
    static final float
    -
    This color constant "Steam" has RGBA8888 code 7DD7F0FF, L 0.7764706, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6063733, saturation 0.5221653, and chroma 0.0945603.
    +
    This color constant "Steam" has RGBA8888 code 7DD7F0FF, L 0.78431374, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6052204, saturation 0.71260965, and chroma 0.0945603.
    static final float
    -
    This color constant "Straw" has RGBA8888 code EDEDC7FF, L 0.8980392, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.33071172, saturation 0.029941387, and chroma 0.040217306.
    +
    This color constant "Straw" has RGBA8888 code EDEDC7FF, L 0.90588236, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.310548, saturation 0.1923273, and chroma 0.040217306.
    static final float
    -
    This color constant "Strong Cyan" has RGBA8888 code 00BFFFFF, L 0.68235296, A 0.44705883, B 0.44313726, alpha 1.0, hue 0.63067734, saturation 0.9115982, and chroma 0.15477823.
    +
    This color constant "Strong Cyan" has RGBA8888 code 00BFFFFF, L 0.6862745, A 0.44705883, B 0.44313726, alpha 1.0, hue 0.6308874, saturation 0.95524865, and chroma 0.15477823.
    static final float
    -
    This color constant "Stygian Blue" has RGBA8888 code 0F0F50FF, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.7454664, saturation 0.71185946, and chroma 0.13677454.
    +
    This color constant "Stygian Blue" has RGBA8888 code 0F0F50FF, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.75, saturation 0.85, and chroma 0.13677454.
    static final float
    -
    This color constant "Subtlety" has RGBA8888 code 786EF0FF, L 0.52156866, A 0.5176471, B 0.4117647, alpha 1.0, hue 0.78142345, saturation 0.68371075, and chroma 0.1792624.
    +
    This color constant "Subtlety" has RGBA8888 code 786EF0FF, L 0.52156866, A 0.5176471, B 0.4117647, alpha 1.0, hue 0.7855691, saturation 0.85135955, and chroma 0.1792624.
    static final float
    -
    This color constant "Suds" has RGBA8888 code BEB9FAFF, L 0.75686276, A 0.50980395, B 0.45882353, alpha 1.0, hue 0.7872009, saturation 0.71664745, and chroma 0.084324345.
    +
    This color constant "Suds" has RGBA8888 code BEB9FAFF, L 0.7647059, A 0.50980395, B 0.45882353, alpha 1.0, hue 0.7963767, saturation 0.8700256, and chroma 0.084324345.
    static final float
    -
    This color constant "Tan" has RGBA8888 code DADAABFF, L 0.83137256, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.30842525, saturation 0.06777885, and chroma 0.054407768.
    +
    This color constant "Tan" has RGBA8888 code DADAABFF, L 0.8392157, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.29428434, saturation 0.2854945, and chroma 0.054407768.
    static final float
    -
    This color constant "Tarnish" has RGBA8888 code ABC78FFF, L 0.7372549, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3636593, saturation 0.100864, and chroma 0.07753685.
    +
    This color constant "Tarnish" has RGBA8888 code ABC78FFF, L 0.74509805, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3524291, saturation 0.35714287, and chroma 0.07753685.
    static final float
    -
    This color constant "Taupe" has RGBA8888 code 3B2D1FFF, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.18556869, saturation 0.12547323, and chroma 0.029749114.
    +
    This color constant "Taupe" has RGBA8888 code 3B2D1FFF, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.17620972, saturation 0.4259177, and chroma 0.029749114.
    static final float
    -
    This color constant "Taxicab Yellow" has RGBA8888 code F6BD31FF, L 0.77254903, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24593177, saturation 0.6745706, and chroma 0.15239382.
    +
    This color constant "Taxicab Yellow" has RGBA8888 code F6BD31FF, L 0.78039217, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24205942, saturation 0.8706515, and chroma 0.15239382.
    static final float
    -
    This color constant "Tea Rose" has RGBA8888 code E1B9D2FF, L 0.7764706, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.93210673, saturation 0.11585003, and chroma 0.0471994.
    +
    This color constant "Tea Rose" has RGBA8888 code E1B9D2FF, L 0.78431374, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.9488043, saturation 0.42163703, and chroma 0.0471994.
    static final float
    -
    This color constant "Thick Amethyst" has RGBA8888 code 5010B0FF, L 0.27058825, A 0.5411765, B 0.39215687, alpha 1.0, hue 0.8080369, saturation 0.887296, and chroma 0.22997166.
    +
    This color constant "Thick Amethyst" has RGBA8888 code 5010B0FF, L 0.26666668, A 0.5411765, B 0.39607844, alpha 1.0, hue 0.81369054, saturation 0.9256127, and chroma 0.22269051.
    static final float
    -
    This color constant "Thin Amethyst" has RGBA8888 code 7F00FFFF, L 0.40784314, A 0.5647059, B 0.3647059, alpha 1.0, hue 0.8209959, saturation 0.97398543, and chroma 0.29877067.
    +
    This color constant "Thin Amethyst" has RGBA8888 code 7F00FFFF, L 0.40392157, A 0.5647059, B 0.36862746, alpha 1.0, hue 0.82570946, saturation 0.97687954, and chroma 0.29174224.
    static final float
    -
    This color constant "Thistle" has RGBA8888 code E673FFFF, L 0.6666667, A 0.5803922, B 0.43137255, alpha 1.0, hue 0.8875299, saturation 0.8491489, and chroma 0.2105755.
    +
    This color constant "Thistle" has RGBA8888 code E673FFFF, L 0.67058825, A 0.5764706, B 0.43137255, alpha 1.0, hue 0.88786715, saturation 0.97217816, and chroma 0.20469645.
    static final float
    -
    This color constant "Thulian Pink" has RGBA8888 code C35A91FF, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.95994633, saturation 0.24846612, and chroma 0.1411665.
    +
    This color constant "Thulian Pink" has RGBA8888 code C35A91FF, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.96519506, saturation 0.51941097, and chroma 0.1411665.
    static final float
    -
    This color constant "Transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +
    This color constant "Transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Tropic Mist" has RGBA8888 code D0DAF8FF, L 0.84705883, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.735567, saturation 0.5078044, and chroma 0.04314594.
    +
    This color constant "Tropic Mist" has RGBA8888 code D0DAF8FF, L 0.85490197, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.75, saturation 0.7692308, and chroma 0.04314594.
    static final float
    -
    This color constant "Turquoise" has RGBA8888 code 2DEBA8FF, L 0.77254903, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.46014452, saturation 0.83749604, and chroma 0.17337766.
    +
    This color constant "Turquoise" has RGBA8888 code 2DEBA8FF, L 0.78039217, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.45571566, saturation 0.89144206, and chroma 0.17337766.
    static final float
    -
    This color constant "Twilight Cloud" has RGBA8888 code 8F8FC7FF, L 0.59607846, A 0.5058824, B 0.45882353, alpha 1.0, hue 0.77259654, saturation 0.22724403, and chroma 0.082864076.
    +
    This color constant "Twilight Cloud" has RGBA8888 code 8F8FC7FF, L 0.6, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.42881602, and chroma 0.07513822.
    static final float
    -
    This color constant "Tyrian Purple" has RGBA8888 code BF3FBFFF, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9039804, saturation 0.51023114, and chroma 0.21345432.
    +
    This color constant "Tyrian Purple" has RGBA8888 code BF3FBFFF, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9080125, saturation 0.73224163, and chroma 0.21345432.
    static final float
    -
    This color constant "Umber" has RGBA8888 code 7F7F00FF, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.31318712, saturation 0.76235455, and chroma 0.13131043.
    +
    This color constant "Umber" has RGBA8888 code 7F7F00FF, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.30708748, saturation 0.9493337, and chroma 0.13131043.
    static final float
    -
    This color constant "Vapor" has RGBA8888 code 90B0FFFF, L 0.7019608, A 0.49411765, B 0.44313726, alpha 1.0, hue 0.7335864, saturation 0.9137329, and chroma 0.11388578.
    +
    This color constant "Vapor" has RGBA8888 code 90B0FFFF, L 0.7058824, A 0.49411765, B 0.44313726, alpha 1.0, hue 0.73865414, saturation 0.9679771, and chroma 0.11388578.
    static final float
    -
    This color constant "Variscite" has RGBA8888 code 6AFFCDFF, L 0.85490197, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47740343, saturation 0.80115366, and chroma 0.1381068.
    +
    This color constant "Variscite" has RGBA8888 code 6AFFCDFF, L 0.8666667, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47218934, saturation 1.0154516, and chroma 0.1381068.
    static final float
    -
    This color constant "Varnish" has RGBA8888 code 401811FF, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.3516231, and chroma 0.068331465.
    +
    This color constant "Varnish" has RGBA8888 code 401811FF, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.62893206, and chroma 0.068331465.
    static final float
    -
    This color constant "Violet" has RGBA8888 code 8C14BEFF, L 0.37254903, A 0.58431375, B 0.40784314, alpha 1.0, hue 0.8679365, saturation 0.8906447, and chroma 0.24883763.
    +
    This color constant "Violet" has RGBA8888 code 8C14BEFF, L 0.36862746, A 0.5803922, B 0.40784314, alpha 1.0, hue 0.86777616, saturation 0.9296962, and chroma 0.24363229.
    static final float
    -
    This color constant "Violet Cushions" has RGBA8888 code 8F57C7FF, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8425412, saturation 0.3077058, and chroma 0.16359681.
    +
    This color constant "Violet Cushions" has RGBA8888 code 8F57C7FF, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8478395, saturation 0.56239605, and chroma 0.16359681.
    static final float
    -
    This color constant "Viridian" has RGBA8888 code 507D5FFF, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.4378436, saturation 0.24035555, and chroma 0.071815535.
    +
    This color constant "Viridian" has RGBA8888 code 507D5FFF, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.42620972, saturation 0.4472136, and chroma 0.071815535.
    static final float
    -
    This color constant "Watercolor Black" has RGBA8888 code 3B3B57FF, L 0.24313726, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.7860971, saturation 0.047061935, and chroma 0.052115876.
    +
    This color constant "Watercolor Black" has RGBA8888 code 3B3B57FF, L 0.23921569, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.8011957, saturation 0.21808812, and chroma 0.052115876.
    static final float
    -
    This color constant "Watercolor Gray" has RGBA8888 code 736EAAFF, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.7840724, saturation 0.14647366, and chroma 0.091942206.
    +
    This color constant "Watercolor Gray" has RGBA8888 code 736EAAFF, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.79236877, saturation 0.37382802, and chroma 0.091942206.
    static final float
    -
    This color constant "Wet Stone" has RGBA8888 code A6A090FF, L 0.63529414, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.28142345, saturation 0.014394464, and chroma 0.019918045.
    +
    This color constant "Wet Stone" has RGBA8888 code A6A090FF, L 0.6392157, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.25, saturation 0.15, and chroma 0.019918045.
    static final float
    -
    This color constant "White" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716.
    +
    This color constant "White" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716.
    static final float
    -
    This color constant "Wisteria" has RGBA8888 code BD29FFFF, L 0.5137255, A 0.59607846, B 0.39215687, alpha 1.0, hue 0.865835, saturation 0.9033923, and chroma 0.28773978.
    +
    This color constant "Wisteria" has RGBA8888 code BD29FFFF, L 0.5137255, A 0.59607846, B 0.39215687, alpha 1.0, hue 0.86888635, saturation 0.98124635, and chroma 0.28773978.
    static final float
    -
    This color constant "Woodlands" has RGBA8888 code 3C6E14FF, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.375, saturation 0.63123345, and chroma 0.1381068.
    +
    This color constant "Woodlands" has RGBA8888 code 3C6E14FF, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.3686421, saturation 0.90727216, and chroma 0.1381068.
    static final float
    -
    This color constant "Yellow" has RGBA8888 code FFFF00FF, L 0.92941177, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.30886024, saturation 0.92988807, and chroma 0.20529193.
    +
    This color constant "Yellow" has RGBA8888 code FFFF00FF, L 0.9411765, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.3049839, saturation 1.3285329, and chroma 0.20529193.
    static final float
    -
    This color constant "Zucchini" has RGBA8888 code 123832FF, L 0.18431373, A 0.47058824, B 0.49803922, alpha 1.0, hue 0.5105898, saturation 0.7379592, and chroma 0.058723815.
    +
    This color constant "Zucchini" has RGBA8888 code 123832FF, L 0.18039216, A 0.4745098, B 0.49803922, alpha 1.0, hue 0.49998704, saturation 0.7058824, and chroma 0.050931267.
    @@ -1472,8 +1472,8 @@

    LIST

  • TRANSPARENT

    -
    public static final float TRANSPARENT
    -
    This color constant "Transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.625, saturation 0.0, and chroma 0.0055242716. +
    public static final float TRANSPARENT
    +
    This color constant "Transparent" has RGBA8888 code 00000000, L 0.0, A 0.49803922, B 0.49803922, alpha 0.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant 0x0.fefep-126F.
                   @ 
    @@ -1493,8 +1493,8 @@ 

    TRANSPARENT

  • BLACK

    -
    public static final float BLACK
    -
    This color constant "Black" has RGBA8888 code 000000FF, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716. +
    public static final float BLACK
    +
    This color constant "Black" has RGBA8888 code 000000FF, L 0.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant -0x1.fefep125F.
                   @ 
    @@ -1514,8 +1514,8 @@ 

    BLACK

  • COAL_BLACK

    -
    public static final float COAL_BLACK
    -
    This color constant "Coal Black" has RGBA8888 code 131313FF, L 0.05882353, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.015122874, and chroma 0.0055242716. +
    public static final float COAL_BLACK
    +
    This color constant "Coal Black" has RGBA8888 code 131313FF, L 0.05882353, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant -0x1.fefe1ep125F.
                   @ 
    @@ -1535,8 +1535,8 @@ 

    COAL_BLACK

  • SHADOW

    -
    public static final float SHADOW
    -
    This color constant "Shadow" has RGBA8888 code 252525FF, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.007346189, and chroma 0.0055242716. +
    public static final float SHADOW
    +
    This color constant "Shadow" has RGBA8888 code 252525FF, L 0.13333334, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant -0x1.fefe44p125F.
                   @ 
    @@ -1556,9 +1556,9 @@ 

    SHADOW

  • GRAPHITE

    -
    public static final float GRAPHITE
    -
    This color constant "Graphite" has RGBA8888 code 373737FF, L 0.21176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.004326663, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.fefe6cp125F. +
    public static final float GRAPHITE
    +
    This color constant "Graphite" has RGBA8888 code 373737FF, L 0.20784314, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.fefe6ap125F.
                   @ 
          @  @  @  @ 
    @@ -1577,9 +1577,9 @@ 

    GRAPHITE

  • DARK_GRAY

    -
    public static final float DARK_GRAY
    -
    This color constant "Dark Gray" has RGBA8888 code 494949FF, L 0.2901961, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.003331945, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.fefe94p125F. +
    public static final float DARK_GRAY
    +
    This color constant "Dark Gray" has RGBA8888 code 494949FF, L 0.28627452, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.fefe92p125F.
                   @ 
          @  @  @  @ 
    @@ -1598,9 +1598,9 @@ 

    DARK_GRAY

  • LEAD

    -
    public static final float LEAD
    -
    This color constant "Lead" has RGBA8888 code 5B5B5BFF, L 0.3647059, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.fefebap125F. +
    public static final float LEAD
    +
    This color constant "Lead" has RGBA8888 code 5B5B5BFF, L 0.36078432, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.fefeb8p125F.
                   @ 
          @  @  @  @ 
    @@ -1619,8 +1619,8 @@ 

    LEAD

  • IRON

    -
    public static final float IRON
    -
    This color constant "Iron" has RGBA8888 code 6E6E6EFF, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0020156212, and chroma 0.0055242716. +
    public static final float IRON
    +
    This color constant "Iron" has RGBA8888 code 6E6E6EFF, L 0.44313726, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant -0x1.fefee2p125F.
                   @ 
    @@ -1640,8 +1640,8 @@ 

    IRON

  • GRAY

    -
    public static final float GRAY
    -
    This color constant "Gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0016803193, and chroma 0.0055242716. +
    public static final float GRAY
    +
    This color constant "Gray" has RGBA8888 code 808080FF, L 0.5137255, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant -0x1.feff06p125F.
                   @ 
    @@ -1661,8 +1661,8 @@ 

    GRAY

  • CHINCHILLA

    -
    public static final float CHINCHILLA
    -
    This color constant "Chinchilla" has RGBA8888 code 929292FF, L 0.58431375, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0014222222, and chroma 0.0055242716. +
    public static final float CHINCHILLA
    +
    This color constant "Chinchilla" has RGBA8888 code 929292FF, L 0.58431375, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant -0x1.feff2ap125F.
                   @ 
    @@ -1682,9 +1682,9 @@ 

    CHINCHILLA

  • GREYHOUND

    -
    public static final float GREYHOUND
    -
    This color constant "Greyhound" has RGBA8888 code A4A4A4FF, L 0.6509804, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0012193263, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.feff4cp125F. +
    public static final float GREYHOUND
    +
    This color constant "Greyhound" has RGBA8888 code A4A4A4FF, L 0.654902, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.feff4ep125F.
                   @ 
          @  @  @  @ 
    @@ -1703,9 +1703,9 @@ 

    GREYHOUND

  • SILVER

    -
    public static final float SILVER
    -
    This color constant "Silver" has RGBA8888 code B6B6B6FF, L 0.7176471, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0013493, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.feff6ep125F. +
    public static final float SILVER
    +
    This color constant "Silver" has RGBA8888 code B6B6B6FF, L 0.72156864, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.feff7p125F.
                   @ 
          @  @  @  @ 
    @@ -1724,9 +1724,9 @@ 

    SILVER

  • LIGHT_GRAY

    -
    public static final float LIGHT_GRAY
    -
    This color constant "Light Gray" has RGBA8888 code C9C9C9FF, L 0.78431374, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.002462296, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.feff9p125F. +
    public static final float LIGHT_GRAY
    +
    This color constant "Light Gray" has RGBA8888 code C9C9C9FF, L 0.7921569, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.feff94p125F.
                   @ 
          @  @  @  @ 
    @@ -1745,9 +1745,9 @@ 

    LIGHT_GRAY

  • PLATINUM

    -
    public static final float PLATINUM
    -
    This color constant "Platinum" has RGBA8888 code DBDBDBFF, L 0.84705883, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.005259698, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.feffbp125F. +
    public static final float PLATINUM
    +
    This color constant "Platinum" has RGBA8888 code DBDBDBFF, L 0.85490197, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.feffb4p125F.
                   @ 
          @  @  @  @ 
    @@ -1766,9 +1766,9 @@ 

    PLATINUM

  • CLOUD

    -
    public static final float CLOUD
    -
    This color constant "Cloud" has RGBA8888 code EDEDEDFF, L 0.90588236, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.015122874, and chroma 0.0055242716. - It can be represented as a packed float with the constant -0x1.feffcep125F. +
    public static final float CLOUD
    +
    This color constant "Cloud" has RGBA8888 code EDEDEDFF, L 0.91764706, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. + It can be represented as a packed float with the constant -0x1.feffd4p125F.
                   @ 
          @  @  @  @ 
    @@ -1787,8 +1787,8 @@ 

    CLOUD

  • WHITE

    -
    public static final float WHITE
    -
    This color constant "White" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.625, saturation 0.0, and chroma 0.0055242716. +
    public static final float WHITE
    +
    This color constant "White" has RGBA8888 code FFFFFFFF, L 1.0, A 0.49803922, B 0.49803922, alpha 1.0, hue 0.0, saturation 0.0, and chroma 0.0055242716. It can be represented as a packed float with the constant -0x1.fefffep125F.
                   @ 
    @@ -1808,8 +1808,8 @@ 

    WHITE

  • SEAWATER

    -
    public static final float SEAWATER
    -
    This color constant "Seawater" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.543443, saturation 0.89123964, and chroma 0.10141215. +
    public static final float SEAWATER
    +
    This color constant "Seawater" has RGBA8888 code 007F7FFF, L 0.4392157, A 0.4509804, B 0.4862745, alpha 1.0, hue 0.53898686, saturation 0.95148593, and chroma 0.10141215. It can be represented as a packed float with the constant -0x1.f8e6ep125F.
                   @ 
    @@ -1829,9 +1829,9 @@ 

    SEAWATER

  • HOSPITAL_GREEN

    -
    public static final float HOSPITAL_GREEN
    -
    This color constant "Hospital Green" has RGBA8888 code 3FBFBFFF, L 0.6666667, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54788184, saturation 0.7316009, and chroma 0.11861114. - It can be represented as a packed float with the constant -0x1.f6e354p125F. +
    public static final float HOSPITAL_GREEN
    +
    This color constant "Hospital Green" has RGBA8888 code 3FBFBFFF, L 0.67058825, A 0.44313726, B 0.48235294, alpha 1.0, hue 0.54428434, saturation 0.83201253, and chroma 0.11861114. + It can be represented as a packed float with the constant -0x1.f6e356p125F.
                   @ 
          @  @  @  @ 
    @@ -1850,9 +1850,9 @@ 

    HOSPITAL_GREEN

  • CYAN

    -
    public static final float CYAN
    -
    This color constant "Cyan" has RGBA8888 code 00FFFFFF, L 0.8509804, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.54374534, saturation 0.95340395, and chroma 0.1582875. - It can be represented as a packed float with the constant -0x1.f4d9b2p125F. +
    public static final float CYAN
    +
    This color constant "Cyan" has RGBA8888 code 00FFFFFF, L 0.85882354, A 0.42352942, B 0.47843137, alpha 1.0, hue 0.5409493, saturation 1.0340465, and chroma 0.1582875. + It can be represented as a packed float with the constant -0x1.f4d9b6p125F.
                   @ 
          @  @  @  @ 
    @@ -1871,9 +1871,9 @@ 

    CYAN

  • BUBBLE

    -
    public static final float BUBBLE
    -
    This color constant "Bubble" has RGBA8888 code BFFFFFFF, L 0.91764706, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.81632656, and chroma 0.061763234. - It can be represented as a packed float with the constant -0x1.faf1d4p125F. +
    public static final float BUBBLE
    +
    This color constant "Bubble" has RGBA8888 code BFFFFFFF, L 0.92941177, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.54428434, saturation 1.0400157, and chroma 0.061763234. + It can be represented as a packed float with the constant -0x1.faf1dap125F.
                   @ 
          @  @  @  @ 
    @@ -1892,9 +1892,9 @@ 

    BUBBLE

  • PERIWINKLE

    -
    public static final float PERIWINKLE
    -
    This color constant "Periwinkle" has RGBA8888 code 8181FFFF, L 0.5803922, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.77569586, saturation 0.8777893, and chroma 0.17017984. - It can be represented as a packed float with the constant -0x1.d50728p125F. +
    public static final float PERIWINKLE
    +
    This color constant "Periwinkle" has RGBA8888 code 8181FFFF, L 0.58431375, A 0.5137255, B 0.41568628, alpha 1.0, hue 0.779965, saturation 0.95011365, and chroma 0.17017984. + It can be represented as a packed float with the constant -0x1.d5072ap125F.
                   @ 
          @  @  @  @ 
    @@ -1913,8 +1913,8 @@ 

    PERIWINKLE

  • BLUE

    -
    public static final float BLUE
    -
    This color constant "Blue" has RGBA8888 code 0000FFFF, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.7323789, saturation 0.97586775, and chroma 0.31835338. +
    public static final float BLUE
    +
    This color constant "Blue" has RGBA8888 code 0000FFFF, L 0.30588236, A 0.48235294, B 0.34117648, alpha 1.0, hue 0.73413044, saturation 0.9925803, and chroma 0.31835338. It can be represented as a packed float with the constant -0x1.aef69cp125F.
                   @ 
    @@ -1934,9 +1934,9 @@ 

    BLUE

  • FADED_BLUE

    -
    public static final float FADED_BLUE
    -
    This color constant "Faded Blue" has RGBA8888 code 3F3FBFFF, L 0.33333334, A 0.50980395, B 0.4, alpha 1.0, hue 0.7655599, saturation 0.41548988, and chroma 0.20017387. - It can be represented as a packed float with the constant -0x1.cd04aap125F. +
    public static final float FADED_BLUE
    +
    This color constant "Faded Blue" has RGBA8888 code 3F3FBFFF, L 0.33333334, A 0.50980395, B 0.40392157, alpha 1.0, hue 0.76980346, saturation 0.6282279, and chroma 0.19240016. + It can be represented as a packed float with the constant -0x1.cf04aap125F.
                   @ 
          @  @  @  @ 
    @@ -1955,8 +1955,8 @@ 

    FADED_BLUE

  • OCEAN_BLUE

    -
    public static final float OCEAN_BLUE
    -
    This color constant "Ocean Blue" has RGBA8888 code 00007FFF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.7282781, saturation 0.96145123, and chroma 0.20108652. +
    public static final float OCEAN_BLUE
    +
    This color constant "Ocean Blue" has RGBA8888 code 00007FFF, L 0.14117648, A 0.4862745, B 0.4, alpha 1.0, hue 0.73098123, saturation 0.9874258, and chroma 0.20108652. It can be represented as a packed float with the constant -0x1.ccf848p125F.
                   @ 
    @@ -1976,8 +1976,8 @@ 

    OCEAN_BLUE

  • STYGIAN_BLUE

    -
    public static final float STYGIAN_BLUE
    -
    This color constant "Stygian Blue" has RGBA8888 code 0F0F50FF, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.7454664, saturation 0.71185946, and chroma 0.13677454. +
    public static final float STYGIAN_BLUE
    +
    This color constant "Stygian Blue" has RGBA8888 code 0F0F50FF, L 0.09803922, A 0.49803922, B 0.43137255, alpha 1.0, hue 0.75, saturation 0.85, and chroma 0.13677454. It can be represented as a packed float with the constant -0x1.dcfe32p125F.
                   @ 
    @@ -1997,8 +1997,8 @@ 

    STYGIAN_BLUE

  • DEEP_PURPLE

    -
    public static final float DEEP_PURPLE
    -
    This color constant "Deep Purple" has RGBA8888 code 7F007FFF, L 0.29411766, A 0.58431375, B 0.44313726, alpha 1.0, hue 0.9055531, saturation 0.87330574, and chroma 0.20259848. +
    public static final float DEEP_PURPLE
    +
    This color constant "Deep Purple" has RGBA8888 code 7F007FFF, L 0.29411766, A 0.58431375, B 0.44313726, alpha 1.0, hue 0.90979147, saturation 0.96580774, and chroma 0.20259848. It can be represented as a packed float with the constant -0x1.e32a96p125F.
                   @ 
    @@ -2018,8 +2018,8 @@ 

    DEEP_PURPLE

  • TYRIAN_PURPLE

    -
    public static final float TYRIAN_PURPLE
    -
    This color constant "Tyrian Purple" has RGBA8888 code BF3FBFFF, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9039804, saturation 0.51023114, and chroma 0.21345432. +
    public static final float TYRIAN_PURPLE
    +
    This color constant "Tyrian Purple" has RGBA8888 code BF3FBFFF, L 0.49411765, A 0.5882353, B 0.4392157, alpha 1.0, hue 0.9080125, saturation 0.73224163, and chroma 0.21345432. It can be represented as a packed float with the constant -0x1.e12cfcp125F.
                   @ 
    @@ -2039,8 +2039,8 @@ 

    TYRIAN_PURPLE

  • MAGENTA

    -
    public static final float MAGENTA
    -
    This color constant "Magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9091779, saturation 0.9090322, and chroma 0.31098264. +
    public static final float MAGENTA
    +
    This color constant "Magenta" has RGBA8888 code F500F5FF, L 0.5764706, A 0.6313726, B 0.41568628, alpha 1.0, hue 0.9119308, saturation 0.96295136, and chroma 0.31098264. It can be represented as a packed float with the constant -0x1.d54326p125F.
                   @ 
    @@ -2060,9 +2060,9 @@ 

    MAGENTA

  • BUBBLEGUM_PINK

    -
    public static final float BUBBLEGUM_PINK
    -
    This color constant "Bubblegum Pink" has RGBA8888 code FD81FFFF, L 0.7176471, A 0.5803922, B 0.44313726, alpha 1.0, hue 0.9020082, saturation 0.881125, and chroma 0.19616999. - It can be represented as a packed float with the constant -0x1.e3296ep125F. +
    public static final float BUBBLEGUM_PINK
    +
    This color constant "Bubblegum Pink" has RGBA8888 code FD81FFFF, L 0.72156864, A 0.5803922, B 0.44313726, alpha 1.0, hue 0.90640444, saturation 0.97072536, and chroma 0.19616999. + It can be represented as a packed float with the constant -0x1.e3297p125F.
                   @ 
          @  @  @  @ 
    @@ -2081,9 +2081,9 @@ 

    BUBBLEGUM_PINK

  • PORK_CHOP

    -
    public static final float PORK_CHOP
    -
    This color constant "Pork Chop" has RGBA8888 code FFC0CBFF, L 0.81960785, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.010589795, saturation 0.53777516, and chroma 0.058723815. - It can be represented as a packed float with the constant -0x1.010fa2p126F. +
    public static final float PORK_CHOP
    +
    This color constant "Pork Chop" has RGBA8888 code FFC0CBFF, L 0.827451, A 0.5294118, B 0.5019608, alpha 1.0, hue 0.019803474, saturation 0.89580643, and chroma 0.058723815. + It can be represented as a packed float with the constant -0x1.010fa6p126F.
                   @ 
          @  @  @  @ 
    @@ -2102,9 +2102,9 @@ 

    PORK_CHOP

  • RAW_MEAT

    -
    public static final float RAW_MEAT
    -
    This color constant "Raw Meat" has RGBA8888 code FF8181FF, L 0.6745098, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.05119568, saturation 0.77551675, and chroma 0.13587911. - It can be represented as a packed float with the constant -0x1.0b2158p126F. +
    public static final float RAW_MEAT
    +
    This color constant "Raw Meat" has RGBA8888 code FF8181FF, L 0.6784314, A 0.5647059, B 0.52156866, alpha 1.0, hue 0.053987134, saturation 0.9744733, and chroma 0.13587911. + It can be represented as a packed float with the constant -0x1.0b215ap126F.
                   @ 
          @  @  @  @ 
    @@ -2123,8 +2123,8 @@ 

    RAW_MEAT

  • RED

    -
    public static final float RED
    -
    This color constant "Red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.07928106, saturation 0.8972241, and chroma 0.25345513. +
    public static final float RED
    +
    This color constant "Red" has RGBA8888 code FF0000FF, L 0.50980395, A 0.6117647, B 0.56078434, alpha 1.0, hue 0.08024464, saturation 0.98868626, and chroma 0.25345513. It can be represented as a packed float with the constant -0x1.1f3904p126F.
                   @ 
    @@ -2144,9 +2144,9 @@ 

    RED

  • PUTTY

    -
    public static final float PUTTY
    -
    This color constant "Putty" has RGBA8888 code BF3F3FFF, L 0.44313726, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.06128862, saturation 0.408064, and chroma 0.15595676. - It can be represented as a packed float with the constant -0x1.0f24e2p126F. +
    public static final float PUTTY
    +
    This color constant "Putty" has RGBA8888 code BF3F3FFF, L 0.4392157, A 0.57254905, B 0.5294118, alpha 1.0, hue 0.063416936, saturation 0.6871843, and chroma 0.15595676. + It can be represented as a packed float with the constant -0x1.0f24ep126F.
                   @ 
          @  @  @  @ 
    @@ -2165,9 +2165,9 @@ 

    PUTTY

  • SIENNA

    -
    public static final float SIENNA
    -
    This color constant "Sienna" has RGBA8888 code 7F0000FF, L 0.24705882, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.07915777, saturation 0.8381556, and chroma 0.1555649. - It can be represented as a packed float with the constant -0x1.13227ep126F. +
    public static final float SIENNA
    +
    This color constant "Sienna" has RGBA8888 code 7F0000FF, L 0.24313726, A 0.5686275, B 0.5372549, alpha 1.0, hue 0.080711745, saturation 0.9805362, and chroma 0.1555649. + It can be represented as a packed float with the constant -0x1.13227cp126F.
                   @ 
          @  @  @  @ 
    @@ -2186,9 +2186,9 @@ 

    SIENNA

  • SEAL_BROWN

    -
    public static final float SEAL_BROWN
    -
    This color constant "Seal Brown" has RGBA8888 code 551414FF, L 0.17254902, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.07099588, saturation 0.4878964, and chroma 0.09959023. - It can be represented as a packed float with the constant -0x1.0b1658p126F. +
    public static final float SEAL_BROWN
    +
    This color constant "Seal Brown" has RGBA8888 code 551414FF, L 0.16862746, A 0.54509807, B 0.52156866, alpha 1.0, hue 0.073790275, saturation 0.7892004, and chroma 0.09959023. + It can be represented as a packed float with the constant -0x1.0b1656p126F.
                   @ 
          @  @  @  @ 
    @@ -2207,9 +2207,9 @@ 

    SEAL_BROWN

  • MUMMY_BROWN

    -
    public static final float MUMMY_BROWN
    -
    This color constant "Mummy Brown" has RGBA8888 code 7F3F00FF, L 0.3254902, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15801254, saturation 0.7598891, and chroma 0.107261956. - It can be represented as a packed float with the constant -0x1.170ea6p126F. +
    public static final float MUMMY_BROWN
    +
    This color constant "Mummy Brown" has RGBA8888 code 7F3F00FF, L 0.32156864, A 0.5294118, B 0.54509807, alpha 1.0, hue 0.15640444, saturation 0.93046486, and chroma 0.107261956. + It can be represented as a packed float with the constant -0x1.170ea4p126F.
                   @ 
          @  @  @  @ 
    @@ -2228,8 +2228,8 @@ 

    MUMMY_BROWN

  • FAWN

    -
    public static final float FAWN
    -
    This color constant "Fawn" has RGBA8888 code BF7F3FFF, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18403731, saturation 0.4331543, and chroma 0.106691405. +
    public static final float FAWN
    +
    This color constant "Fawn" has RGBA8888 code BF7F3FFF, L 0.5686275, A 0.52156866, B 0.54901963, alpha 1.0, hue 0.18118605, saturation 0.6984303, and chroma 0.106691405. It can be represented as a packed float with the constant -0x1.190b22p126F.
                   @ 
    @@ -2249,9 +2249,9 @@ 

    FAWN

  • ORANGE

    -
    public static final float ORANGE
    -
    This color constant "Orange" has RGBA8888 code FF7F00FF, L 0.6509804, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.15541562, saturation 0.8137945, and chroma 0.17443058. - It can be represented as a packed float with the constant -0x1.25194cp126F. +
    public static final float ORANGE
    +
    This color constant "Orange" has RGBA8888 code FF7F00FF, L 0.654902, A 0.54901963, B 0.57254905, alpha 1.0, hue 0.1544865, saturation 0.979648, and chroma 0.17443058. + It can be represented as a packed float with the constant -0x1.25194ep126F.
                   @ 
          @  @  @  @ 
    @@ -2270,9 +2270,9 @@ 

    ORANGE

  • PEACH

    -
    public static final float PEACH
    -
    This color constant "Peach" has RGBA8888 code FFBF81FF, L 0.79607844, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.19064914, saturation 0.6557377, and chroma 0.096477255. - It can be represented as a packed float with the constant -0x1.170996p126F. +
    public static final float PEACH
    +
    This color constant "Peach" has RGBA8888 code FFBF81FF, L 0.8039216, A 0.5176471, B 0.54509807, alpha 1.0, hue 0.1871773, saturation 0.962963, and chroma 0.096477255. + It can be represented as a packed float with the constant -0x1.17099ap126F.
                   @ 
          @  @  @  @ 
    @@ -2291,9 +2291,9 @@ 

    PEACH

  • CREAM

    -
    public static final float CREAM
    -
    This color constant "Cream" has RGBA8888 code FFFFBFFF, L 0.9647059, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.31215638, saturation 0.8888889, and chroma 0.071815535. - It can be represented as a packed float with the constant -0x1.10f9ecp126F. +
    public static final float CREAM
    +
    This color constant "Cream" has RGBA8888 code FFFFBFFF, L 0.972549, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.30119568, saturation 1.1858541, and chroma 0.071815535. + It can be represented as a packed float with the constant -0x1.10f9fp126F.
                   @ 
          @  @  @  @ 
    @@ -2312,9 +2312,9 @@ 

    CREAM

  • YELLOW

    -
    public static final float YELLOW
    -
    This color constant "Yellow" has RGBA8888 code FFFF00FF, L 0.92941177, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.30886024, saturation 0.92988807, and chroma 0.20529193. - It can be represented as a packed float with the constant -0x1.30eddap126F. +
    public static final float YELLOW
    +
    This color constant "Yellow" has RGBA8888 code FFFF00FF, L 0.9411765, A 0.4627451, B 0.59607846, alpha 1.0, hue 0.3049839, saturation 1.3285329, and chroma 0.20529193. + It can be represented as a packed float with the constant -0x1.30edep126F.
                   @ 
          @  @  @  @ 
    @@ -2333,9 +2333,9 @@ 

    YELLOW

  • EARWAX

    -
    public static final float EARWAX
    -
    This color constant "Earwax" has RGBA8888 code BFBF3FFF, L 0.72156864, A 0.4745098, B 0.5686275, alpha 1.0, hue 0.30658844, saturation 0.59262407, and chroma 0.14584495. - It can be represented as a packed float with the constant -0x1.22f37p126F. +
    public static final float EARWAX
    +
    This color constant "Earwax" has RGBA8888 code BFBF3FFF, L 0.7254902, A 0.4745098, B 0.5686275, alpha 1.0, hue 0.30119568, saturation 0.824942, and chroma 0.14584495. + It can be represented as a packed float with the constant -0x1.22f372p126F.
                   @ 
          @  @  @  @ 
    @@ -2354,8 +2354,8 @@ 

    EARWAX

  • UMBER

    -
    public static final float UMBER
    -
    This color constant "Umber" has RGBA8888 code 7F7F00FF, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.31318712, saturation 0.76235455, and chroma 0.13131043. +
    public static final float UMBER
    +
    This color constant "Umber" has RGBA8888 code 7F7F00FF, L 0.4862745, A 0.4745098, B 0.56078434, alpha 1.0, hue 0.30708748, saturation 0.9493337, and chroma 0.13131043. It can be represented as a packed float with the constant -0x1.1ef2f8p126F.
                   @ 
    @@ -2375,8 +2375,8 @@ 

    UMBER

  • IVY_GREEN

    -
    public static final float IVY_GREEN
    -
    This color constant "Ivy Green" has RGBA8888 code 007F00FF, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.4036119, saturation 1.0868253, and chroma 0.18528971. +
    public static final float IVY_GREEN
    +
    This color constant "Ivy Green" has RGBA8888 code 007F00FF, L 0.4117647, A 0.42352942, B 0.5529412, alpha 1.0, hue 0.3989195, saturation 0.98336864, and chroma 0.18528971. It can be represented as a packed float with the constant -0x1.1ad8d2p126F.
                   @ 
    @@ -2396,9 +2396,9 @@ 

    IVY_GREEN

  • JADE

    -
    public static final float JADE
    -
    This color constant "Jade" has RGBA8888 code 3FBF3FFF, L 0.6313726, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4055531, saturation 0.71121687, and chroma 0.20259848. - It can be represented as a packed float with the constant -0x1.1cd542p126F. +
    public static final float JADE
    +
    This color constant "Jade" has RGBA8888 code 3FBF3FFF, L 0.63529414, A 0.41568628, B 0.5568628, alpha 1.0, hue 0.4012713, saturation 0.806468, and chroma 0.20259848. + It can be represented as a packed float with the constant -0x1.1cd544p126F.
                   @ 
          @  @  @  @ 
    @@ -2417,9 +2417,9 @@ 

    JADE

  • GREEN

    -
    public static final float GREEN
    -
    This color constant "Green" has RGBA8888 code 00FF00FF, L 0.8, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39883053, saturation 0.9818446, and chroma 0.29610303. - It can be represented as a packed float with the constant -0x1.2cc398p126F. +
    public static final float GREEN
    +
    This color constant "Green" has RGBA8888 code 00FF00FF, L 0.80784315, A 0.38039216, B 0.5882353, alpha 1.0, hue 0.39588714, saturation 1.0080564, and chroma 0.29610303. + It can be represented as a packed float with the constant -0x1.2cc39cp126F.
                   @ 
          @  @  @  @ 
    @@ -2438,9 +2438,9 @@ 

    GREEN

  • CELADON

    -
    public static final float CELADON
    -
    This color constant "Celadon" has RGBA8888 code AFFFAFFF, L 0.8862745, A 0.44705883, B 0.53333336, alpha 1.0, hue 0.41055703, saturation 0.96378696, and chroma 0.12463325. - It can be represented as a packed float with the constant -0x1.10e5c4p126F. +
    public static final float CELADON
    +
    This color constant "Celadon" has RGBA8888 code AFFFAFFF, L 0.89411765, A 0.44705883, B 0.53333336, alpha 1.0, hue 0.4036119, saturation 1.0540925, and chroma 0.12463325. + It can be represented as a packed float with the constant -0x1.10e5c8p126F.
                   @ 
          @  @  @  @ 
    @@ -2459,9 +2459,9 @@ 

    CELADON

  • PUCE

    -
    public static final float PUCE
    -
    This color constant "Puce" has RGBA8888 code BCAFC0FF, L 0.70980394, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.83601886, saturation 0.025520736, and chroma 0.022777155. - It can be represented as a packed float with the constant -0x1.fb036ap125F. +
    public static final float PUCE
    +
    This color constant "Puce" has RGBA8888 code BCAFC0FF, L 0.7176471, A 0.5058824, B 0.49019608, alpha 1.0, hue 0.875, saturation 0.13797206, and chroma 0.022777155. + It can be represented as a packed float with the constant -0x1.fb036ep125F.
                   @ 
          @  @  @  @ 
    @@ -2480,9 +2480,9 @@ 

    PUCE

  • BEIGE

    -
    public static final float BEIGE
    -
    This color constant "Beige" has RGBA8888 code CBAA89FF, L 0.69803923, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.19157475, saturation 0.08972135, and chroma 0.054407768. - It can be represented as a packed float with the constant -0x1.0d0564p126F. +
    public static final float BEIGE
    +
    This color constant "Beige" has RGBA8888 code CBAA89FF, L 0.7019608, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.18556869, saturation 0.3384788, and chroma 0.054407768. + It can be represented as a packed float with the constant -0x1.0d0566p126F.
                   @ 
          @  @  @  @ 
    @@ -2501,9 +2501,9 @@ 

    BEIGE

  • WET_STONE

    -
    public static final float WET_STONE
    -
    This color constant "Wet Stone" has RGBA8888 code A6A090FF, L 0.63529414, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.28142345, saturation 0.014394464, and chroma 0.019918045. - It can be represented as a packed float with the constant -0x1.04ff44p126F. +
    public static final float WET_STONE
    +
    This color constant "Wet Stone" has RGBA8888 code A6A090FF, L 0.6392157, A 0.49803922, B 0.50980395, alpha 1.0, hue 0.25, saturation 0.15, and chroma 0.019918045. + It can be represented as a packed float with the constant -0x1.04ff46p126F.
                   @ 
          @  @  @  @ 
    @@ -2522,8 +2522,8 @@ 

    WET_STONE

  • SLOW_CREEK

    -
    public static final float SLOW_CREEK
    -
    This color constant "Slow Creek" has RGBA8888 code 7E9494FF, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5644313, saturation 0.05491124, and chroma 0.029749114. +
    public static final float SLOW_CREEK
    +
    This color constant "Slow Creek" has RGBA8888 code 7E9494FF, L 0.57254905, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5511957, saturation 0.20401792, and chroma 0.029749114. It can be represented as a packed float with the constant -0x1.fcf924p125F.
                   @ 
    @@ -2543,8 +2543,8 @@ 

    SLOW_CREEK

  • SLATE_GRAY

    -
    public static final float SLATE_GRAY
    -
    This color constant "Slate Gray" has RGBA8888 code 6E8287FF, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59872866, saturation 0.07457798, and chroma 0.033602834. +
    public static final float SLATE_GRAY
    +
    This color constant "Slate Gray" has RGBA8888 code 6E8287FF, L 0.5058824, A 0.4862745, B 0.49019608, alpha 1.0, hue 0.59359556, saturation 0.24037008, and chroma 0.033602834. It can be represented as a packed float with the constant -0x1.faf902p125F.
                   @ 
    @@ -2564,8 +2564,8 @@ 

    SLATE_GRAY

  • LIGHT_SKIN_1

    -
    public static final float LIGHT_SKIN_1
    -
    This color constant "Light Skin 1" has RGBA8888 code 7E6E60FF, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.0229381, and chroma 0.022777155. +
    public static final float LIGHT_SKIN_1
    +
    This color constant "Light Skin 1" has RGBA8888 code 7E6E60FF, L 0.45490196, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.18976586, and chroma 0.022777155. It can be represented as a packed float with the constant -0x1.0502e8p126F.
                   @ 
    @@ -2585,8 +2585,8 @@ 

    LIGHT_SKIN_1

  • LIGHT_SKIN_2

    -
    public static final float LIGHT_SKIN_2
    -
    This color constant "Light Skin 2" has RGBA8888 code A0695FFF, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.078336, and chroma 0.068331465. +
    public static final float LIGHT_SKIN_2
    +
    This color constant "Light Skin 2" has RGBA8888 code A0695FFF, L 0.48235294, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.2948119, and chroma 0.068331465. It can be represented as a packed float with the constant -0x1.090ef6p126F.
                   @ 
    @@ -2606,9 +2606,9 @@ 

    LIGHT_SKIN_2

  • LIGHT_SKIN_3

    -
    public static final float LIGHT_SKIN_3
    -
    This color constant "Light Skin 3" has RGBA8888 code C07872FF, L 0.5647059, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.070401505, saturation 0.1291548, and chroma 0.0821242. - It can be represented as a packed float with the constant -0x1.09132p126F. +
    public static final float LIGHT_SKIN_3
    +
    This color constant "Light Skin 3" has RGBA8888 code C07872FF, L 0.5686275, A 0.5372549, B 0.5176471, alpha 1.0, hue 0.073790275, saturation 0.39929786, and chroma 0.0821242. + It can be represented as a packed float with the constant -0x1.091322p126F.
                   @ 
          @  @  @  @ 
    @@ -2627,9 +2627,9 @@ 

    LIGHT_SKIN_3

  • LIGHT_SKIN_4

    -
    public static final float LIGHT_SKIN_4
    -
    This color constant "Light Skin 4" has RGBA8888 code D08A74FF, L 0.62352943, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.10391619, saturation 0.1947072, and chroma 0.0835974. - It can be represented as a packed float with the constant -0x1.0d113ep126F. +
    public static final float LIGHT_SKIN_4
    +
    This color constant "Light Skin 4" has RGBA8888 code D08A74FF, L 0.627451, A 0.53333336, B 0.5254902, alpha 1.0, hue 0.105220385, saturation 0.49572846, and chroma 0.0835974. + It can be represented as a packed float with the constant -0x1.0d114p126F.
                   @ 
          @  @  @  @ 
    @@ -2648,9 +2648,9 @@ 

    LIGHT_SKIN_4

  • LIGHT_SKIN_5

    -
    public static final float LIGHT_SKIN_5
    -
    This color constant "Light Skin 5" has RGBA8888 code E19B7DFF, L 0.6862745, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.2743484, and chroma 0.082864076. - It can be represented as a packed float with the constant -0x1.0f0f5ep126F. +
    public static final float LIGHT_SKIN_5
    +
    This color constant "Light Skin 5" has RGBA8888 code E19B7DFF, L 0.6901961, A 0.5294118, B 0.5294118, alpha 1.0, hue 0.125, saturation 0.5954583, and chroma 0.082864076. + It can be represented as a packed float with the constant -0x1.0f0f6p126F.
                   @ 
          @  @  @  @ 
    @@ -2669,9 +2669,9 @@ 

    LIGHT_SKIN_5

  • LIGHT_SKIN_6

    -
    public static final float LIGHT_SKIN_6
    -
    This color constant "Light Skin 6" has RGBA8888 code EBAA8CFF, L 0.73333335, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.30118066, and chroma 0.071815535. - It can be represented as a packed float with the constant -0x1.0d0d76p126F. +
    public static final float LIGHT_SKIN_6
    +
    This color constant "Light Skin 6" has RGBA8888 code EBAA8CFF, L 0.7372549, A 0.5254902, B 0.5254902, alpha 1.0, hue 0.125, saturation 0.6386771, and chroma 0.071815535. + It can be represented as a packed float with the constant -0x1.0d0d78p126F.
                   @ 
          @  @  @  @ 
    @@ -2690,9 +2690,9 @@ 

    LIGHT_SKIN_6

  • LIGHT_SKIN_7

    -
    public static final float LIGHT_SKIN_7
    -
    This color constant "Light Skin 7" has RGBA8888 code F5B99BFF, L 0.78039217, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.138223, saturation 0.38347107, and chroma 0.06652104. - It can be represented as a packed float with the constant -0x1.0d0b8ep126F. +
    public static final float LIGHT_SKIN_7
    +
    This color constant "Light Skin 7" has RGBA8888 code F5B99BFF, L 0.7882353, A 0.52156866, B 0.5254902, alpha 1.0, hue 0.13720988, saturation 0.76829535, and chroma 0.06652104. + It can be represented as a packed float with the constant -0x1.0d0b92p126F.
                   @ 
          @  @  @  @ 
    @@ -2711,9 +2711,9 @@ 

    LIGHT_SKIN_7

  • LIGHT_SKIN_8

    -
    public static final float LIGHT_SKIN_8
    -
    This color constant "Light Skin 8" has RGBA8888 code F6C8AFFF, L 0.81960785, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.14085212, saturation 0.43699297, and chroma 0.055518243. - It can be represented as a packed float with the constant -0x1.0b09a2p126F. +
    public static final float LIGHT_SKIN_8
    +
    This color constant "Light Skin 8" has RGBA8888 code F6C8AFFF, L 0.827451, A 0.5176471, B 0.52156866, alpha 1.0, hue 0.13941902, saturation 0.8221316, and chroma 0.055518243. + It can be represented as a packed float with the constant -0x1.0b09a6p126F.
                   @ 
          @  @  @  @ 
    @@ -2732,9 +2732,9 @@ 

    LIGHT_SKIN_8

  • LIGHT_SKIN_9

    -
    public static final float LIGHT_SKIN_9
    -
    This color constant "Light Skin 9" has RGBA8888 code F5E1D2FF, L 0.8784314, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.16398115, saturation 0.16171224, and chroma 0.022777155. - It can be represented as a packed float with the constant -0x1.0503cp126F. +
    public static final float LIGHT_SKIN_9
    +
    This color constant "Light Skin 9" has RGBA8888 code F5E1D2FF, L 0.8901961, A 0.5058824, B 0.50980395, alpha 1.0, hue 0.15640444, saturation 0.6555548, and chroma 0.022777155. + It can be represented as a packed float with the constant -0x1.0503c6p126F.
                   @ 
          @  @  @  @ 
    @@ -2753,8 +2753,8 @@ 

    LIGHT_SKIN_9

  • DARK_SKIN_1

    -
    public static final float DARK_SKIN_1
    -
    This color constant "Dark Skin 1" has RGBA8888 code 573B3BFF, L 0.2627451, A 0.5176471, B 0.5058824, alpha 1.0, hue 0.05119568, saturation 0.04347301, and chroma 0.03705794. +
    public static final float DARK_SKIN_1
    +
    This color constant "Dark Skin 1" has RGBA8888 code 573B3BFF, L 0.2627451, A 0.5176471, B 0.5058824, alpha 1.0, hue 0.060548004, saturation 0.24478021, and chroma 0.03705794. It can be represented as a packed float with the constant -0x1.030886p126F.
                   @ 
    @@ -2774,8 +2774,8 @@ 

    DARK_SKIN_1

  • DARK_SKIN_2

    -
    public static final float DARK_SKIN_2
    -
    This color constant "Dark Skin 2" has RGBA8888 code 73413CFF, L 0.31764707, A 0.5294118, B 0.5137255, alpha 1.0, hue 0.06948605, saturation 0.103308514, and chroma 0.064659946. +
    public static final float DARK_SKIN_2
    +
    This color constant "Dark Skin 2" has RGBA8888 code 73413CFF, L 0.31764707, A 0.5294118, B 0.5137255, alpha 1.0, hue 0.073790275, saturation 0.36507234, and chroma 0.064659946. It can be represented as a packed float with the constant -0x1.070ea2p126F.
                   @ 
    @@ -2795,8 +2795,8 @@ 

    DARK_SKIN_2

  • DARK_SKIN_3

    -
    public static final float DARK_SKIN_3
    -
    This color constant "Dark Skin 3" has RGBA8888 code 8E5555FF, L 0.4117647, A 0.53333336, B 0.50980395, alpha 1.0, hue 0.045517046, saturation 0.0917525, and chroma 0.069218926. +
    public static final float DARK_SKIN_3
    +
    This color constant "Dark Skin 3" has RGBA8888 code 8E5555FF, L 0.4117647, A 0.53333336, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.33287132, and chroma 0.069218926. It can be represented as a packed float with the constant -0x1.0510d2p126F.
                   @ 
    @@ -2816,9 +2816,9 @@ 

    DARK_SKIN_3

  • PINK_SKIN_1

    -
    public static final float PINK_SKIN_1
    -
    This color constant "Pink Skin 1" has RGBA8888 code AB7373FF, L 0.5254902, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.05653231, and chroma 0.061763234. - It can be represented as a packed float with the constant -0x1.050f0cp126F. +
    public static final float PINK_SKIN_1
    +
    This color constant "Pink Skin 1" has RGBA8888 code AB7373FF, L 0.5294118, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.2670001, and chroma 0.061763234. + It can be represented as a packed float with the constant -0x1.050f0ep126F.
                   @ 
          @  @  @  @ 
    @@ -2837,9 +2837,9 @@ 

    PINK_SKIN_1

  • PINK_SKIN_2

    -
    public static final float PINK_SKIN_2
    -
    This color constant "Pink Skin 2" has RGBA8888 code C78F8FFF, L 0.6313726, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.05119568, saturation 0.1156203, and chroma 0.061763234. - It can be represented as a packed float with the constant -0x1.050f42p126F. +
    public static final float PINK_SKIN_2
    +
    This color constant "Pink Skin 2" has RGBA8888 code C78F8FFF, L 0.63529414, A 0.5294118, B 0.50980395, alpha 1.0, hue 0.057087466, saturation 0.3883638, and chroma 0.061763234. + It can be represented as a packed float with the constant -0x1.050f44p126F.
                   @ 
          @  @  @  @ 
    @@ -2858,9 +2858,9 @@ 

    PINK_SKIN_2

  • PINK_SKIN_3

    -
    public static final float PINK_SKIN_3
    -
    This color constant "Pink Skin 3" has RGBA8888 code E3ABABFF, L 0.73333335, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.03609712, saturation 0.17939028, and chroma 0.052115876. - It can be represented as a packed float with the constant -0x1.030d76p126F. +
    public static final float PINK_SKIN_3
    +
    This color constant "Pink Skin 3" has RGBA8888 code E3ABABFF, L 0.7411765, A 0.5254902, B 0.5058824, alpha 1.0, hue 0.044284336, saturation 0.52000785, and chroma 0.052115876. + It can be represented as a packed float with the constant -0x1.030d7ap126F.
                   @ 
          @  @  @  @ 
    @@ -2879,9 +2879,9 @@ 

    PINK_SKIN_3

  • PINK_SKIN_4

    -
    public static final float PINK_SKIN_4
    -
    This color constant "Pink Skin 4" has RGBA8888 code F8D2DAFF, L 0.85490197, A 0.5176471, B 0.49803922, alpha 1.0, hue 0.9823789, saturation 0.30119374, and chroma 0.0353726. - It can be represented as a packed float with the constant -0x1.ff09b4p125F. +
    public static final float PINK_SKIN_4
    +
    This color constant "Pink Skin 4" has RGBA8888 code F8D2DAFF, L 0.8627451, A 0.5176471, B 0.49803922, alpha 1.0, hue 1.2950972E-5, saturation 0.71428573, and chroma 0.0353726. + It can be represented as a packed float with the constant -0x1.ff09b8p125F.
                   @ 
          @  @  @  @ 
    @@ -2900,9 +2900,9 @@ 

    PINK_SKIN_4

  • BRONZE_SKIN_4

    -
    public static final float BRONZE_SKIN_4
    -
    This color constant "Bronze Skin 4" has RGBA8888 code E3C7ABFF, L 0.79607844, A 0.5058824, B 0.5176471, alpha 1.0, hue 0.19880433, saturation 0.0852071, and chroma 0.03705794. - It can be represented as a packed float with the constant -0x1.090396p126F. +
    public static final float BRONZE_SKIN_4
    +
    This color constant "Bronze Skin 4" has RGBA8888 code E3C7ABFF, L 0.8039216, A 0.5058824, B 0.5176471, alpha 1.0, hue 0.189452, saturation 0.3989011, and chroma 0.03705794. + It can be represented as a packed float with the constant -0x1.09039ap126F.
                   @ 
          @  @  @  @ 
    @@ -2921,9 +2921,9 @@ 

    BRONZE_SKIN_4

  • BRONZE_SKIN_3

    -
    public static final float BRONZE_SKIN_3
    -
    This color constant "Bronze Skin 3" has RGBA8888 code C49E73FF, L 0.654902, A 0.50980395, B 0.5294118, alpha 1.0, hue 0.19880433, saturation 0.12624669, and chroma 0.061763234. - It can be represented as a packed float with the constant -0x1.0f054ep126F. +
    public static final float BRONZE_SKIN_3
    +
    This color constant "Bronze Skin 3" has RGBA8888 code C49E73FF, L 0.65882355, A 0.50980395, B 0.5294118, alpha 1.0, hue 0.19291253, saturation 0.3883638, and chroma 0.061763234. + It can be represented as a packed float with the constant -0x1.0f055p126F.
                   @ 
          @  @  @  @ 
    @@ -2942,8 +2942,8 @@ 

    BRONZE_SKIN_3

  • BRONZE_SKIN_2

    -
    public static final float BRONZE_SKIN_2
    -
    This color constant "Bronze Skin 2" has RGBA8888 code 8F7357FF, L 0.4862745, A 0.50980395, B 0.52156866, alpha 1.0, hue 0.18210676, saturation 0.103822224, and chroma 0.0471994. +
    public static final float BRONZE_SKIN_2
    +
    This color constant "Bronze Skin 2" has RGBA8888 code 8F7357FF, L 0.4862745, A 0.50980395, B 0.52156866, alpha 1.0, hue 0.17620972, saturation 0.3626056, and chroma 0.0471994. It can be represented as a packed float with the constant -0x1.0b04f8p126F.
                   @ 
    @@ -2963,9 +2963,9 @@ 

    BRONZE_SKIN_2

  • BRONZE_SKIN_1

    -
    public static final float BRONZE_SKIN_1
    -
    This color constant "Bronze Skin 1" has RGBA8888 code 73573BFF, L 0.37254903, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.19157475, saturation 0.19551525, and chroma 0.054407768. - It can be represented as a packed float with the constant -0x1.0d04bep126F. +
    public static final float BRONZE_SKIN_1
    +
    This color constant "Bronze Skin 1" has RGBA8888 code 73573BFF, L 0.36862746, A 0.50980395, B 0.5254902, alpha 1.0, hue 0.18556869, saturation 0.49134022, and chroma 0.054407768. + It can be represented as a packed float with the constant -0x1.0d04bcp126F.
                   @ 
          @  @  @  @ 
    @@ -2984,8 +2984,8 @@ 

    BRONZE_SKIN_1

  • TAUPE

    -
    public static final float TAUPE
    -
    This color constant "Taupe" has RGBA8888 code 3B2D1FFF, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.18556869, saturation 0.12547323, and chroma 0.029749114. +
    public static final float TAUPE
    +
    This color constant "Taupe" has RGBA8888 code 3B2D1FFF, L 0.18039216, A 0.5058824, B 0.5137255, alpha 1.0, hue 0.17620972, saturation 0.4259177, and chroma 0.029749114. It can be represented as a packed float with the constant -0x1.07025cp126F.
                   @ 
    @@ -3005,9 +3005,9 @@ 

    TAUPE

  • DRAB_GREEN

    -
    public static final float DRAB_GREEN
    -
    This color constant "Drab Green" has RGBA8888 code 414123FF, L 0.24705882, A 0.49019608, B 0.52156866, alpha 1.0, hue 0.31789324, saturation 0.20790316, and chroma 0.0471994. - It can be represented as a packed float with the constant -0x1.0afa7ep126F. +
    public static final float DRAB_GREEN
    +
    This color constant "Drab Green" has RGBA8888 code 414123FF, L 0.24313726, A 0.49019608, B 0.52156866, alpha 1.0, hue 0.30119568, saturation 0.5499613, and chroma 0.0471994. + It can be represented as a packed float with the constant -0x1.0afa7cp126F.
                   @ 
          @  @  @  @ 
    @@ -3026,8 +3026,8 @@ 

    DRAB_GREEN

  • LIZARD_SCALES

    -
    public static final float LIZARD_SCALES
    -
    This color constant "Lizard Scales" has RGBA8888 code 73733BFF, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.30616736, saturation 0.32533228, and chroma 0.079095535. +
    public static final float LIZARD_SCALES
    +
    This color constant "Lizard Scales" has RGBA8888 code 73733BFF, L 0.44705883, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.29637668, saturation 0.63274586, and chroma 0.079095535. It can be represented as a packed float with the constant -0x1.12f8e4p126F.
                   @ 
    @@ -3047,8 +3047,8 @@ 

    LIZARD_SCALES

  • CRICKET

    -
    public static final float CRICKET
    -
    This color constant "Cricket" has RGBA8888 code 8F8F57FF, L 0.5568628, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.31215638, saturation 0.1962549, and chroma 0.071815535. +
    public static final float CRICKET
    +
    This color constant "Cricket" has RGBA8888 code 8F8F57FF, L 0.5568628, A 0.4862745, B 0.53333336, alpha 1.0, hue 0.30119568, saturation 0.48650423, and chroma 0.071815535. It can be represented as a packed float with the constant -0x1.10f91cp126F.
                   @ 
    @@ -3068,9 +3068,9 @@ 

    CRICKET

  • OLIVE_OIL

    -
    public static final float OLIVE_OIL
    -
    This color constant "Olive Oil" has RGBA8888 code A2A255FF, L 0.62352943, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30935085, saturation 0.3080419, and chroma 0.096477255. - It can be represented as a packed float with the constant -0x1.16f73ep126F. +
    public static final float OLIVE_OIL
    +
    This color constant "Olive Oil" has RGBA8888 code A2A255FF, L 0.627451, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30119568, saturation 0.6023386, and chroma 0.096477255. + It can be represented as a packed float with the constant -0x1.16f74p126F.
                   @ 
          @  @  @  @ 
    @@ -3089,9 +3089,9 @@ 

    OLIVE_OIL

  • DUN

    -
    public static final float DUN
    -
    This color constant "Dun" has RGBA8888 code B5B572FF, L 0.69411767, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.30616736, saturation 0.18171746, and chroma 0.079095535. - It can be represented as a packed float with the constant -0x1.12f962p126F. +
    public static final float DUN
    +
    This color constant "Dun" has RGBA8888 code B5B572FF, L 0.7019608, A 0.4862745, B 0.5372549, alpha 1.0, hue 0.29637668, saturation 0.46401364, and chroma 0.079095535. + It can be represented as a packed float with the constant -0x1.12f966p126F.
                   @ 
          @  @  @  @ 
    @@ -3110,9 +3110,9 @@ 

    DUN

  • CORN_SILK

    -
    public static final float CORN_SILK
    -
    This color constant "Corn Silk" has RGBA8888 code C7C78FFF, L 0.7607843, A 0.4862745, B 0.5294118, alpha 1.0, hue 0.31948605, saturation 0.103308514, and chroma 0.064659946. - It can be represented as a packed float with the constant -0x1.0ef984p126F. +
    public static final float CORN_SILK
    +
    This color constant "Corn Silk" has RGBA8888 code C7C78FFF, L 0.76862746, A 0.4862745, B 0.5294118, alpha 1.0, hue 0.30708748, saturation 0.34873483, and chroma 0.064659946. + It can be represented as a packed float with the constant -0x1.0ef988p126F.
                   @ 
          @  @  @  @ 
    @@ -3131,9 +3131,9 @@ 

    CORN_SILK

  • TAN

    -
    public static final float TAN
    -
    This color constant "Tan" has RGBA8888 code DADAABFF, L 0.83137256, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.30842525, saturation 0.06777885, and chroma 0.054407768. - It can be represented as a packed float with the constant -0x1.0cfba8p126F. +
    public static final float TAN
    +
    This color constant "Tan" has RGBA8888 code DADAABFF, L 0.8392157, A 0.49019608, B 0.5254902, alpha 1.0, hue 0.29428434, saturation 0.2854945, and chroma 0.054407768. + It can be represented as a packed float with the constant -0x1.0cfbacp126F.
                   @ 
          @  @  @  @ 
    @@ -3152,9 +3152,9 @@ 

    TAN

  • STRAW

    -
    public static final float STRAW
    -
    This color constant "Straw" has RGBA8888 code EDEDC7FF, L 0.8980392, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.33071172, saturation 0.029941387, and chroma 0.040217306. - It can be represented as a packed float with the constant -0x1.08fbcap126F. +
    public static final float STRAW
    +
    This color constant "Straw" has RGBA8888 code EDEDC7FF, L 0.90588236, A 0.49019608, B 0.5176471, alpha 1.0, hue 0.310548, saturation 0.1923273, and chroma 0.040217306. + It can be represented as a packed float with the constant -0x1.08fbcep126F.
                   @ 
          @  @  @  @ 
    @@ -3173,9 +3173,9 @@ 

    STRAW

  • HONEYDEW

    -
    public static final float HONEYDEW
    -
    This color constant "Honeydew" has RGBA8888 code C7E3ABFF, L 0.8352941, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.375, saturation 0.069975674, and chroma 0.071815535. - It can be represented as a packed float with the constant -0x1.0cf3aap126F. +
    public static final float HONEYDEW
    +
    This color constant "Honeydew" has RGBA8888 code C7E3ABFF, L 0.84313726, A 0.4745098, B 0.5254902, alpha 1.0, hue 0.3627901, saturation 0.28811076, and chroma 0.071815535. + It can be represented as a packed float with the constant -0x1.0cf3aep126F.
                   @ 
          @  @  @  @ 
    @@ -3194,9 +3194,9 @@ 

    HONEYDEW

  • TARNISH

    -
    public static final float TARNISH
    -
    This color constant "Tarnish" has RGBA8888 code ABC78FFF, L 0.7372549, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3636593, saturation 0.100864, and chroma 0.07753685. - It can be represented as a packed float with the constant -0x1.0ef378p126F. +
    public static final float TARNISH
    +
    This color constant "Tarnish" has RGBA8888 code ABC78FFF, L 0.74509805, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3524291, saturation 0.35714287, and chroma 0.07753685. + It can be represented as a packed float with the constant -0x1.0ef37cp126F.
                   @ 
          @  @  @  @ 
    @@ -3215,9 +3215,9 @@ 

    TARNISH

  • PEA_SOUP

    -
    public static final float PEA_SOUP
    -
    This color constant "Pea Soup" has RGBA8888 code 8EBE55FF, L 0.6784314, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.36230367, saturation 0.3804915, and chroma 0.13854803. - It can be represented as a packed float with the constant -0x1.1ae95ap126F. +
    public static final float PEA_SOUP
    +
    This color constant "Pea Soup" has RGBA8888 code 8EBE55FF, L 0.68235296, A 0.45490196, B 0.5529412, alpha 1.0, hue 0.35600415, saturation 0.6594257, and chroma 0.13854803. + It can be represented as a packed float with the constant -0x1.1ae95cp126F.
                   @ 
          @  @  @  @ 
    @@ -3236,8 +3236,8 @@ 

    PEA_SOUP

  • MARSH

    -
    public static final float MARSH
    -
    This color constant "Marsh" has RGBA8888 code 738F57FF, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.375, saturation 0.1515024, and chroma 0.082864076. +
    public static final float MARSH
    +
    This color constant "Marsh" has RGBA8888 code 738F57FF, L 0.5294118, A 0.47058824, B 0.5294118, alpha 1.0, hue 0.3644131, saturation 0.45234665, and chroma 0.082864076. It can be represented as a packed float with the constant -0x1.0ef10ep126F.
                   @ 
    @@ -3257,8 +3257,8 @@ 

    MARSH

  • ASPARAGUS

    -
    public static final float ASPARAGUS
    -
    This color constant "Asparagus" has RGBA8888 code 587D3EFF, L 0.4509804, A 0.4627451, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.29466382, and chroma 0.104961164. +
    public static final float ASPARAGUS
    +
    This color constant "Asparagus" has RGBA8888 code 587D3EFF, L 0.4509804, A 0.4627451, B 0.5372549, alpha 1.0, hue 0.36663744, saturation 0.62574995, and chroma 0.104961164. It can be represented as a packed float with the constant -0x1.12ece6p126F.
                   @ 
    @@ -3278,9 +3278,9 @@ 

    ASPARAGUS

  • PEAT_BOG

    -
    public static final float PEAT_BOG
    -
    This color constant "Peat Bog" has RGBA8888 code 465032FF, L 0.29803923, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.35914788, saturation 0.16971225, and chroma 0.055518243. - It can be represented as a packed float with the constant -0x1.0af698p126F. +
    public static final float PEAT_BOG
    +
    This color constant "Peat Bog" has RGBA8888 code 465032FF, L 0.29411766, A 0.48235294, B 0.52156866, alpha 1.0, hue 0.34359556, saturation 0.4973174, and chroma 0.055518243. + It can be represented as a packed float with the constant -0x1.0af696p126F.
                   @ 
          @  @  @  @ 
    @@ -3299,8 +3299,8 @@ 

    PEAT_BOG

  • DEEP_JUNGLE

    -
    public static final float DEEP_JUNGLE
    -
    This color constant "Deep Jungle" has RGBA8888 code 191E0FFF, L 0.09411765, A 0.4862745, B 0.5137255, alpha 1.0, hue 0.375, saturation 0.2120065, and chroma 0.038669903. +
    public static final float DEEP_JUNGLE
    +
    This color constant "Deep Jungle" has RGBA8888 code 191E0FFF, L 0.09411765, A 0.4862745, B 0.5137255, alpha 1.0, hue 0.3524291, saturation 0.625, and chroma 0.038669903. It can be represented as a packed float with the constant -0x1.06f83p126F.
                   @ 
    @@ -3320,8 +3320,8 @@ 

    DEEP_JUNGLE

  • PINE_GREEN

    -
    public static final float PINE_GREEN
    -
    This color constant "Pine Green" has RGBA8888 code 235037FF, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.44383267, saturation 0.5838377, and chroma 0.079095535. +
    public static final float PINE_GREEN
    +
    This color constant "Pine Green" has RGBA8888 code 235037FF, L 0.27058825, A 0.4627451, B 0.5137255, alpha 1.0, hue 0.43344522, saturation 0.6792316, and chroma 0.079095535. It can be represented as a packed float with the constant -0x1.06ec8ap126F.
                   @ 
    @@ -3341,8 +3341,8 @@ 

    PINE_GREEN

  • OLIVE_GREEN

    -
    public static final float OLIVE_GREEN
    -
    This color constant "Olive Green" has RGBA8888 code 3B573BFF, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.42138404, saturation 0.19425261, and chroma 0.05767509. +
    public static final float OLIVE_GREEN
    +
    This color constant "Olive Green" has RGBA8888 code 3B573BFF, L 0.30980393, A 0.4745098, B 0.5137255, alpha 1.0, hue 0.40640444, saturation 0.3795317, and chroma 0.05767509. It can be represented as a packed float with the constant -0x1.06f29ep126F.
                   @ 
    @@ -3362,9 +3362,9 @@ 

    OLIVE_GREEN

  • GRAY_GREEN

    -
    public static final float GRAY_GREEN
    -
    This color constant "Gray Green" has RGBA8888 code 506450FF, L 0.3764706, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.41928825, saturation 0.07537778, and chroma 0.040217306. - It can be represented as a packed float with the constant -0x1.04f6cp126F. +
    public static final float GRAY_GREEN
    +
    This color constant "Gray Green" has RGBA8888 code 506450FF, L 0.37254903, A 0.48235294, B 0.50980395, alpha 1.0, hue 0.3975709, saturation 0.22222222, and chroma 0.040217306. + It can be represented as a packed float with the constant -0x1.04f6bep126F.
                   @ 
          @  @  @  @ 
    @@ -3383,8 +3383,8 @@ 

    GRAY_GREEN

  • MAIDENHAIR_FERN

    -
    public static final float MAIDENHAIR_FERN
    -
    This color constant "Maidenhair Fern" has RGBA8888 code 3B7349FF, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.42320445, saturation 0.3791533, and chroma 0.09260367. +
    public static final float MAIDENHAIR_FERN
    +
    This color constant "Maidenhair Fern" has RGBA8888 code 3B7349FF, L 0.4, A 0.45882353, B 0.52156866, alpha 1.0, hue 0.41398114, saturation 0.5424141, and chroma 0.09260367. It can be represented as a packed float with the constant -0x1.0aeaccp126F.
                   @ 
    @@ -3404,8 +3404,8 @@ 

    MAIDENHAIR_FERN

  • KELLY_GREEN

    -
    public static final float KELLY_GREEN
    -
    This color constant "Kelly Green" has RGBA8888 code 578F57FF, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.40801254, saturation 0.29565728, and chroma 0.107261956. +
    public static final float KELLY_GREEN
    +
    This color constant "Kelly Green" has RGBA8888 code 578F57FF, L 0.5058824, A 0.45490196, B 0.5294118, alpha 1.0, hue 0.39991105, saturation 0.49459895, and chroma 0.107261956. It can be represented as a packed float with the constant -0x1.0ee902p126F.
                   @ 
    @@ -3425,9 +3425,9 @@ 

    KELLY_GREEN

  • DUSTY_GREEN

    -
    public static final float DUSTY_GREEN
    -
    This color constant "Dusty Green" has RGBA8888 code 73AB73FF, L 0.6117647, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.41176948, saturation 0.19803588, and chroma 0.096477255. - It can be represented as a packed float with the constant -0x1.0ceb38p126F. +
    public static final float DUSTY_GREEN
    +
    This color constant "Dusty Green" has RGBA8888 code 73AB73FF, L 0.6156863, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.40278715, saturation 0.39375985, and chroma 0.096477255. + It can be represented as a packed float with the constant -0x1.0ceb3ap126F.
                   @ 
          @  @  @  @ 
    @@ -3446,9 +3446,9 @@ 

    DUSTY_GREEN

  • GARTER_SNAKE

    -
    public static final float GARTER_SNAKE
    -
    This color constant "Garter Snake" has RGBA8888 code 64C082FF, L 0.6666667, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.43293634, saturation 0.3960396, and chroma 0.124142565. - It can be represented as a packed float with the constant -0x1.0ce354p126F. +
    public static final float GARTER_SNAKE
    +
    This color constant "Garter Snake" has RGBA8888 code 64C082FF, L 0.67058825, A 0.44313726, B 0.5254902, alpha 1.0, hue 0.42620972, saturation 0.5906595, and chroma 0.124142565. + It can be represented as a packed float with the constant -0x1.0ce356p126F.
                   @ 
          @  @  @  @ 
    @@ -3467,9 +3467,9 @@ 

    GARTER_SNAKE

  • SILVER_GREEN

    -
    public static final float SILVER_GREEN
    -
    This color constant "Silver Green" has RGBA8888 code 8FC78FFF, L 0.7137255, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.41176948, saturation 0.15616, and chroma 0.096477255. - It can be represented as a packed float with the constant -0x1.0ceb6cp126F. +
    public static final float SILVER_GREEN
    +
    This color constant "Silver Green" has RGBA8888 code 8FC78FFF, L 0.72156864, A 0.45882353, B 0.5254902, alpha 1.0, hue 0.40278715, saturation 0.3538132, and chroma 0.096477255. + It can be represented as a packed float with the constant -0x1.0ceb7p126F.
                   @ 
          @  @  @  @ 
    @@ -3488,9 +3488,9 @@ 

    SILVER_GREEN

  • PISTACHIO

    -
    public static final float PISTACHIO
    -
    This color constant "Pistachio" has RGBA8888 code A2D8A2FF, L 0.7764706, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.41646945, saturation 0.11585842, and chroma 0.08575976. - It can be represented as a packed float with the constant -0x1.0aed8cp126F. +
    public static final float PISTACHIO
    +
    This color constant "Pistachio" has RGBA8888 code A2D8A2FF, L 0.78431374, A 0.4627451, B 0.52156866, alpha 1.0, hue 0.40640444, saturation 0.30904725, and chroma 0.08575976. + It can be represented as a packed float with the constant -0x1.0aed9p126F.
                   @ 
          @  @  @  @ 
    @@ -3509,9 +3509,9 @@ 

    PISTACHIO

  • ANGEL_WING

    -
    public static final float ANGEL_WING
    -
    This color constant "Angel Wing" has RGBA8888 code E1F8FAFF, L 0.92941177, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5644313, saturation 0.3712, and chroma 0.029749114. - It can be represented as a packed float with the constant -0x1.fcf9dap125F. +
    public static final float ANGEL_WING
    +
    This color constant "Angel Wing" has RGBA8888 code E1F8FAFF, L 0.9372549, A 0.4862745, B 0.49411765, alpha 1.0, hue 0.5511957, saturation 0.52704626, and chroma 0.029749114. + It can be represented as a packed float with the constant -0x1.fcf9dep125F.
                   @ 
          @  @  @  @ 
    @@ -3530,9 +3530,9 @@ 

    ANGEL_WING

  • SAGE_GREEN

    -
    public static final float SAGE_GREEN
    -
    This color constant "Sage Green" has RGBA8888 code B4EECAFF, L 0.85490197, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.19143423, and chroma 0.069218926. - It can be represented as a packed float with the constant -0x1.04efb4p126F. +
    public static final float SAGE_GREEN
    +
    This color constant "Sage Green" has RGBA8888 code B4EECAFF, L 0.8666667, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.47466686, and chroma 0.069218926. + It can be represented as a packed float with the constant -0x1.04efbap126F.
                   @ 
          @  @  @  @ 
    @@ -3551,9 +3551,9 @@ 

    SAGE_GREEN

  • DRIED_SAGE

    -
    public static final float DRIED_SAGE
    -
    This color constant "Dried Sage" has RGBA8888 code ABE3C5FF, L 0.81960785, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.45448294, saturation 0.118390046, and chroma 0.069218926. - It can be represented as a packed float with the constant -0x1.04efa2p126F. +
    public static final float DRIED_SAGE
    +
    This color constant "Dried Sage" has RGBA8888 code ABE3C5FF, L 0.83137256, A 0.46666667, B 0.50980395, alpha 1.0, hue 0.44291252, saturation 0.34176013, and chroma 0.069218926. + It can be represented as a packed float with the constant -0x1.04efa8p126F.
                   @ 
          @  @  @  @ 
    @@ -3572,9 +3572,9 @@ 

    DRIED_SAGE

  • ARTICHOKE

    -
    public static final float ARTICHOKE
    -
    This color constant "Artichoke" has RGBA8888 code 87B48EFF, L 0.65882355, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.4378436, saturation 0.14369221, and chroma 0.071815535. - It can be represented as a packed float with the constant -0x1.06ef5p126F. +
    public static final float ARTICHOKE
    +
    This color constant "Artichoke" has RGBA8888 code 87B48EFF, L 0.6627451, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.42620972, saturation 0.34401047, and chroma 0.071815535. + It can be represented as a packed float with the constant -0x1.06ef52p126F.
                   @ 
          @  @  @  @ 
    @@ -3593,8 +3593,8 @@ 

    ARTICHOKE

  • VIRIDIAN

    -
    public static final float VIRIDIAN
    -
    This color constant "Viridian" has RGBA8888 code 507D5FFF, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.4378436, saturation 0.24035555, and chroma 0.071815535. +
    public static final float VIRIDIAN
    +
    This color constant "Viridian" has RGBA8888 code 507D5FFF, L 0.4509804, A 0.46666667, B 0.5137255, alpha 1.0, hue 0.42620972, saturation 0.4472136, and chroma 0.071815535. It can be represented as a packed float with the constant -0x1.06eee6p126F.
                   @ 
    @@ -3614,8 +3614,8 @@ 

    VIRIDIAN

  • FLORAL_FOAM

    -
    public static final float FLORAL_FOAM
    -
    This color constant "Floral Foam" has RGBA8888 code 0F6946FF, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.4596309, saturation 0.893996, and chroma 0.10895567. +
    public static final float FLORAL_FOAM
    +
    This color constant "Floral Foam" has RGBA8888 code 0F6946FF, L 0.34901962, A 0.44705883, B 0.5137255, alpha 1.0, hue 0.45250326, saturation 0.90676475, and chroma 0.10895567. It can be represented as a packed float with the constant -0x1.06e4b2p126F.
                   @ 
    @@ -3635,8 +3635,8 @@ 

    FLORAL_FOAM

  • HUNTER_GREEN

    -
    public static final float HUNTER_GREEN
    -
    This color constant "Hunter Green" has RGBA8888 code 1E2D23FF, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.44880432, saturation 0.2366864, and chroma 0.03705794. +
    public static final float HUNTER_GREEN
    +
    This color constant "Hunter Green" has RGBA8888 code 1E2D23FF, L 0.14901961, A 0.48235294, B 0.5058824, alpha 1.0, hue 0.42620972, saturation 0.4259177, and chroma 0.03705794. It can be represented as a packed float with the constant -0x1.02f64cp126F.
                   @ 
    @@ -3656,9 +3656,9 @@ 

    HUNTER_GREEN

  • DARK_TEAL

    -
    public static final float DARK_TEAL
    -
    This color constant "Dark Teal" has RGBA8888 code 234146FF, L 0.23137255, A 0.47843137, B 0.4862745, alpha 1.0, hue 0.59020853, saturation 0.4045211, and chroma 0.050931267. - It can be represented as a packed float with the constant -0x1.f8f476p125F. +
    public static final float DARK_TEAL
    +
    This color constant "Dark Teal" has RGBA8888 code 234146FF, L 0.22745098, A 0.47843137, B 0.4862745, alpha 1.0, hue 0.58601886, saturation 0.64788353, and chroma 0.050931267. + It can be represented as a packed float with the constant -0x1.f8f474p125F.
                   @ 
          @  @  @  @ 
    @@ -3677,8 +3677,8 @@ 

    DARK_TEAL

  • KYANITE

    -
    public static final float KYANITE
    -
    This color constant "Kyanite" has RGBA8888 code 3B7373FF, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.545517, saturation 0.4471342, and chroma 0.069218926. +
    public static final float KYANITE
    +
    This color constant "Kyanite" has RGBA8888 code 3B7373FF, L 0.41568628, A 0.46666667, B 0.49019608, alpha 1.0, hue 0.53898686, saturation 0.63432395, and chroma 0.069218926. It can be represented as a packed float with the constant -0x1.faeed4p125F.
                   @ 
    @@ -3698,9 +3698,9 @@ 

    KYANITE

  • SPEARMINT

    -
    public static final float SPEARMINT
    -
    This color constant "Spearmint" has RGBA8888 code 64ABABFF, L 0.61960787, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.5409493, saturation 0.32430163, and chroma 0.07674564. - It can be represented as a packed float with the constant -0x1.faed3cp125F. +
    public static final float SPEARMINT
    +
    This color constant "Spearmint" has RGBA8888 code 64ABABFF, L 0.62352943, A 0.4627451, B 0.49019608, alpha 1.0, hue 0.53480494, saturation 0.5587603, and chroma 0.07674564. + It can be represented as a packed float with the constant -0x1.faed3ep125F.
                   @ 
          @  @  @  @ 
    @@ -3719,9 +3719,9 @@ 

    SPEARMINT

  • AMAZONITE

    -
    public static final float AMAZONITE
    -
    This color constant "Amazonite" has RGBA8888 code 8FC7C7FF, L 0.73333335, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.1686625, and chroma 0.061763234. - It can be represented as a packed float with the constant -0x1.faf176p125F. +
    public static final float AMAZONITE
    +
    This color constant "Amazonite" has RGBA8888 code 8FC7C7FF, L 0.7372549, A 0.47058824, B 0.49019608, alpha 1.0, hue 0.54428434, saturation 0.39351946, and chroma 0.061763234. + It can be represented as a packed float with the constant -0x1.faf178p125F.
                   @ 
          @  @  @  @ 
    @@ -3740,9 +3740,9 @@ 

    AMAZONITE

  • PASTEL_SKY

    -
    public static final float PASTEL_SKY
    -
    This color constant "Pastel Sky" has RGBA8888 code ABE3E3FF, L 0.83137256, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.55842525, saturation 0.12433905, and chroma 0.054407768. - It can be represented as a packed float with the constant -0x1.faf3a8p125F. +
    public static final float PASTEL_SKY
    +
    This color constant "Pastel Sky" has RGBA8888 code ABE3E3FF, L 0.8392157, A 0.4745098, B 0.49019608, alpha 1.0, hue 0.5511957, saturation 0.3085149, and chroma 0.054407768. + It can be represented as a packed float with the constant -0x1.faf3acp125F.
                   @ 
          @  @  @  @ 
    @@ -3761,9 +3761,9 @@ 

    PASTEL_SKY

  • AQUAMARINE

    -
    public static final float AQUAMARINE
    -
    This color constant "Aquamarine" has RGBA8888 code C7F1F1FF, L 0.8862745, A 0.47843137, B 0.49411765, alpha 1.0, hue 0.54236877, saturation 0.14938237, and chroma 0.044538103. - It can be represented as a packed float with the constant -0x1.fcf5c4p125F. +
    public static final float AQUAMARINE
    +
    This color constant "Aquamarine" has RGBA8888 code C7F1F1FF, L 0.8980392, A 0.47843137, B 0.49411765, alpha 1.0, hue 0.53142345, saturation 0.443393, and chroma 0.044538103. + It can be represented as a packed float with the constant -0x1.fcf5cap125F.
                   @ 
          @  @  @  @ 
    @@ -3782,9 +3782,9 @@ 

    AQUAMARINE

  • DUST_BUNNY

    -
    public static final float DUST_BUNNY
    -
    This color constant "Dust Bunny" has RGBA8888 code BED2F0FF, L 0.80784315, A 0.49411765, B 0.47843137, alpha 1.0, hue 0.70763123, saturation 0.34188035, and chroma 0.044538103. - It can be represented as a packed float with the constant -0x1.f4fd9cp125F. +
    public static final float DUST_BUNNY
    +
    This color constant "Dust Bunny" has RGBA8888 code BED2F0FF, L 0.81960785, A 0.49411765, B 0.47843137, alpha 1.0, hue 0.71857655, saturation 0.5998846, and chroma 0.044538103. + It can be represented as a packed float with the constant -0x1.f4fda2p125F.
                   @ 
          @  @  @  @ 
    @@ -3803,9 +3803,9 @@ 

    DUST_BUNNY

  • PATINA

    -
    public static final float PATINA
    -
    This color constant "Patina" has RGBA8888 code ABC7E3FF, L 0.7647059, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.68210673, saturation 0.22452903, and chroma 0.0471994. - It can be represented as a packed float with the constant -0x1.f4fb86p125F. +
    public static final float PATINA
    +
    This color constant "Patina" has RGBA8888 code ABC7E3FF, L 0.77254903, A 0.49019608, B 0.47843137, alpha 1.0, hue 0.689452, saturation 0.4682752, and chroma 0.0471994. + It can be represented as a packed float with the constant -0x1.f4fb8ap125F.
                   @ 
          @  @  @  @ 
    @@ -3824,9 +3824,9 @@ 

    PATINA

  • CHIPPED_GRANITE

    -
    public static final float CHIPPED_GRANITE
    -
    This color constant "Chipped Granite" has RGBA8888 code A8B9DCFF, L 0.7254902, A 0.49411765, B 0.4745098, alpha 1.0, hue 0.7139029, saturation 0.21914436, and chroma 0.052115876. - It can be represented as a packed float with the constant -0x1.f2fd72p125F. +
    public static final float CHIPPED_GRANITE
    +
    This color constant "Chipped Granite" has RGBA8888 code A8B9DCFF, L 0.73333335, A 0.49411765, B 0.4745098, alpha 1.0, hue 0.7237039, saturation 0.46790484, and chroma 0.052115876. + It can be represented as a packed float with the constant -0x1.f2fd76p125F.
                   @ 
          @  @  @  @ 
    @@ -3845,9 +3845,9 @@ 

    CHIPPED_GRANITE

  • BLUE_SMOKE

    -
    public static final float BLUE_SMOKE
    -
    This color constant "Blue Smoke" has RGBA8888 code 8FABC7FF, L 0.6627451, A 0.49019608, B 0.4745098, alpha 1.0, hue 0.69157475, saturation 0.13795556, and chroma 0.054407768. - It can be represented as a packed float with the constant -0x1.f2fb52p125F. +
    public static final float BLUE_SMOKE
    +
    This color constant "Blue Smoke" has RGBA8888 code 8FABC7FF, L 0.6666667, A 0.49019608, B 0.4745098, alpha 1.0, hue 0.6988043, saturation 0.36140317, and chroma 0.054407768. + It can be represented as a packed float with the constant -0x1.f2fb54p125F.
                   @ 
          @  @  @  @ 
    @@ -3866,8 +3866,8 @@ 

    BLUE_SMOKE

  • AIR_FORCE_BLUE

    -
    public static final float AIR_FORCE_BLUE
    -
    This color constant "Air Force Blue" has RGBA8888 code 578FC7FF, L 0.5529412, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6840373, saturation 0.29252034, and chroma 0.106691405. +
    public static final float AIR_FORCE_BLUE
    +
    This color constant "Air Force Blue" has RGBA8888 code 578FC7FF, L 0.5529412, A 0.47843137, B 0.4509804, alpha 1.0, hue 0.6871773, saturation 0.5531915, and chroma 0.106691405. It can be represented as a packed float with the constant -0x1.e6f51ap125F.
                   @ 
    @@ -3887,8 +3887,8 @@ 

    AIR_FORCE_BLUE

  • COLD_IRON

    -
    public static final float COLD_IRON
    -
    This color constant "Cold Iron" has RGBA8888 code 57738FFF, L 0.44705883, A 0.4862745, B 0.4745098, alpha 1.0, hue 0.67138404, saturation 0.1397212, and chroma 0.05767509. +
    public static final float COLD_IRON
    +
    This color constant "Cold Iron" has RGBA8888 code 57738FFF, L 0.44705883, A 0.4862745, B 0.4745098, alpha 1.0, hue 0.6762097, saturation 0.35306334, and chroma 0.05767509. It can be represented as a packed float with the constant -0x1.f2f8e4p125F.
                   @ 
    @@ -3908,8 +3908,8 @@ 

    COLD_IRON

  • DREARY_BLUE

    -
    public static final float DREARY_BLUE
    -
    This color constant "Dreary Blue" has RGBA8888 code 3B5773FF, L 0.33333334, A 0.4862745, B 0.47058824, alpha 1.0, hue 0.680514, saturation 0.20566711, and chroma 0.064659946. +
    public static final float DREARY_BLUE
    +
    This color constant "Dreary Blue" has RGBA8888 code 3B5773FF, L 0.33333334, A 0.4862745, B 0.47058824, alpha 1.0, hue 0.6855687, saturation 0.44798666, and chroma 0.064659946. It can be represented as a packed float with the constant -0x1.f0f8aap125F.
                   @ 
    @@ -3929,8 +3929,8 @@ 

    DREARY_BLUE

  • MURK

    -
    public static final float MURK
    -
    This color constant "Murk" has RGBA8888 code 0F192DFF, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.71857655, saturation 0.28808865, and chroma 0.059754133. +
    public static final float MURK
    +
    This color constant "Murk" has RGBA8888 code 0F192DFF, L 0.08627451, A 0.49411765, B 0.47058824, alpha 1.0, hue 0.72740346, saturation 0.48765984, and chroma 0.059754133. It can be represented as a packed float with the constant -0x1.f0fc2cp125F.
                   @ 
    @@ -3950,9 +3950,9 @@ 

    MURK

  • NINJA

    -
    public static final float NINJA
    -
    This color constant "Ninja" has RGBA8888 code 1F1F3BFF, L 0.1254902, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.7778107, saturation 0.15748447, and chroma 0.06743233. - It can be represented as a packed float with the constant -0x1.ef024p125F. +
    public static final float NINJA
    +
    This color constant "Ninja" has RGBA8888 code 1F1F3BFF, L 0.12156863, A 0.5058824, B 0.46666667, alpha 1.0, hue 0.78898686, saturation 0.4022542, and chroma 0.06743233. + It can be represented as a packed float with the constant -0x1.ef023ep125F.
                   @ 
          @  @  @  @ 
    @@ -3971,9 +3971,9 @@ 

    NINJA

  • WATERCOLOR_BLACK

    -
    public static final float WATERCOLOR_BLACK
    -
    This color constant "Watercolor Black" has RGBA8888 code 3B3B57FF, L 0.24313726, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.7860971, saturation 0.047061935, and chroma 0.052115876. - It can be represented as a packed float with the constant -0x1.f3027cp125F. +
    public static final float WATERCOLOR_BLACK
    +
    This color constant "Watercolor Black" has RGBA8888 code 3B3B57FF, L 0.23921569, A 0.5058824, B 0.4745098, alpha 1.0, hue 0.8011957, saturation 0.21808812, and chroma 0.052115876. + It can be represented as a packed float with the constant -0x1.f3027ap125F.
                   @ 
          @  @  @  @ 
    @@ -3992,9 +3992,9 @@ 

    WATERCOLOR_BLACK

  • IOLITE

    -
    public static final float IOLITE
    -
    This color constant "Iolite" has RGBA8888 code 494973FF, L 0.30980393, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.06848998, and chroma 0.07513822. - It can be represented as a packed float with the constant -0x1.ed029ep125F. +
    public static final float IOLITE
    +
    This color constant "Iolite" has RGBA8888 code 494973FF, L 0.30588236, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.25970548, and chroma 0.07513822. + It can be represented as a packed float with the constant -0x1.ed029cp125F.
                   @ 
          @  @  @  @ 
    @@ -4013,9 +4013,9 @@ 

    IOLITE

  • BOYSENBERRY

    -
    public static final float BOYSENBERRY
    -
    This color constant "Boysenberry" has RGBA8888 code 57578FFF, L 0.3764706, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.7840724, saturation 0.09466445, and chroma 0.091942206. - It can be represented as a packed float with the constant -0x1.e904cp125F. +
    public static final float BOYSENBERRY
    +
    This color constant "Boysenberry" has RGBA8888 code 57578FFF, L 0.37254903, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.79236877, saturation 0.30004618, and chroma 0.091942206. + It can be represented as a packed float with the constant -0x1.e904bep125F.
                   @ 
          @  @  @  @ 
    @@ -4034,8 +4034,8 @@ 

    BOYSENBERRY

  • WATERCOLOR_GRAY

    -
    public static final float WATERCOLOR_GRAY
    -
    This color constant "Watercolor Gray" has RGBA8888 code 736EAAFF, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.7840724, saturation 0.14647366, and chroma 0.091942206. +
    public static final float WATERCOLOR_GRAY
    +
    This color constant "Watercolor Gray" has RGBA8888 code 736EAAFF, L 0.4745098, A 0.50980395, B 0.45490196, alpha 1.0, hue 0.79236877, saturation 0.37382802, and chroma 0.091942206. It can be represented as a packed float with the constant -0x1.e904f2p125F.
                   @ 
    @@ -4055,8 +4055,8 @@ 

    WATERCOLOR_GRAY

  • BLUE_STEEL

    -
    public static final float BLUE_STEEL
    -
    This color constant "Blue Steel" has RGBA8888 code 7676CAFF, L 0.5137255, A 0.50980395, B 0.4392157, alpha 1.0, hue 0.77546334, saturation 0.32010388, and chroma 0.12265874. +
    public static final float BLUE_STEEL
    +
    This color constant "Blue Steel" has RGBA8888 code 7676CAFF, L 0.5137255, A 0.50980395, B 0.4392157, alpha 1.0, hue 0.78142345, saturation 0.5665577, and chroma 0.12265874. It can be represented as a packed float with the constant -0x1.e10506p125F.
                   @ 
    @@ -4076,9 +4076,9 @@ 

    BLUE_STEEL

  • TWILIGHT_CLOUD

    -
    public static final float TWILIGHT_CLOUD
    -
    This color constant "Twilight Cloud" has RGBA8888 code 8F8FC7FF, L 0.59607846, A 0.5058824, B 0.45882353, alpha 1.0, hue 0.77259654, saturation 0.22724403, and chroma 0.082864076. - It can be represented as a packed float with the constant -0x1.eb033p125F. +
    public static final float TWILIGHT_CLOUD
    +
    This color constant "Twilight Cloud" has RGBA8888 code 8F8FC7FF, L 0.6, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.42881602, and chroma 0.07513822. + It can be represented as a packed float with the constant -0x1.ed0332p125F.
                   @ 
          @  @  @  @ 
    @@ -4097,9 +4097,9 @@ 

    TWILIGHT_CLOUD

  • SMOG

    -
    public static final float SMOG
    -
    This color constant "Smog" has RGBA8888 code ABABE3FF, L 0.69803923, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7749365, saturation 0.35029587, and chroma 0.07513822. - It can be represented as a packed float with the constant -0x1.ed0364p125F. +
    public static final float SMOG
    +
    This color constant "Smog" has RGBA8888 code ABABE3FF, L 0.7058824, A 0.5058824, B 0.4627451, alpha 1.0, hue 0.7848049, saturation 0.6146363, and chroma 0.07513822. + It can be represented as a packed float with the constant -0x1.ed0368p125F.
                   @ 
          @  @  @  @ 
    @@ -4118,9 +4118,9 @@ 

    SMOG

  • TROPIC_MIST

    -
    public static final float TROPIC_MIST
    -
    This color constant "Tropic Mist" has RGBA8888 code D0DAF8FF, L 0.84705883, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.735567, saturation 0.5078044, and chroma 0.04314594. - It can be represented as a packed float with the constant -0x1.f4ffbp125F. +
    public static final float TROPIC_MIST
    +
    This color constant "Tropic Mist" has RGBA8888 code D0DAF8FF, L 0.85490197, A 0.49803922, B 0.47843137, alpha 1.0, hue 0.75, saturation 0.7692308, and chroma 0.04314594. + It can be represented as a packed float with the constant -0x1.f4ffb4p125F.
                   @ 
          @  @  @  @ 
    @@ -4139,9 +4139,9 @@ 

    TROPIC_MIST

  • FEATHER_DOWN

    -
    public static final float FEATHER_DOWN
    -
    This color constant "Feather Down" has RGBA8888 code E3E3FFFF, L 0.88235295, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.7676211, saturation 0.6200378, and chroma 0.0353726. - It can be represented as a packed float with the constant -0x1.f701c2p125F. +
    public static final float FEATHER_DOWN
    +
    This color constant "Feather Down" has RGBA8888 code E3E3FFFF, L 0.89411765, A 0.5019608, B 0.48235294, alpha 1.0, hue 0.78898686, saturation 0.9162457, and chroma 0.0353726. + It can be represented as a packed float with the constant -0x1.f701c8p125F.
                   @ 
          @  @  @  @ 
    @@ -4160,9 +4160,9 @@ 

    FEATHER_DOWN

  • MILD_VIOLET

    -
    public static final float MILD_VIOLET
    -
    This color constant "Mild Violet" has RGBA8888 code AB8FC7FF, L 0.62352943, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.84141475, saturation 0.16076855, and chroma 0.079095535. - It can be represented as a packed float with the constant -0x1.ef0b3ep125F. +
    public static final float MILD_VIOLET
    +
    This color constant "Mild Violet" has RGBA8888 code AB8FC7FF, L 0.627451, A 0.52156866, B 0.46666667, alpha 1.0, hue 0.8524291, saturation 0.4, and chroma 0.079095535. + It can be represented as a packed float with the constant -0x1.ef0b4p125F.
                   @ 
          @  @  @  @ 
    @@ -4181,8 +4181,8 @@ 

    MILD_VIOLET

  • VIOLET_CUSHIONS

    -
    public static final float VIOLET_CUSHIONS
    -
    This color constant "Violet Cushions" has RGBA8888 code 8F57C7FF, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8425412, saturation 0.3077058, and chroma 0.16359681. +
    public static final float VIOLET_CUSHIONS
    +
    This color constant "Violet Cushions" has RGBA8888 code 8F57C7FF, L 0.4745098, A 0.54509807, B 0.43137255, alpha 1.0, hue 0.8478395, saturation 0.56239605, and chroma 0.16359681. It can be represented as a packed float with the constant -0x1.dd16f2p125F.
                   @ 
    @@ -4202,8 +4202,8 @@ 

    VIOLET_CUSHIONS

  • DULL_VIOLET

    -
    public static final float DULL_VIOLET
    -
    This color constant "Dull Violet" has RGBA8888 code 73578FFF, L 0.40392157, A 0.5254902, B 0.4627451, alpha 1.0, hue 0.84551346, saturation 0.09549119, and chroma 0.08992863. +
    public static final float DULL_VIOLET
    +
    This color constant "Dull Violet" has RGBA8888 code 73578FFF, L 0.40392157, A 0.5254902, B 0.4627451, alpha 1.0, hue 0.8552204, saturation 0.31237683, and chroma 0.08992863. It can be represented as a packed float with the constant -0x1.ed0ccep125F.
                   @ 
    @@ -4223,8 +4223,8 @@ 

    DULL_VIOLET

  • ROYAL_VIOLET

    -
    public static final float ROYAL_VIOLET
    -
    This color constant "Royal Violet" has RGBA8888 code 573B73FF, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.84872866, saturation 0.18195479, and chroma 0.1008085. +
    public static final float ROYAL_VIOLET
    +
    This color constant "Royal Violet" has RGBA8888 code 573B73FF, L 0.2901961, A 0.5294118, B 0.45882353, alpha 1.0, hue 0.8573997, saturation 0.43411013, and chroma 0.1008085. It can be represented as a packed float with the constant -0x1.eb0e94p125F.
                   @ 
    @@ -4244,8 +4244,8 @@ 

    ROYAL_VIOLET

  • EMINENCE

    -
    public static final float EMINENCE
    -
    This color constant "Eminence" has RGBA8888 code 3C233CFF, L 0.16862746, A 0.5254902, B 0.48235294, alpha 1.0, hue 0.9036119, saturation 0.1524158, and chroma 0.061763234. +
    public static final float EMINENCE
    +
    This color constant "Eminence" has RGBA8888 code 3C233CFF, L 0.16862746, A 0.5254902, B 0.48235294, alpha 1.0, hue 0.9173693, saturation 0.42432937, and chroma 0.061763234. It can be represented as a packed float with the constant -0x1.f70c56p125F.
                   @ 
    @@ -4265,9 +4265,9 @@ 

    EMINENCE

  • PRUNE

    -
    public static final float PRUNE
    -
    This color constant "Prune" has RGBA8888 code 463246FF, L 0.22352941, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.057617728, and chroma 0.044538103. - It can be represented as a packed float with the constant -0x1.f90872p125F. +
    public static final float PRUNE
    +
    This color constant "Prune" has RGBA8888 code 463246FF, L 0.21960784, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.2591534, and chroma 0.044538103. + It can be represented as a packed float with the constant -0x1.f9087p125F.
                   @ 
          @  @  @  @ 
    @@ -4286,8 +4286,8 @@ 

    PRUNE

  • DUSTY_GRAPE

    -
    public static final float DUSTY_GRAPE
    -
    This color constant "Dusty Grape" has RGBA8888 code 724072FF, L 0.3372549, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.18195479, and chroma 0.1008085. +
    public static final float DUSTY_GRAPE
    +
    This color constant "Dusty Grape" has RGBA8888 code 724072FF, L 0.3372549, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.44197983, and chroma 0.1008085. It can be represented as a packed float with the constant -0x1.f114acp125F.
                   @ 
    @@ -4307,8 +4307,8 @@ 

    DUSTY_GRAPE

  • PINK_VIOLET

    -
    public static final float PINK_VIOLET
    -
    This color constant "Pink Violet" has RGBA8888 code 8F578FFF, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.13027532, and chroma 0.1008085. +
    public static final float PINK_VIOLET
    +
    This color constant "Pink Violet" has RGBA8888 code 8F578FFF, L 0.4392157, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.37792477, and chroma 0.1008085. It can be represented as a packed float with the constant -0x1.f114ep125F.
                   @ 
    @@ -4328,8 +4328,8 @@ 

    PINK_VIOLET

  • RIPE_PLUM

    -
    public static final float RIPE_PLUM
    -
    This color constant "Ripe Plum" has RGBA8888 code AB57ABFF, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.9052252, saturation 0.23956598, and chroma 0.14626285. +
    public static final float RIPE_PLUM
    +
    This color constant "Ripe Plum" has RGBA8888 code AB57ABFF, L 0.49411765, A 0.56078434, B 0.45882353, alpha 1.0, hue 0.911086, saturation 0.5099449, and chroma 0.14626285. It can be represented as a packed float with the constant -0x1.eb1efcp125F.
                   @ 
    @@ -4349,8 +4349,8 @@ 

    RIPE_PLUM

  • MAUVE

    -
    public static final float MAUVE
    -
    This color constant "Mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90127134, saturation 0.09785124, and chroma 0.1008085. +
    public static final float MAUVE
    +
    This color constant "Mauve" has RGBA8888 code AB73ABFF, L 0.54901963, A 0.5411765, B 0.47058824, alpha 1.0, hue 0.90979147, saturation 0.3259601, and chroma 0.1008085. It can be represented as a packed float with the constant -0x1.f11518p125F.
                   @ 
    @@ -4370,9 +4370,9 @@ 

    MAUVE

  • HAM

    -
    public static final float HAM
    -
    This color constant "Ham" has RGBA8888 code EBACE1FF, L 0.7647059, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.90448654, saturation 0.28008983, and chroma 0.08992863. - It can be represented as a packed float with the constant -0x1.f31386p125F. +
    public static final float HAM
    +
    This color constant "Ham" has RGBA8888 code EBACE1FF, L 0.77254903, A 0.5372549, B 0.4745098, alpha 1.0, hue 0.91398114, saturation 0.5830952, and chroma 0.08992863. + It can be represented as a packed float with the constant -0x1.f3138ap125F.
                   @ 
          @  @  @  @ 
    @@ -4391,9 +4391,9 @@ 

    HAM

  • COTTON_CANDY

    -
    public static final float COTTON_CANDY
    -
    This color constant "Cotton Candy" has RGBA8888 code FFDCF5FF, L 0.8901961, A 0.5176471, B 0.49019608, alpha 1.0, hue 0.9192883, saturation 0.38934803, and chroma 0.040217306. - It can be represented as a packed float with the constant -0x1.fb09c6p125F. +
    public static final float COTTON_CANDY
    +
    This color constant "Cotton Candy" has RGBA8888 code FFDCF5FF, L 0.9019608, A 0.5176471, B 0.49019608, alpha 1.0, hue 0.939452, saturation 0.97912085, and chroma 0.040217306. + It can be represented as a packed float with the constant -0x1.fb09ccp125F.
                   @ 
          @  @  @  @ 
    @@ -4412,9 +4412,9 @@ 

    COTTON_CANDY

  • SILVER_PINK

    -
    public static final float SILVER_PINK
    -
    This color constant "Silver Pink" has RGBA8888 code E3C7E3FF, L 0.8117647, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.8947796, saturation 0.12307692, and chroma 0.044538103. - It can be represented as a packed float with the constant -0x1.f9099ep125F. +
    public static final float SILVER_PINK
    +
    This color constant "Silver Pink" has RGBA8888 code E3C7E3FF, L 0.8235294, A 0.5176471, B 0.4862745, alpha 1.0, hue 0.91398114, saturation 0.4021346, and chroma 0.044538103. + It can be represented as a packed float with the constant -0x1.f909a4p125F.
                   @ 
          @  @  @  @ 
    @@ -4433,9 +4433,9 @@ 

    SILVER_PINK

  • TEA_ROSE

    -
    public static final float TEA_ROSE
    -
    This color constant "Tea Rose" has RGBA8888 code E1B9D2FF, L 0.7764706, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.93210673, saturation 0.11585003, and chroma 0.0471994. - It can be represented as a packed float with the constant -0x1.fb0b8cp125F. +
    public static final float TEA_ROSE
    +
    This color constant "Tea Rose" has RGBA8888 code E1B9D2FF, L 0.78431374, A 0.52156866, B 0.49019608, alpha 1.0, hue 0.9488043, saturation 0.42163703, and chroma 0.0471994. + It can be represented as a packed float with the constant -0x1.fb0b9p125F.
                   @ 
          @  @  @  @ 
    @@ -4454,9 +4454,9 @@ 

    TEA_ROSE

  • OLD_ROSE

    -
    public static final float OLD_ROSE
    -
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, L 0.7058824, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.954483, saturation 0.16594002, and chroma 0.069218926. - It can be represented as a packed float with the constant -0x1.fb1168p125F. +
    public static final float OLD_ROSE
    +
    This color constant "Old Rose" has RGBA8888 code D7A0BEFF, L 0.70980394, A 0.53333336, B 0.49019608, alpha 1.0, hue 0.96519506, saturation 0.46097723, and chroma 0.069218926. + It can be represented as a packed float with the constant -0x1.fb116ap125F.
                   @ 
          @  @  @  @ 
    @@ -4475,9 +4475,9 @@ 

    OLD_ROSE

  • DUSTY_PINK

    -
    public static final float DUSTY_PINK
    -
    This color constant "Dusty Pink" has RGBA8888 code C78FB9FF, L 0.64705884, A 0.5372549, B 0.48235294, alpha 1.0, hue 0.9295985, saturation 0.1030243, and chroma 0.0821242. - It can be represented as a packed float with the constant -0x1.f7134ap125F. +
    public static final float DUSTY_PINK
    +
    This color constant "Dusty Pink" has RGBA8888 code C78FB9FF, L 0.6509804, A 0.5372549, B 0.48235294, alpha 1.0, hue 0.939452, saturation 0.359011, and chroma 0.0821242. + It can be represented as a packed float with the constant -0x1.f7134cp125F.
                   @ 
          @  @  @  @ 
    @@ -4496,9 +4496,9 @@ 

    DUSTY_PINK

  • ROSEATE_SPOONBILL

    -
    public static final float ROSEATE_SPOONBILL
    -
    This color constant "Roseate Spoonbill" has RGBA8888 code C87DA0FF, L 0.6, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.96592754, saturation 0.13739227, and chroma 0.091942206. - It can be represented as a packed float with the constant -0x1.fb1732p125F. +
    public static final float ROSEATE_SPOONBILL
    +
    This color constant "Roseate Spoonbill" has RGBA8888 code C87DA0FF, L 0.6039216, A 0.54509807, B 0.49019608, alpha 1.0, hue 0.9737039, saturation 0.40551752, and chroma 0.091942206. + It can be represented as a packed float with the constant -0x1.fb1734p125F.
                   @ 
          @  @  @  @ 
    @@ -4517,8 +4517,8 @@ 

    ROSEATE_SPOONBILL

  • THULIAN_PINK

    -
    public static final float THULIAN_PINK
    -
    This color constant "Thulian Pink" has RGBA8888 code C35A91FF, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.95994633, saturation 0.24846612, and chroma 0.1411665. +
    public static final float THULIAN_PINK
    +
    This color constant "Thulian Pink" has RGBA8888 code C35A91FF, L 0.52156866, A 0.5686275, B 0.48235294, alpha 1.0, hue 0.96519506, saturation 0.51941097, and chroma 0.1411665. It can be represented as a packed float with the constant -0x1.f7230ap125F.
                   @ 
    @@ -4538,8 +4538,8 @@ 

    THULIAN_PINK

  • BROWN_VELVET

    -
    public static final float BROWN_VELVET
    -
    This color constant "Brown Velvet" has RGBA8888 code 4B2837FF, L 0.2, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.96857655, saturation 0.14266118, and chroma 0.059754133. +
    public static final float BROWN_VELVET
    +
    This color constant "Brown Velvet" has RGBA8888 code 4B2837FF, L 0.2, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.98019654, saturation 0.42432937, and chroma 0.059754133. It can be represented as a packed float with the constant -0x1.fd0e66p125F.
                   @ 
    @@ -4559,9 +4559,9 @@ 

    BROWN_VELVET

  • NIGHTSHADE

    -
    public static final float NIGHTSHADE
    -
    This color constant "Nightshade" has RGBA8888 code 321623FF, L 0.11764706, A 0.5294118, B 0.49411765, alpha 1.0, hue 0.96857655, saturation 0.25154528, and chroma 0.059754133. - It can be represented as a packed float with the constant -0x1.fd0e3cp125F. +
    public static final float NIGHTSHADE
    +
    This color constant "Nightshade" has RGBA8888 code 321623FF, L 0.11372549, A 0.5254902, B 0.49411765, alpha 1.0, hue 0.97740346, saturation 0.5050763, and chroma 0.052115876. + It can be represented as a packed float with the constant -0x1.fd0c3ap125F.
                   @ 
          @  @  @  @ 
    @@ -4580,8 +4580,8 @@ 

    NIGHTSHADE

  • SCRIBE_INK

    -
    public static final float SCRIBE_INK
    -
    This color constant "Scribe Ink" has RGBA8888 code 280A1EFF, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9378436, saturation 0.51980007, and chroma 0.071815535. +
    public static final float SCRIBE_INK
    +
    This color constant "Scribe Ink" has RGBA8888 code 280A1EFF, L 0.078431375, A 0.53333336, B 0.4862745, alpha 1.0, hue 0.9488043, saturation 0.79056937, and chroma 0.071815535. It can be represented as a packed float with the constant -0x1.f91028p125F.
                   @ 
    @@ -4601,8 +4601,8 @@ 

    SCRIBE_INK

  • VARNISH

    -
    public static final float VARNISH
    -
    This color constant "Varnish" has RGBA8888 code 401811FF, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.08601887, saturation 0.3516231, and chroma 0.068331465. +
    public static final float VARNISH
    +
    This color constant "Varnish" has RGBA8888 code 401811FF, L 0.13725491, A 0.5294118, B 0.5176471, alpha 1.0, hue 0.088913955, saturation 0.62893206, and chroma 0.068331465. It can be represented as a packed float with the constant -0x1.090e46p126F.
                   @ 
    @@ -4622,8 +4622,8 @@ 

    VARNISH

  • CEDAR_WOOD

    -
    public static final float CEDAR_WOOD
    -
    This color constant "Cedar Wood" has RGBA8888 code 621800FF, L 0.2, A 0.54901963, B 0.53333336, alpha 1.0, hue 0.095056064, saturation 0.8144353, and chroma 0.11809544. +
    public static final float CEDAR_WOOD
    +
    This color constant "Cedar Wood" has RGBA8888 code 621800FF, L 0.2, A 0.54901963, B 0.53333336, alpha 1.0, hue 0.09638812, saturation 0.9035079, and chroma 0.11809544. It can be represented as a packed float with the constant -0x1.111866p126F.
                   @ 
    @@ -4643,8 +4643,8 @@ 

    CEDAR_WOOD

  • HOT_SAUCE

    -
    public static final float HOT_SAUCE
    -
    This color constant "Hot Sauce" has RGBA8888 code A5140AFF, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.08136994, saturation 0.8018141, and chroma 0.1836353. +
    public static final float HOT_SAUCE
    +
    This color constant "Hot Sauce" has RGBA8888 code A5140AFF, L 0.33333334, A 0.5803922, B 0.54509807, alpha 1.0, hue 0.0826307, saturation 0.94850093, and chroma 0.1836353. It can be represented as a packed float with the constant -0x1.1728aap126F.
                   @ 
    @@ -4664,9 +4664,9 @@ 

    HOT_SAUCE

  • LURID_RED

    -
    public static final float LURID_RED
    -
    This color constant "Lurid Red" has RGBA8888 code DA2010FF, L 0.4509804, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.08299518, saturation 0.7767863, and chroma 0.21173172. - It can be represented as a packed float with the constant -0x1.1b2ee6p126F. +
    public static final float LURID_RED
    +
    This color constant "Lurid Red" has RGBA8888 code DA2010FF, L 0.44705883, A 0.5921569, B 0.5529412, alpha 1.0, hue 0.084052734, saturation 0.89628667, and chroma 0.21173172. + It can be represented as a packed float with the constant -0x1.1b2ee4p126F.
                   @ 
          @  @  @  @ 
    @@ -4685,8 +4685,8 @@ 

    LURID_RED

  • BRICK

    -
    public static final float BRICK
    -
    This color constant "Brick" has RGBA8888 code D5524AFF, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.07195936, saturation 0.3226597, and chroma 0.15199278. +
    public static final float BRICK
    +
    This color constant "Brick" has RGBA8888 code D5524AFF, L 0.5137255, A 0.5686275, B 0.53333336, alpha 1.0, hue 0.073790275, saturation 0.60073465, and chroma 0.15199278. It can be represented as a packed float with the constant -0x1.112306p126F.
                   @ 
    @@ -4706,9 +4706,9 @@ 

    BRICK

  • BRIGHT_RED

    -
    public static final float BRIGHT_RED
    -
    This color constant "Bright Red" has RGBA8888 code FF3C0AFF, L 0.54509807, A 0.5921569, B 0.5647059, alpha 1.0, hue 0.097439915, saturation 0.844288, and chroma 0.22432896. - It can be represented as a packed float with the constant -0x1.212f16p126F. +
    public static final float BRIGHT_RED
    +
    This color constant "Bright Red" has RGBA8888 code FF3C0AFF, L 0.54901963, A 0.5921569, B 0.5647059, alpha 1.0, hue 0.09809959, saturation 0.9803628, and chroma 0.22432896. + It can be represented as a packed float with the constant -0x1.212f18p126F.
                   @ 
          @  @  @  @ 
    @@ -4727,9 +4727,9 @@ 

    BRIGHT_RED

  • EMBERS

    -
    public static final float EMBERS
    -
    This color constant "Embers" has RGBA8888 code F55A32FF, L 0.57254905, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10581406, saturation 0.668431, and chroma 0.1836353. - It can be represented as a packed float with the constant -0x1.1d2524p126F. +
    public static final float EMBERS
    +
    This color constant "Embers" has RGBA8888 code F55A32FF, L 0.5764706, A 0.57254905, B 0.5568628, alpha 1.0, hue 0.10637331, saturation 0.86455137, and chroma 0.1836353. + It can be represented as a packed float with the constant -0x1.1d2526p126F.
                   @ 
          @  @  @  @ 
    @@ -4748,9 +4748,9 @@ 

    EMBERS

  • SALMON

    -
    public static final float SALMON
    -
    This color constant "Salmon" has RGBA8888 code FF6262FF, L 0.6117647, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06254671, saturation 0.8039996, and chroma 0.17337766. - It can be represented as a packed float with the constant -0x1.112938p126F. +
    public static final float SALMON
    +
    This color constant "Salmon" has RGBA8888 code FF6262FF, L 0.6156863, A 0.5803922, B 0.53333336, alpha 1.0, hue 0.06443131, saturation 0.9722263, and chroma 0.17337766. + It can be represented as a packed float with the constant -0x1.11293ap126F.
                   @ 
          @  @  @  @ 
    @@ -4769,9 +4769,9 @@ 

    SALMON

  • TAXICAB_YELLOW

    -
    public static final float TAXICAB_YELLOW
    -
    This color constant "Taxicab Yellow" has RGBA8888 code F6BD31FF, L 0.77254903, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24593177, saturation 0.6745706, and chroma 0.15239382. - It can be represented as a packed float with the constant -0x1.27018ap126F. +
    public static final float TAXICAB_YELLOW
    +
    This color constant "Taxicab Yellow" has RGBA8888 code F6BD31FF, L 0.78039217, A 0.5019608, B 0.5764706, alpha 1.0, hue 0.24205942, saturation 0.8706515, and chroma 0.15239382. + It can be represented as a packed float with the constant -0x1.27018ep126F.
                   @ 
          @  @  @  @ 
    @@ -4790,9 +4790,9 @@ 

    TAXICAB_YELLOW

  • APRICOT

    -
    public static final float APRICOT
    -
    This color constant "Apricot" has RGBA8888 code FFA53CFF, L 0.7294118, A 0.5254902, B 0.5686275, alpha 1.0, hue 0.19341156, saturation 0.70395154, and chroma 0.14584495. - It can be represented as a packed float with the constant -0x1.230d74p126F. +
    public static final float APRICOT
    +
    This color constant "Apricot" has RGBA8888 code FFA53CFF, L 0.7372549, A 0.5254902, B 0.5686275, alpha 1.0, hue 0.19098291, saturation 0.9904209, and chroma 0.14584495. + It can be represented as a packed float with the constant -0x1.230d78p126F.
                   @ 
          @  @  @  @ 
    @@ -4811,9 +4811,9 @@ 

    APRICOT

  • BURNT_YELLOW

    -
    public static final float BURNT_YELLOW
    -
    This color constant "Burnt Yellow" has RGBA8888 code D79B0FFF, L 0.65882355, A 0.5058824, B 0.57254905, alpha 1.0, hue 0.23712316, saturation 0.76290655, and chroma 0.14500555. - It can be represented as a packed float with the constant -0x1.25035p126F. +
    public static final float BURNT_YELLOW
    +
    This color constant "Burnt Yellow" has RGBA8888 code D79B0FFF, L 0.6627451, A 0.5058824, B 0.57254905, alpha 1.0, hue 0.23330018, saturation 0.9319499, and chroma 0.14500555. + It can be represented as a packed float with the constant -0x1.250352p126F.
                   @ 
          @  @  @  @ 
    @@ -4832,8 +4832,8 @@ 

    BURNT_YELLOW

  • DRY_PEPPER

    -
    public static final float DRY_PEPPER
    -
    This color constant "Dry Pepper" has RGBA8888 code DA6E0AFF, L 0.5647059, A 0.5411765, B 0.5647059, alpha 1.0, hue 0.15979148, saturation 0.77262974, and chroma 0.15279381. +
    public static final float DRY_PEPPER
    +
    This color constant "Dry Pepper" has RGBA8888 code DA6E0AFF, L 0.5647059, A 0.5411765, B 0.5647059, alpha 1.0, hue 0.15858527, saturation 0.9203844, and chroma 0.15279381. It can be represented as a packed float with the constant -0x1.21152p126F.
                   @ 
    @@ -4853,8 +4853,8 @@ 

    DRY_PEPPER

  • REDWOOD

    -
    public static final float REDWOOD
    -
    This color constant "Redwood" has RGBA8888 code B45A00FF, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15767807, saturation 0.7703894, and chroma 0.13542919. +
    public static final float REDWOOD
    +
    This color constant "Redwood" has RGBA8888 code B45A00FF, L 0.46666667, A 0.5372549, B 0.5568628, alpha 1.0, hue 0.15640444, saturation 0.9245003, and chroma 0.13542919. It can be represented as a packed float with the constant -0x1.1d12eep126F.
                   @ 
    @@ -4874,8 +4874,8 @@ 

    REDWOOD

  • KOA

    -
    public static final float KOA
    -
    This color constant "Koa" has RGBA8888 code A04B05FF, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15239218, saturation 0.81816477, and chroma 0.12896542. +
    public static final float KOA
    +
    This color constant "Koa" has RGBA8888 code A04B05FF, L 0.40392157, A 0.5372549, B 0.5529412, alpha 1.0, hue 0.15127131, saturation 0.9299811, and chroma 0.12896542. It can be represented as a packed float with the constant -0x1.1b12cep126F.
                   @ 
    @@ -4895,8 +4895,8 @@ 

    KOA

  • OCHRE

    -
    public static final float OCHRE
    -
    This color constant "Ochre" has RGBA8888 code 5F3214FF, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15858527, saturation 0.5838377, and chroma 0.079095535. +
    public static final float OCHRE
    +
    This color constant "Ochre" has RGBA8888 code 5F3214FF, L 0.24313726, A 0.52156866, B 0.53333336, alpha 1.0, hue 0.15640444, saturation 0.8320503, and chroma 0.079095535. It can be represented as a packed float with the constant -0x1.110a7cp126F.
                   @ 
    @@ -4916,9 +4916,9 @@ 

    OCHRE

  • DULL_GREEN

    -
    public static final float DULL_GREEN
    -
    This color constant "Dull Green" has RGBA8888 code 53500AFF, L 0.30588236, A 0.48235294, B 0.54509807, alpha 1.0, hue 0.30935085, saturation 0.700948, and chroma 0.096477255. - It can be represented as a packed float with the constant -0x1.16f69cp126F. +
    public static final float DULL_GREEN
    +
    This color constant "Dull Green" has RGBA8888 code 53500AFF, L 0.3019608, A 0.48235294, B 0.5411765, alpha 1.0, hue 0.30549568, saturation 0.86701477, and chroma 0.08924734. + It can be represented as a packed float with the constant -0x1.14f69ap126F.
                   @ 
          @  @  @  @ 
    @@ -4937,8 +4937,8 @@ 

    DULL_GREEN

  • ARMY_GREEN

    -
    public static final float ARMY_GREEN
    -
    This color constant "Army Green" has RGBA8888 code 626200FF, L 0.37254903, A 0.47843137, B 0.54901963, alpha 1.0, hue 0.31596267, saturation 0.7062722, and chroma 0.106691405. +
    public static final float ARMY_GREEN
    +
    This color constant "Army Green" has RGBA8888 code 626200FF, L 0.37254903, A 0.47843137, B 0.54901963, alpha 1.0, hue 0.30842525, saturation 0.92855924, and chroma 0.106691405. It can be represented as a packed float with the constant -0x1.18f4bep126F.
                   @ 
    @@ -4958,8 +4958,8 @@ 

    ARMY_GREEN

  • DRIFTWOOD

    -
    public static final float DRIFTWOOD
    -
    This color constant "Driftwood" has RGBA8888 code 8C805AFF, L 0.5137255, A 0.49803922, B 0.5254902, alpha 1.0, hue 0.26221767, saturation 0.12760368, and chroma 0.050931267. +
    public static final float DRIFTWOOD
    +
    This color constant "Driftwood" has RGBA8888 code 8C805AFF, L 0.5137255, A 0.49803922, B 0.5254902, alpha 1.0, hue 0.25, saturation 0.4117647, and chroma 0.050931267. It can be represented as a packed float with the constant -0x1.0cff06p126F.
                   @ 
    @@ -4979,9 +4979,9 @@ 

    DRIFTWOOD

  • DRY_BRUSH

    -
    public static final float DRY_BRUSH
    -
    This color constant "Dry Brush" has RGBA8888 code AC9400FF, L 0.5882353, A 0.4862745, B 0.5686275, alpha 1.0, hue 0.28142345, saturation 0.77671087, and chroma 0.13942632. - It can be represented as a packed float with the constant -0x1.22f92cp126F. +
    public static final float DRY_BRUSH
    +
    This color constant "Dry Brush" has RGBA8888 code AC9400FF, L 0.5921569, A 0.4862745, B 0.5686275, alpha 1.0, hue 0.27629608, saturation 0.96043617, and chroma 0.13942632. + It can be represented as a packed float with the constant -0x1.22f92ep126F.
                   @ 
          @  @  @  @ 
    @@ -5000,9 +5000,9 @@ 

    DRY_BRUSH

  • MUSH

    -
    public static final float MUSH
    -
    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.6666667, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.30842525, saturation 0.8074922, and chroma 0.1632233. - It can be represented as a packed float with the constant -0x1.26f154p126F. +
    public static final float MUSH
    +
    This color constant "Mush" has RGBA8888 code B1B10AFF, L 0.6745098, A 0.47058824, B 0.5764706, alpha 1.0, hue 0.3035705, saturation 0.96316457, and chroma 0.1632233. + It can be represented as a packed float with the constant -0x1.26f158p126F.
                   @ 
          @  @  @  @ 
    @@ -5021,9 +5021,9 @@ 

    MUSH

  • BANANA_PUDDING

    -
    public static final float BANANA_PUDDING
    -
    This color constant "Banana Pudding" has RGBA8888 code E6D55AFF, L 0.8117647, A 0.48235294, B 0.5647059, alpha 1.0, hue 0.29236877, saturation 0.45877856, and chroma 0.1336143. - It can be represented as a packed float with the constant -0x1.20f79ep126F. +
    public static final float BANANA_PUDDING
    +
    This color constant "Banana Pudding" has RGBA8888 code E6D55AFF, L 0.8235294, A 0.48235294, B 0.5647059, alpha 1.0, hue 0.2867793, saturation 0.7128265, and chroma 0.1336143. + It can be represented as a packed float with the constant -0x1.20f7a4p126F.
                   @ 
          @  @  @  @ 
    @@ -5042,9 +5042,9 @@ 

    BANANA_PUDDING

  • SAFFRON

    -
    public static final float SAFFRON
    -
    This color constant "Saffron" has RGBA8888 code FFD510FF, L 0.83137256, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27457327, saturation 0.8132536, and chroma 0.17789528. - It can be represented as a packed float with the constant -0x1.2cf9a8p126F. +
    public static final float SAFFRON
    +
    This color constant "Saffron" has RGBA8888 code FFD510FF, L 0.84313726, A 0.4862745, B 0.5882353, alpha 1.0, hue 0.27065513, saturation 0.9467276, and chroma 0.17789528. + It can be represented as a packed float with the constant -0x1.2cf9aep126F.
                   @ 
          @  @  @  @ 
    @@ -5063,9 +5063,9 @@ 

    SAFFRON

  • PENCIL_YELLOW

    -
    public static final float PENCIL_YELLOW
    -
    This color constant "Pencil Yellow" has RGBA8888 code FFEA4AFF, L 0.88235295, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.29171178, saturation 0.62957466, and chroma 0.1658202. - It can be represented as a packed float with the constant -0x1.28f5c2p126F. +
    public static final float PENCIL_YELLOW
    +
    This color constant "Pencil Yellow" has RGBA8888 code FFEA4AFF, L 0.89411765, A 0.47843137, B 0.5803922, alpha 1.0, hue 0.28720093, saturation 0.9385666, and chroma 0.1658202. + It can be represented as a packed float with the constant -0x1.28f5c8p126F.
                   @ 
          @  @  @  @ 
    @@ -5084,9 +5084,9 @@ 

    PENCIL_YELLOW

  • CHARTREUSE

    -
    public static final float CHARTREUSE
    -
    This color constant "Chartreuse" has RGBA8888 code C8FF41FF, L 0.8862745, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34942675, saturation 0.9817451, and chroma 0.2070681. - It can be represented as a packed float with the constant -0x1.2ae1c4p126F. +
    public static final float CHARTREUSE
    +
    This color constant "Chartreuse" has RGBA8888 code C8FF41FF, L 0.89411765, A 0.4392157, B 0.58431375, alpha 1.0, hue 0.34525383, saturation 1.0441982, and chroma 0.2070681. + It can be represented as a packed float with the constant -0x1.2ae1c8p126F.
                   @ 
          @  @  @  @ 
    @@ -5105,9 +5105,9 @@ 

    CHARTREUSE

  • ABSINTHE

    -
    public static final float ABSINTHE
    -
    This color constant "Absinthe" has RGBA8888 code 9BF046FF, L 0.8156863, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.37081593, saturation 0.6159092, and chroma 0.209995. - It can be represented as a packed float with the constant -0x1.26dbap126F. +
    public static final float ABSINTHE
    +
    This color constant "Absinthe" has RGBA8888 code 9BF046FF, L 0.8235294, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.36663744, saturation 0.8408515, and chroma 0.209995. + It can be represented as a packed float with the constant -0x1.26dba4p126F.
                   @ 
          @  @  @  @ 
    @@ -5126,9 +5126,9 @@ 

    ABSINTHE

  • INFECTION

    -
    public static final float INFECTION
    -
    This color constant "Infection" has RGBA8888 code 96DC19FF, L 0.75686276, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.3624701, saturation 0.743936, and chroma 0.2105755. - It can be represented as a packed float with the constant -0x1.28dd82p126F. +
    public static final float INFECTION
    +
    This color constant "Infection" has RGBA8888 code 96DC19FF, L 0.7647059, A 0.43137255, B 0.5803922, alpha 1.0, hue 0.35831934, saturation 0.9158818, and chroma 0.2105755. + It can be represented as a packed float with the constant -0x1.28dd86p126F.
                   @ 
          @  @  @  @ 
    @@ -5147,9 +5147,9 @@ 

    INFECTION

  • FROG_GREEN

    -
    public static final float FROG_GREEN
    -
    This color constant "Frog Green" has RGBA8888 code 73C805FF, L 0.6784314, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.37081593, saturation 0.78956354, and chroma 0.209995. - It can be represented as a packed float with the constant -0x1.26db5ap126F. +
    public static final float FROG_GREEN
    +
    This color constant "Frog Green" has RGBA8888 code 73C805FF, L 0.68235296, A 0.42745098, B 0.5764706, alpha 1.0, hue 0.36663744, saturation 0.96097314, and chroma 0.209995. + It can be represented as a packed float with the constant -0x1.26db5cp126F.
                   @ 
          @  @  @  @ 
    @@ -5168,8 +5168,8 @@ 

    FROG_GREEN

  • AVOCADO

    -
    public static final float AVOCADO
    -
    This color constant "Avocado" has RGBA8888 code 6AA805FF, L 0.58431375, A 0.4392157, B 0.5686275, alpha 1.0, hue 0.3653732, saturation 0.7637348, and chroma 0.18263547. +
    public static final float AVOCADO
    +
    This color constant "Avocado" has RGBA8888 code 6AA805FF, L 0.58431375, A 0.4392157, B 0.5686275, alpha 1.0, hue 0.36058098, saturation 0.9563571, and chroma 0.18263547. It can be represented as a packed float with the constant -0x1.22e12ap126F.
                   @ 
    @@ -5189,8 +5189,8 @@ 

    AVOCADO

  • WOODLANDS

    -
    public static final float WOODLANDS
    -
    This color constant "Woodlands" has RGBA8888 code 3C6E14FF, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.375, saturation 0.63123345, and chroma 0.1381068. +
    public static final float WOODLANDS
    +
    This color constant "Woodlands" has RGBA8888 code 3C6E14FF, L 0.3764706, A 0.4509804, B 0.54901963, alpha 1.0, hue 0.3686421, saturation 0.90727216, and chroma 0.1381068. It can be represented as a packed float with the constant -0x1.18e6cp126F.
                   @ 
    @@ -5210,9 +5210,9 @@ 

    WOODLANDS

  • DARK_PINE

    -
    public static final float DARK_PINE
    -
    This color constant "Dark Pine" has RGBA8888 code 283405FF, L 0.1764706, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3636593, saturation 0.52099174, and chroma 0.07753685. - It can be represented as a packed float with the constant -0x1.0ef25ap126F. +
    public static final float DARK_PINE
    +
    This color constant "Dark Pine" has RGBA8888 code 283405FF, L 0.17254902, A 0.4745098, B 0.5294118, alpha 1.0, hue 0.3524291, saturation 0.8695652, and chroma 0.07753685. + It can be represented as a packed float with the constant -0x1.0ef258p126F.
                   @ 
          @  @  @  @ 
    @@ -5231,8 +5231,8 @@ 

    DARK_PINE

  • MOSS_GREEN

    -
    public static final float MOSS_GREEN
    -
    This color constant "Moss Green" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.38294512, saturation 0.6363817, and chroma 0.11062346. +
    public static final float MOSS_GREEN
    +
    This color constant "Moss Green" has RGBA8888 code 204608FF, L 0.22745098, A 0.45882353, B 0.5372549, alpha 1.0, hue 0.375, saturation 0.94280905, and chroma 0.11062346. It can be represented as a packed float with the constant -0x1.12ea74p126F.
                   @ 
    @@ -5252,8 +5252,8 @@ 

    MOSS_GREEN

  • FERN_GREEN

    -
    public static final float FERN_GREEN
    -
    This color constant "Fern Green" has RGBA8888 code 0C5C0CFF, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.40522522, saturation 0.9969778, and chroma 0.14626285. +
    public static final float FERN_GREEN
    +
    This color constant "Fern Green" has RGBA8888 code 0C5C0CFF, L 0.29411766, A 0.4392157, B 0.5411765, alpha 1.0, hue 0.399282, saturation 0.95390135, and chroma 0.14626285. It can be represented as a packed float with the constant -0x1.14e096p126F.
                   @ 
    @@ -5273,8 +5273,8 @@ 

    FERN_GREEN

  • FOREST_GLEN

    -
    public static final float FOREST_GLEN
    -
    This color constant "Forest Glen" has RGBA8888 code 149605FF, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.40057325, saturation 0.9817451, and chroma 0.2070681. +
    public static final float FOREST_GLEN
    +
    This color constant "Forest Glen" has RGBA8888 code 149605FF, L 0.4862745, A 0.41568628, B 0.56078434, alpha 1.0, hue 0.39636543, saturation 0.9778058, and chroma 0.2070681. It can be represented as a packed float with the constant -0x1.1ed4f8p126F.
                   @ 
    @@ -5294,9 +5294,9 @@ 

    FOREST_GLEN

  • MALACHITE

    -
    public static final float MALACHITE
    -
    This color constant "Malachite" has RGBA8888 code 0AD70AFF, L 0.6862745, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.40182015, saturation 0.99775034, and chroma 0.26337513. - It can be represented as a packed float with the constant -0x1.26c95ep126F. +
    public static final float MALACHITE
    +
    This color constant "Malachite" has RGBA8888 code 0AD70AFF, L 0.6901961, A 0.39215687, B 0.5764706, alpha 1.0, hue 0.39851815, saturation 0.98825276, and chroma 0.26337513. + It can be represented as a packed float with the constant -0x1.26c96p126F.
                   @ 
          @  @  @  @ 
    @@ -5315,9 +5315,9 @@ 

    MALACHITE

  • APPLE_GREEN

    -
    public static final float APPLE_GREEN
    -
    This color constant "Apple Green" has RGBA8888 code 14E60AFF, L 0.7294118, A 0.3882353, B 0.5803922, alpha 1.0, hue 0.4007443, saturation 0.96435034, and chroma 0.27427328. - It can be represented as a packed float with the constant -0x1.28c774p126F. +
    public static final float APPLE_GREEN
    +
    This color constant "Apple Green" has RGBA8888 code 14E60AFF, L 0.7372549, A 0.3882353, B 0.5803922, alpha 1.0, hue 0.3975709, saturation 0.9722222, and chroma 0.27427328. + It can be represented as a packed float with the constant -0x1.28c778p126F.
                   @ 
          @  @  @  @ 
    @@ -5336,9 +5336,9 @@ 

    APPLE_GREEN

  • CELERY

    -
    public static final float CELERY
    -
    This color constant "Celery" has RGBA8888 code 7DFF73FF, L 0.84313726, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39695174, saturation 0.8276294, and chroma 0.20078278. - It can be represented as a packed float with the constant -0x1.1ed7aep126F. +
    public static final float CELERY
    +
    This color constant "Celery" has RGBA8888 code 7DFF73FF, L 0.85490197, A 0.41960785, B 0.56078434, alpha 1.0, hue 0.39260027, saturation 1.0044117, and chroma 0.20078278. + It can be represented as a packed float with the constant -0x1.1ed7b4p126F.
                   @ 
          @  @  @  @ 
    @@ -5357,9 +5357,9 @@ 

    CELERY

  • MINT_GREEN

    -
    public static final float MINT_GREEN
    -
    This color constant "Mint Green" has RGBA8888 code 4BF05AFF, L 0.7764706, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.40565702, saturation 0.682674, and chroma 0.23076649. - It can be represented as a packed float with the constant -0x1.20cf8cp126F. +
    public static final float MINT_GREEN
    +
    This color constant "Mint Green" has RGBA8888 code 4BF05AFF, L 0.78431374, A 0.40392157, B 0.5647059, alpha 1.0, hue 0.4019004, saturation 0.7842902, and chroma 0.23076649. + It can be represented as a packed float with the constant -0x1.20cf9p126F.
                   @ 
          @  @  @  @ 
    @@ -5378,9 +5378,9 @@ 

    MINT_GREEN

  • EMERALD

    -
    public static final float EMERALD
    -
    This color constant "Emerald" has RGBA8888 code 00C514FF, L 0.6313726, A 0.4, B 0.57254905, alpha 1.0, hue 0.40009674, saturation 0.984562, and chroma 0.24612474. - It can be represented as a packed float with the constant -0x1.24cd42p126F. +
    public static final float EMERALD
    +
    This color constant "Emerald" has RGBA8888 code 00C514FF, L 0.63529414, A 0.4, B 0.57254905, alpha 1.0, hue 0.3965574, saturation 0.9812699, and chroma 0.24612474. + It can be represented as a packed float with the constant -0x1.24cd44p126F.
                   @ 
          @  @  @  @ 
    @@ -5399,9 +5399,9 @@ 

    EMERALD

  • PRASE

    -
    public static final float PRASE
    -
    This color constant "Prase" has RGBA8888 code 05B450FF, L 0.5882353, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4218265, saturation 0.9324576, and chroma 0.19048727. - It can be represented as a packed float with the constant -0x1.16d52cp126F. +
    public static final float PRASE
    +
    This color constant "Prase" has RGBA8888 code 05B450FF, L 0.5921569, A 0.41568628, B 0.54509807, alpha 1.0, hue 0.4173693, saturation 0.9127084, and chroma 0.19048727. + It can be represented as a packed float with the constant -0x1.16d52ep126F.
                   @ 
          @  @  @  @ 
    @@ -5420,8 +5420,8 @@ 

    PRASE

  • EUCALYPTUS

    -
    public static final float EUCALYPTUS
    -
    This color constant "Eucalyptus" has RGBA8888 code 1C8C4EFF, L 0.46666667, A 0.43529412, B 0.5294118, alpha 1.0, hue 0.43210676, saturation 0.8010974, and chroma 0.1415982. +
    public static final float EUCALYPTUS
    +
    This color constant "Eucalyptus" has RGBA8888 code 1C8C4EFF, L 0.46666667, A 0.43529412, B 0.5294118, alpha 1.0, hue 0.42620972, saturation 0.8726119, and chroma 0.1415982. It can be represented as a packed float with the constant -0x1.0edeeep126F.
                   @ 
    @@ -5441,9 +5441,9 @@ 

    EUCALYPTUS

  • ZUCCHINI

    -
    public static final float ZUCCHINI
    -
    This color constant "Zucchini" has RGBA8888 code 123832FF, L 0.18431373, A 0.47058824, B 0.49803922, alpha 1.0, hue 0.5105898, saturation 0.7379592, and chroma 0.058723815. - It can be represented as a packed float with the constant -0x1.fef05ep125F. +
    public static final float ZUCCHINI
    +
    This color constant "Zucchini" has RGBA8888 code 123832FF, L 0.18039216, A 0.4745098, B 0.49803922, alpha 1.0, hue 0.49998704, saturation 0.7058824, and chroma 0.050931267. + It can be represented as a packed float with the constant -0x1.fef25cp125F.
                   @ 
          @  @  @  @ 
    @@ -5462,8 +5462,8 @@ 

    ZUCCHINI

  • SOFT_TEAL

    -
    public static final float SOFT_TEAL
    -
    This color constant "Soft Teal" has RGBA8888 code 129880FF, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.49488065, saturation 0.9107692, and chroma 0.12115674. +
    public static final float SOFT_TEAL
    +
    This color constant "Soft Teal" has RGBA8888 code 129880FF, L 0.5176471, A 0.4392157, B 0.5019608, alpha 1.0, hue 0.4894102, saturation 0.93958104, and chroma 0.12115674. It can be represented as a packed float with the constant -0x1.00e108p126F.
                   @ 
    @@ -5483,9 +5483,9 @@ 

    SOFT_TEAL

  • MEDIUM_TEAL

    -
    public static final float MEDIUM_TEAL
    -
    This color constant "Medium Teal" has RGBA8888 code 06C491FF, L 0.6509804, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.47172436, saturation 0.9115982, and chroma 0.15477823. - It can be represented as a packed float with the constant -0x1.06d94cp126F. +
    public static final float MEDIUM_TEAL
    +
    This color constant "Medium Teal" has RGBA8888 code 06C491FF, L 0.654902, A 0.42352942, B 0.5137255, alpha 1.0, hue 0.46697098, saturation 0.94714576, and chroma 0.15477823. + It can be represented as a packed float with the constant -0x1.06d94ep126F.
                   @ 
          @  @  @  @ 
    @@ -5504,9 +5504,9 @@ 

    MEDIUM_TEAL

  • SPRING_GREEN

    -
    public static final float SPRING_GREEN
    -
    This color constant "Spring Green" has RGBA8888 code 00DE6AFF, L 0.7176471, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42491466, saturation 0.94792074, and chroma 0.21487926. - It can be represented as a packed float with the constant -0x1.18cf6ep126F. +
    public static final float SPRING_GREEN
    +
    This color constant "Spring Green" has RGBA8888 code 00DE6AFF, L 0.72156864, A 0.40392157, B 0.54901963, alpha 1.0, hue 0.42098877, saturation 0.9252436, and chroma 0.21487926. + It can be represented as a packed float with the constant -0x1.18cf7p126F.
                   @ 
          @  @  @  @ 
    @@ -5525,9 +5525,9 @@ 

    SPRING_GREEN

  • TURQUOISE

    -
    public static final float TURQUOISE
    -
    This color constant "Turquoise" has RGBA8888 code 2DEBA8FF, L 0.77254903, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.46014452, saturation 0.83749604, and chroma 0.17337766. - It can be represented as a packed float with the constant -0x1.0ad58ap126F. +
    public static final float TURQUOISE
    +
    This color constant "Turquoise" has RGBA8888 code 2DEBA8FF, L 0.78039217, A 0.41568628, B 0.52156866, alpha 1.0, hue 0.45571566, saturation 0.89144206, and chroma 0.17337766. + It can be represented as a packed float with the constant -0x1.0ad58ep126F.
                   @ 
          @  @  @  @ 
    @@ -5546,9 +5546,9 @@ 

    TURQUOISE

  • SEAFOAM

    -
    public static final float SEAFOAM
    -
    This color constant "Seafoam" has RGBA8888 code 3CFEA5FF, L 0.827451, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.44880432, saturation 0.81632656, and chroma 0.18528971. - It can be represented as a packed float with the constant -0x1.0ed3a6p126F. +
    public static final float SEAFOAM
    +
    This color constant "Seafoam" has RGBA8888 code 3CFEA5FF, L 0.8352941, A 0.4117647, B 0.5294118, alpha 1.0, hue 0.4445043, saturation 0.9753916, and chroma 0.18528971. + It can be represented as a packed float with the constant -0x1.0ed3aap126F.
                   @ 
          @  @  @  @ 
    @@ -5567,9 +5567,9 @@ 

    SEAFOAM

  • VARISCITE

    -
    public static final float VARISCITE
    -
    This color constant "Variscite" has RGBA8888 code 6AFFCDFF, L 0.85490197, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47740343, saturation 0.80115366, and chroma 0.1381068. - It can be represented as a packed float with the constant -0x1.04ddb4p126F. +
    public static final float VARISCITE
    +
    This color constant "Variscite" has RGBA8888 code 6AFFCDFF, L 0.8666667, A 0.43137255, B 0.50980395, alpha 1.0, hue 0.47218934, saturation 1.0154516, and chroma 0.1381068. + It can be represented as a packed float with the constant -0x1.04ddbap126F.
                   @ 
          @  @  @  @ 
    @@ -5588,9 +5588,9 @@ 

    VARISCITE

  • REFRESHING_MIST

    -
    public static final float REFRESHING_MIST
    -
    This color constant "Refreshing Mist" has RGBA8888 code 91EBFFFF, L 0.84313726, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59551346, saturation 0.88296545, and chroma 0.08992863. - It can be represented as a packed float with the constant -0x1.f2edaep125F. +
    public static final float REFRESHING_MIST
    +
    This color constant "Refreshing Mist" has RGBA8888 code 91EBFFFF, L 0.8509804, A 0.4627451, B 0.4745098, alpha 1.0, hue 0.59359556, saturation 0.94057864, and chroma 0.08992863. + It can be represented as a packed float with the constant -0x1.f2edb2p125F.
                   @ 
          @  @  @  @ 
    @@ -5609,9 +5609,9 @@ 

    REFRESHING_MIST

  • SHINING_SKY

    -
    public static final float SHINING_SKY
    -
    This color constant "Shining Sky" has RGBA8888 code 55E6FFFF, L 0.8, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5843938, saturation 0.8966475, and chroma 0.13131043. - It can be represented as a packed float with the constant -0x1.eee398p125F. +
    public static final float SHINING_SKY
    +
    This color constant "Shining Sky" has RGBA8888 code 55E6FFFF, L 0.80784315, A 0.44313726, B 0.46666667, alpha 1.0, hue 0.5826307, saturation 0.97724336, and chroma 0.13131043. + It can be represented as a packed float with the constant -0x1.eee39cp125F.
                   @ 
          @  @  @  @ 
    @@ -5630,9 +5630,9 @@ 

    SHINING_SKY

  • STEAM

    -
    public static final float STEAM
    -
    This color constant "Steam" has RGBA8888 code 7DD7F0FF, L 0.7764706, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6063733, saturation 0.5221653, and chroma 0.0945603. - It can be represented as a packed float with the constant -0x1.f0ed8cp125F. +
    public static final float STEAM
    +
    This color constant "Steam" has RGBA8888 code 7DD7F0FF, L 0.78431374, A 0.4627451, B 0.47058824, alpha 1.0, hue 0.6052204, saturation 0.71260965, and chroma 0.0945603. + It can be represented as a packed float with the constant -0x1.f0ed9p125F.
                   @ 
          @  @  @  @ 
    @@ -5651,9 +5651,9 @@ 

    STEAM

  • ROBIN_EGG_BLUE

    -
    public static final float ROBIN_EGG_BLUE
    -
    This color constant "Robin Egg Blue" has RGBA8888 code 08DED5FF, L 0.7490196, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5297675, saturation 0.90882874, and chroma 0.14709508. - It can be represented as a packed float with the constant -0x1.f8db7ep125F. +
    public static final float ROBIN_EGG_BLUE
    +
    This color constant "Robin Egg Blue" has RGBA8888 code 08DED5FF, L 0.7529412, A 0.42745098, B 0.4862745, alpha 1.0, hue 0.5262961, saturation 0.96043617, and chroma 0.14709508. + It can be represented as a packed float with the constant -0x1.f8db8p125F.
                   @ 
          @  @  @  @ 
    @@ -5672,9 +5672,9 @@ 

    ROBIN_EGG_BLUE

  • DENIM_BLUE

    -
    public static final float DENIM_BLUE
    -
    This color constant "Denim Blue" has RGBA8888 code 109CDEFF, L 0.57254905, A 0.45490196, B 0.4392157, alpha 1.0, hue 0.6483954, saturation 0.9083981, and chroma 0.15078327. - It can be represented as a packed float with the constant -0x1.e0e924p125F. +
    public static final float DENIM_BLUE
    +
    This color constant "Denim Blue" has RGBA8888 code 109CDEFF, L 0.57254905, A 0.45882353, B 0.4392157, alpha 1.0, hue 0.65640444, saturation 0.9013878, and chroma 0.14626285. + It can be represented as a packed float with the constant -0x1.e0eb24p125F.
                   @ 
          @  @  @  @ 
    @@ -5693,9 +5693,9 @@ 

    DENIM_BLUE

  • DEEP_TEAL

    -
    public static final float DEEP_TEAL
    -
    This color constant "Deep Teal" has RGBA8888 code 055A5CFF, L 0.30980393, A 0.4627451, B 0.4862745, alpha 1.0, hue 0.55616736, saturation 0.80987656, and chroma 0.079095535. - It can be represented as a packed float with the constant -0x1.f8ec9ep125F. +
    public static final float DEEP_TEAL
    +
    This color constant "Deep Teal" has RGBA8888 code 055A5CFF, L 0.30588236, A 0.4627451, B 0.4862745, alpha 1.0, hue 0.5511957, saturation 0.9035079, and chroma 0.079095535. + It can be represented as a packed float with the constant -0x1.f8ec9cp125F.
                   @ 
          @  @  @  @ 
    @@ -5714,9 +5714,9 @@ 

    DEEP_TEAL