X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Futils%2FColors.java;h=400b073301bb02c3976053c3b4449b51260c5b35;hp=7b8352efbe6d25329794b8bf69a460c28adac436;hb=b6e102a859413285879cecec286f1381db202314;hpb=09e26d2279484b4dfe0de218b05f075362fff4b5 diff --git a/app/src/main/java/net/ktnx/mobileledger/utils/Colors.java b/app/src/main/java/net/ktnx/mobileledger/utils/Colors.java index 7b8352ef..400b0733 100644 --- a/app/src/main/java/net/ktnx/mobileledger/utils/Colors.java +++ b/app/src/main/java/net/ktnx/mobileledger/utils/Colors.java @@ -2,8 +2,6 @@ package net.ktnx.mobileledger.utils; import android.app.Activity; import android.content.res.Resources; -import androidx.annotation.ColorInt; -import androidx.annotation.ColorLong; import android.util.Log; import android.util.TypedValue; @@ -11,6 +9,11 @@ import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.MobileLedgerProfile; +import androidx.annotation.ColorInt; +import androidx.annotation.ColorLong; + +import static java.lang.Math.abs; + public class Colors { public static final int DEFAULT_HUE_DEG = 261; public static @ColorInt @@ -55,13 +58,18 @@ public class Colors { return 0xff000000 | hsvTriplet(hue, saturation, value); } public static @ColorInt + int hslColor(float hue, float saturation, float lightness) { + return 0xff000000 | hslTriplet(hue, saturation, lightness); + } + public static @ColorInt int hsvTriplet(float hue, float saturation, float value) { @ColorLong long result; int r, g, b; - if ((hue < 0) || (hue > 1) || (saturation < 0) || (saturation > 1) || (value < 0) || - (value > 1)) throw new IllegalArgumentException( - "hue, saturation, value and alpha must all be between 0 and 1"); + if ((hue < -0.00005) || (hue > 1.0000005) || (saturation < 0) || (saturation > 1) || + (value < 0) || (value > 1)) throw new IllegalArgumentException(String.format( + "hue, saturation, value and alpha must all be between 0 and 1. Arguments given: " + + "hue=%1.5f, sat=%1.5f, val=%1.5f", hue, saturation, value)); int h = (int) (hue * 6); float f = hue * 6 - h; @@ -89,6 +97,27 @@ public class Colors { "rgb", h, hue, saturation, value)); } } + public static @ColorInt + int hslTriplet(float hue, float saturation, float lightness) { + @ColorLong long result; + float h = hue * 6; + float c = (1 - abs(2f * lightness - 1)) * saturation; + float h_mod_2 = h % 2; + float x = c * (1 - Math.abs(h_mod_2 - 1)); + int r, g, b; + float m = lightness - c / 2f; + + if (h < 1 || h == 6) return tupleToColor(c + m, x + m, 0 + m); + if (h < 2) return tupleToColor(x + m, c + m, 0 + m); + if (h < 3) return tupleToColor(0 + m, c + m, x + m); + if (h < 4) return tupleToColor(0 + m, x + m, c + m); + if (h < 5) return tupleToColor(x + m, 0 + m, c + m); + if (h < 6) return tupleToColor(c + m, 0 + m, x + m); + + throw new IllegalArgumentException(String.format( + "Unexpected value for h (%d) while converting hsl(%1.2f, %1.2f, %1.2f) to rgb", h, + hue, saturation, lightness)); + } public static @ColorInt int tupleToColor(float r, float g, float b) { @@ -99,11 +128,14 @@ public class Colors { } public static @ColorInt int getPrimaryColorForHue(int degrees) { + // 0/360f becomes -0.000something for some reason + if (degrees == 0) return getPrimaryColorForHue(0f); return getPrimaryColorForHue(degrees / 360f); } public static @ColorInt int getPrimaryColorForHue(float hue) { - int result = hsvColor(hue, 0.61f, 0.95f); +// int result = hsvColor(hue, 0.61f, 0.95f); + int result = hslColor(hue, 0.60f, 0.60f); Log.d("colors", String.format("getPrimaryColorForHue(%1.2f) = %x", hue, result)); return result; }