fix(convert): zero-pad each channel in RgbToHex

RgbToHex emitted a single hex digit for channel values below 0x10 because
strconv.FormatInt produces the minimal representation. This broke the
fixed-width hex format, the round-trip with HexToRgb, and the hex2basicMap
fast path in Rgb2basic. Format each channel with %02x, matching RgbTo256.
This commit is contained in:
dualfroz committed 2026-09-06 00:44:29 +02:00
1 parent 73df039493
commit caf059eba7
2 files changed
+12 -1

No files matched your search

+3 -1
View File
@@ -483,7 +483,9 @@ func RgbToHex(rgb []int) string {
hexNodes := make([]string, 0, len(rgb))
for _, v := range rgb {
hexNodes = append(hexNodes, strconv.FormatInt(int64(v), 16))
// Channels below 0x10 must keep two digits, or the fixed-width format and
// the round-trip with HexToRgb both break.
hexNodes = append(hexNodes, fmt.Sprintf("%02x", v))
}
return strings.Join(hexNodes, "")
}
+9
View File
@@ -119,12 +119,21 @@ func TestRgbToHex(t *testing.T) {
{"cccccc", []int{204, 204, 204}},
{"aabbcc", []int{170, 187, 204}},
{"aa99cd", []int{170, 153, 205}},
// channels below 0x10 must be zero-padded to two hex digits
{"000000", []int{0, 0, 0}},
{"010203", []int{1, 2, 3}},
{"0a0b0c", []int{10, 11, 12}},
}
for _, item := range tests {
assert.Equal(t, RgbToHex(item.given), item.want)
assert.Equal(t, Rgb2hex(item.given), item.want)
}
// RgbToHex must be the inverse of HexToRgb, including for small channels.
for _, hex := range []string{"010203", "000000", "0a0b0c", "aabbcc"} {
assert.Equal(t, RgbToHex(HexToRgb(hex)), hex)
}
}
func TestRgbToAnsi(t *testing.T) {