2020-12-02 17:55:59 +01:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: epserv <admin@epserv.ru>
|
2020-12-02 19:19:50 +01:00
|
|
|
Date: Wed, 2 Dec 2020 19:31:20 +0200
|
|
|
|
Subject: [PATCH] Optimise Bukkit's MapPalette
|
2020-12-02 17:55:59 +01:00
|
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/map/MapPalette.java b/src/main/java/org/bukkit/map/MapPalette.java
|
2020-12-03 09:15:07 +01:00
|
|
|
index 95fe3f4d081053a6cf484e4ef07b474f2dc2ab02..418fde209a2c4ce71dbb8e41af32cd87cfc71ed4 100644
|
2020-12-02 17:55:59 +01:00
|
|
|
--- a/src/main/java/org/bukkit/map/MapPalette.java
|
|
|
|
+++ b/src/main/java/org/bukkit/map/MapPalette.java
|
2020-12-02 19:19:50 +01:00
|
|
|
@@ -23,6 +23,8 @@ public final class MapPalette {
|
2020-12-02 17:55:59 +01:00
|
|
|
}
|
2020-12-02 20:41:07 +01:00
|
|
|
|
2020-12-02 19:19:50 +01:00
|
|
|
private static double getDistance(@NotNull Color c1, @NotNull Color c2) {
|
|
|
|
+ // Yatopia start - faster method
|
|
|
|
+ /*
|
|
|
|
double rmean = (c1.getRed() + c2.getRed()) / 2.0;
|
|
|
|
double r = c1.getRed() - c2.getRed();
|
|
|
|
double g = c1.getGreen() - c2.getGreen();
|
2020-12-03 09:15:07 +01:00
|
|
|
@@ -31,6 +33,16 @@ public final class MapPalette {
|
2020-12-02 19:19:50 +01:00
|
|
|
double weightG = 4.0;
|
|
|
|
double weightB = 2 + (255 - rmean) / 256.0;
|
|
|
|
return weightR * r * r + weightG * g * g + weightB * b * b;
|
|
|
|
+ */
|
|
|
|
+ if (c1.getRGB() == c2.getRGB()) {
|
|
|
|
+ return 0.0;
|
|
|
|
+ }
|
|
|
|
+ double r = c1.getRed() - c2.getRed(),
|
|
|
|
+ g = c1.getGreen() - c2.getGreen(),
|
|
|
|
+ b = c1.getBlue() - c2.getBlue(),
|
|
|
|
+ x = (c1.getRed() + c2.getRed()) / 512d + 2d;
|
|
|
|
+ return x * r * r + 4 * g * g + (4.99609375d - x) * b * b;
|
|
|
|
+ // Yatopia end
|
2020-12-02 17:55:59 +01:00
|
|
|
}
|
2020-12-02 20:41:07 +01:00
|
|
|
|
2020-12-02 17:55:59 +01:00
|
|
|
@NotNull
|
2020-12-03 09:15:07 +01:00
|
|
|
@@ -235,19 +247,31 @@ public final class MapPalette {
|
2020-12-02 17:55:59 +01:00
|
|
|
public static byte matchColor(@NotNull Color color) {
|
|
|
|
if (color.getAlpha() < 128) return 0;
|
2020-12-02 20:41:07 +01:00
|
|
|
|
|
|
|
- int index = 0;
|
2020-12-02 19:19:50 +01:00
|
|
|
+ // Yatopia start - binary search first
|
2020-12-03 09:15:07 +01:00
|
|
|
+ int binaryIndex = java.util.Arrays.binarySearch(
|
|
|
|
+ colors,
|
|
|
|
+ color,
|
|
|
|
+ java.util.Comparator.comparingDouble(o -> getDistance(color, o))
|
|
|
|
+ );
|
2020-12-02 19:19:50 +01:00
|
|
|
+ if (binaryIndex != -1) {
|
2020-12-02 17:55:59 +01:00
|
|
|
+ return (byte) (binaryIndex < 128 ? binaryIndex : binaryIndex - 256);
|
2020-12-02 19:19:50 +01:00
|
|
|
+ }
|
|
|
|
+ // Yatopia end
|
|
|
|
+
|
2020-12-02 20:41:07 +01:00
|
|
|
+ short index = 0; // Yatopia
|
2020-12-02 19:19:50 +01:00
|
|
|
double best = -1;
|
2020-12-02 20:41:07 +01:00
|
|
|
|
|
|
|
- for (int i = 4; i < colors.length; i++) {
|
|
|
|
+ for (short i = 4; i < colors.length; i++) { // Yatopia
|
2020-12-02 19:19:50 +01:00
|
|
|
double distance = getDistance(color, colors[i]);
|
|
|
|
if (distance < best || best == -1) {
|
2020-12-02 17:55:59 +01:00
|
|
|
best = distance;
|
|
|
|
index = i;
|
2020-12-03 09:15:07 +01:00
|
|
|
+ if (distance == 0) { break; } // Yatopia
|
2020-12-02 17:55:59 +01:00
|
|
|
}
|
|
|
|
}
|
2020-12-02 20:41:07 +01:00
|
|
|
|
2020-12-02 17:55:59 +01:00
|
|
|
// Minecraft has 143 colors, some of which have negative byte representations
|
|
|
|
- return (byte) (index < 128 ? index : -129 + (index - 127));
|
2020-12-02 19:19:50 +01:00
|
|
|
+ return (byte) (index < 128 ? index : index - 256); // Yatopia
|
2020-12-02 17:55:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|