81 lines
1.7 KiB
Bash
Executable file
81 lines
1.7 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
HEX="${1#\#}"
|
|
|
|
# Convert hex to RGB
|
|
R=$((16#${HEX:0:2}))
|
|
G=$((16#${HEX:2:2}))
|
|
B=$((16#${HEX:4:2}))
|
|
|
|
# --- SETTINGS ---
|
|
# Increase this to make the script avoid 'grey' unless the color is truly neutral.
|
|
GREY_PENALTY=2000
|
|
# ----------------
|
|
|
|
declare -a COLORS=(
|
|
"black 0 0 0"
|
|
"bluegrey 96 125 139"
|
|
"blue 33 150 243"
|
|
"breeze 56 189 220"
|
|
"brown 121 85 72"
|
|
"cyan 0 188 212"
|
|
"green 76 175 80"
|
|
"grey 158 158 158"
|
|
"indigo 63 81 181"
|
|
"magenta 171 71 188"
|
|
"nordic 94 129 172"
|
|
"orange 255 152 0"
|
|
"pink 233 30 99"
|
|
"red 244 67 54"
|
|
"teal 0 150 136"
|
|
"violet 126 87 194"
|
|
"white 255 255 255"
|
|
"yellow 255 235 59"
|
|
)
|
|
|
|
# 1. Calculate input saturation/chroma
|
|
# We find the 'neutral' part of your color (the minimum value)
|
|
MIN=$R
|
|
[ $G -lt $MIN ] && MIN=$G
|
|
[ $B -lt $MIN ] && MIN=$B
|
|
|
|
# 'Pure' version of your color
|
|
PR=$((R - MIN))
|
|
PG=$((G - MIN))
|
|
PB=$((B - MIN))
|
|
|
|
BEST=""
|
|
BEST_DIST=999999999
|
|
|
|
for ENTRY in "${COLORS[@]}"; do
|
|
read -r NAME CR CG CB <<< "$ENTRY"
|
|
|
|
# Calculate 'Pure' version of the preset
|
|
CMIN=$CR
|
|
[ $CG -lt $CMIN ] && CMIN=$CG
|
|
[ $CB -lt $CMIN ] && CMIN=$CB
|
|
|
|
PCR=$((CR - CMIN))
|
|
PCG=$((CG - CMIN))
|
|
PCB=$((CB - CMIN))
|
|
|
|
# Compare the 'Pure' colors (Hue match)
|
|
DR=$((PR - PCR))
|
|
DG=$((PG - PCG))
|
|
DB=$((PB - PCB))
|
|
|
|
DIST=$(( DR*DR + DG*DG + DB*DB ))
|
|
|
|
# Add a penalty to "Grey" to prefer actual colors
|
|
if [ "$NAME" == "grey" ] || [ "$NAME" == "bluegrey" ]; then
|
|
DIST=$(( DIST + GREY_PENALTY ))
|
|
fi
|
|
|
|
if [ $DIST -lt $BEST_DIST ]; then
|
|
BEST_DIST=$DIST
|
|
BEST=$NAME
|
|
fi
|
|
done
|
|
|
|
echo "Detected Hue Match: $BEST"
|
|
papirus-folders -C "$BEST" -t "$HOME/.local/share/icons/Papirus"
|