From 0849f4df5030fc6cb37d7374dfd09ddeb2e778ad Mon Sep 17 00:00:00 2001 From: Vankka Date: Tue, 26 Sep 2023 19:48:39 +0300 Subject: [PATCH 1/3] Add INDEXED_8 ColorLevel --- src/main/java/net/kyori/ansi/ColorLevel.java | 51 +++++++++++++------ .../kyori/ansi/ANSIComponentRendererTest.java | 2 + 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/kyori/ansi/ColorLevel.java b/src/main/java/net/kyori/ansi/ColorLevel.java index 210f55c..1ac5939 100644 --- a/src/main/java/net/kyori/ansi/ColorLevel.java +++ b/src/main/java/net/kyori/ansi/ColorLevel.java @@ -139,19 +139,18 @@ public enum ColorLevel { INDEXED_16 { @Override public @NotNull String determineEscape(final int rgbColor) { - float matchedDistance = Float.MAX_VALUE; - StandardColor match = StandardColor.BLACK; - for (final StandardColor potential : StandardColor.VALUES) { - final float distance = HSV.fromRGB(rgbColor).distance(HSV.fromRGB(potential.color)); - if (distance < matchedDistance) { - match = potential; - matchedDistance = distance; - } - if (distance == 0) { - break; // same colour! whoo! - } - } - return match.index; + return findClosestColorEscape(rgbColor, StandardColor.VALUES_INDEXED16); + } + }, + /** + * 8 color. + * + * @since 1.0.4 + */ + INDEXED_8 { + @Override + public @NotNull String determineEscape(final int rgbColor) { + return findClosestColorEscape(rgbColor, StandardColor.VALUES_INDEXED8); } }; @@ -179,6 +178,7 @@ public enum ColorLevel { case "truecolor": return ColorLevel.TRUE_COLOR; case "indexed256": return ColorLevel.INDEXED_256; case "indexed16": return ColorLevel.INDEXED_16; + case "indexed8": return ColorLevel.INDEXED_8; // In other cases, fall through below } } @@ -225,6 +225,22 @@ public enum ColorLevel { */ public abstract @NotNull String determineEscape(final int rgbColor); + private static String findClosestColorEscape(final int rgbColor, StandardColor[] potentialColors) { + float matchedDistance = Float.MAX_VALUE; + StandardColor match = StandardColor.BLACK; + for (final StandardColor potential : potentialColors) { + final float distance = HSV.fromRGB(rgbColor).distance(HSV.fromRGB(potential.color)); + if (distance < matchedDistance) { + match = potential; + matchedDistance = distance; + } + if (distance == 0) { + break; // same colour! whoo! + } + } + return match.index; + } + private enum StandardColor { BLACK(0x00_00_00, "30"), DARK_RED(0xaa_00_00, "31"), @@ -243,7 +259,8 @@ private enum StandardColor { AQUA(0x55_ff_ff, "96"), WHITE(0xff_ff_ff, "97"); - static final StandardColor[] VALUES; + static final StandardColor[] VALUES_INDEXED16; + static final StandardColor[] VALUES_INDEXED8; final int color; final String index; @@ -254,7 +271,11 @@ private enum StandardColor { } static { - VALUES = StandardColor.values(); + VALUES_INDEXED16 = StandardColor.values(); + + StandardColor[] indexed8 = new StandardColor[8]; + System.arraycopy(StandardColor.values(), 0, indexed8, 0, 8); + VALUES_INDEXED8 = indexed8; } } diff --git a/src/test/java/net/kyori/ansi/ANSIComponentRendererTest.java b/src/test/java/net/kyori/ansi/ANSIComponentRendererTest.java index 6d24aa9..1d2ddbd 100644 --- a/src/test/java/net/kyori/ansi/ANSIComponentRendererTest.java +++ b/src/test/java/net/kyori/ansi/ANSIComponentRendererTest.java @@ -56,6 +56,7 @@ void testColor() { assertEquals("\u001B[38;2;255;85;85mi'm red\u001b[0m", this.render(redAction, ColorLevel.TRUE_COLOR)); assertEquals("\u001B[38;5;9mi'm red\u001b[0m", this.render(redAction, ColorLevel.INDEXED_256)); assertEquals("\u001B[91mi'm red\u001b[0m", this.render(redAction, ColorLevel.INDEXED_16)); + assertEquals("\u001B[31mi'm red\u001b[0m", this.render(redAction, ColorLevel.INDEXED_8)); assertEquals("i'm red", this.render(redAction, ColorLevel.NONE)); final Consumer> pureRedAction = r -> { @@ -67,6 +68,7 @@ void testColor() { assertEquals("\u001B[38;2;255;0;0mi'm very red\u001b[0m", this.render(pureRedAction, ColorLevel.TRUE_COLOR)); assertEquals("\u001B[38;5;196mi'm very red\u001b[0m", this.render(pureRedAction, ColorLevel.INDEXED_256)); assertEquals("\u001B[31mi'm very red\u001b[0m", this.render(pureRedAction, ColorLevel.INDEXED_16)); + assertEquals("\u001B[31mi'm very red\u001b[0m", this.render(pureRedAction, ColorLevel.INDEXED_8)); assertEquals("i'm very red", this.render(pureRedAction, ColorLevel.NONE)); } From ed95449b04842b5589afaee79ba103858c7cdc6e Mon Sep 17 00:00:00 2001 From: Vankka Date: Tue, 26 Sep 2023 20:22:07 +0300 Subject: [PATCH 2/3] Checkstyle fixes --- src/main/java/net/kyori/ansi/ColorLevel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/kyori/ansi/ColorLevel.java b/src/main/java/net/kyori/ansi/ColorLevel.java index 1ac5939..c172a98 100644 --- a/src/main/java/net/kyori/ansi/ColorLevel.java +++ b/src/main/java/net/kyori/ansi/ColorLevel.java @@ -225,7 +225,7 @@ public enum ColorLevel { */ public abstract @NotNull String determineEscape(final int rgbColor); - private static String findClosestColorEscape(final int rgbColor, StandardColor[] potentialColors) { + private static String findClosestColorEscape(final int rgbColor, final StandardColor[] potentialColors) { float matchedDistance = Float.MAX_VALUE; StandardColor match = StandardColor.BLACK; for (final StandardColor potential : potentialColors) { @@ -273,7 +273,7 @@ private enum StandardColor { static { VALUES_INDEXED16 = StandardColor.values(); - StandardColor[] indexed8 = new StandardColor[8]; + final StandardColor[] indexed8 = new StandardColor[8]; System.arraycopy(StandardColor.values(), 0, indexed8, 0, 8); VALUES_INDEXED8 = indexed8; } From a00d4a6eb4e1d614a5a1e1ca140fced038f66051 Mon Sep 17 00:00:00 2001 From: Henri Schubin Date: Wed, 27 Sep 2023 23:29:14 +0300 Subject: [PATCH 3/3] Since 1.1.0 instead of 1.0.4 Co-authored-by: zml --- src/main/java/net/kyori/ansi/ColorLevel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/kyori/ansi/ColorLevel.java b/src/main/java/net/kyori/ansi/ColorLevel.java index c172a98..d0d5f5a 100644 --- a/src/main/java/net/kyori/ansi/ColorLevel.java +++ b/src/main/java/net/kyori/ansi/ColorLevel.java @@ -145,7 +145,7 @@ public enum ColorLevel { /** * 8 color. * - * @since 1.0.4 + * @since 1.1.0 */ INDEXED_8 { @Override