From ed43f812eb73cc0682f881c0a68c68ce6cceb0e4 Mon Sep 17 00:00:00 2001 From: Stephen Baynham Date: Thu, 30 Jan 2025 08:26:30 -0800 Subject: [PATCH 01/36] feat: Add sixels to ansi package --- ansi/go.mod | 1 + ansi/go.sum | 2 + ansi/graphics.go | 45 ++++ ansi/sixel/decoder.go | 506 +++++++++++++++++++++++++++++++++++++ ansi/sixel/encoder.go | 262 +++++++++++++++++++ ansi/sixel/palette.go | 352 ++++++++++++++++++++++++++ ansi/sixel/palette_test.go | 124 +++++++++ ansi/sixel/sixel_test.go | 161 ++++++++++++ 8 files changed, 1453 insertions(+) create mode 100644 ansi/sixel/decoder.go create mode 100644 ansi/sixel/encoder.go create mode 100644 ansi/sixel/palette.go create mode 100644 ansi/sixel/palette_test.go create mode 100644 ansi/sixel/sixel_test.go diff --git a/ansi/go.mod b/ansi/go.mod index d5d4b6e6..bdf89d0e 100644 --- a/ansi/go.mod +++ b/ansi/go.mod @@ -3,6 +3,7 @@ module github.com/charmbracelet/x/ansi go 1.18 require ( + github.com/bits-and-blooms/bitset v1.20.0 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/mattn/go-runewidth v0.0.16 github.com/rivo/uniseg v0.4.7 diff --git a/ansi/go.sum b/ansi/go.sum index 4dfe154f..20dc59e7 100644 --- a/ansi/go.sum +++ b/ansi/go.sum @@ -1,3 +1,5 @@ +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= diff --git a/ansi/graphics.go b/ansi/graphics.go index 604fef47..a2504cbc 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -11,8 +11,53 @@ import ( "strings" "github.com/charmbracelet/x/ansi/kitty" + "github.com/charmbracelet/x/ansi/sixel" ) +// SixelGraphics returns a sequence that encodes the given sixel image payload to +// a DCS sixel sequence. +// +// DCS p1; p2; p3; q [sixel payload] ST +// +// p1 = pixel aspect ratio, deprecated and replaced by pixel metrics in the payload +// +// p2 = This is supposed to be 0 for transparency, but terminals don't seem to +// to use it properly. Value 0 leaves an unsightly black bar on all terminals +// I've tried and looks correct with value 1. +// +// p3 = Horizontal grid size parameter. Everyone ignores this and uses a fixed grid +// size, as far as I can tell. +// +// See https://shuford.invisible-island.net/all_about_sixels.txt +func SixelGraphics(payload []byte) string { + var buf bytes.Buffer + + buf.WriteString("\x1bP0;1;0;q") + buf.Write(payload) + buf.WriteString("\x1b\\") + + return buf.String() +} + +// WriteSixelGraphics encodes an image as sixels into the provided io.Writer. +// Options is provided in expectation of future options (such as dithering), but +// none are yet implemented. o can be nil to use the default options. +func WriteSixelGraphics(w io.Writer, m image.Image, o *sixel.Options) error { + if o == nil { + o = &sixel.Options{} + } + + e := &sixel.Encoder{} + + data := bytes.NewBuffer(nil) + if err := e.Encode(data, m); err != nil { + return fmt.Errorf("failed to encode sixel image: %w", err) + } + + _, err := io.WriteString(w, SixelGraphics(data.Bytes())) + return err +} + // KittyGraphics returns a sequence that encodes the given image in the Kitty // graphics protocol. // diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go new file mode 100644 index 00000000..68a66c09 --- /dev/null +++ b/ansi/sixel/decoder.go @@ -0,0 +1,506 @@ +package sixel + +import ( + "bytes" + "errors" + "fmt" + "image" + "image/color" + "io" +) + +// buildDefaultDecodePalette will build a map that we'll use as the palette during +// the decoding process- it's pre-loaded with the default colors for sixels, in case +// we are decoding a legacy sixel image that doesn't define its own colors (technically +// permitted). +func buildDefaultDecodePalette() map[int]color.Color { + + // Undefined colors in sixel images use a set of default colors: 0-15 + // are sixel-specific, 16-255 are the same as the xterm 256-color values + return map[int]color.Color{ + // Sixel-specific default colors + 0: color.RGBA{0, 0, 0, 255}, + 1: color.RGBA{51, 51, 204, 255}, + 2: color.RGBA{204, 36, 36, 255}, + 3: color.RGBA{51, 204, 51, 255}, + 4: color.RGBA{204, 51, 204, 255}, + 5: color.RGBA{51, 204, 204, 255}, + 6: color.RGBA{204, 204, 51, 255}, + 7: color.RGBA{120, 120, 120, 255}, + 8: color.RGBA{69, 69, 69, 255}, + 9: color.RGBA{87, 87, 153, 255}, + 10: color.RGBA{153, 69, 69, 255}, + 11: color.RGBA{87, 153, 87, 255}, + 12: color.RGBA{153, 87, 153, 255}, + 13: color.RGBA{87, 153, 153, 255}, + 14: color.RGBA{153, 153, 87, 255}, + 15: color.RGBA{204, 204, 204, 255}, + + // xterm colors + 16: color.RGBA{0, 0, 0, 255}, // Black1 + 17: color.RGBA{0, 0, 95, 255}, // DarkBlue2 + 18: color.RGBA{0, 0, 135, 255}, // DarkBlue1 + 19: color.RGBA{0, 0, 175, 255}, // DarkBlue + 20: color.RGBA{0, 0, 215, 255}, // Blue3 + 21: color.RGBA{0, 0, 255, 255}, // Blue2 + 22: color.RGBA{0, 95, 0, 255}, // DarkGreen4 + 23: color.RGBA{0, 95, 95, 255}, // DarkGreenBlue5 + 24: color.RGBA{0, 95, 135, 255}, // DarkGreenBlue4 + 25: color.RGBA{0, 95, 175, 255}, // DarkGreenBlue3 + 26: color.RGBA{0, 95, 215, 255}, // GreenBlue8 + 27: color.RGBA{0, 95, 255, 255}, // GreenBlue7 + 28: color.RGBA{0, 135, 0, 255}, // DarkGreen3 + 29: color.RGBA{0, 135, 95, 255}, // DarkGreen2 + 30: color.RGBA{0, 135, 0, 255}, // DarkGreenBlue2 + 31: color.RGBA{0, 135, 175, 255}, // DarkGreenBlue1 + 32: color.RGBA{0, 125, 215, 255}, // GreenBlue6 + 33: color.RGBA{0, 135, 255, 255}, // GreenBlue5 + 34: color.RGBA{0, 175, 0, 255}, // DarkGreen1 + 35: color.RGBA{0, 175, 95, 255}, // DarkGreen + 36: color.RGBA{0, 175, 135, 255}, // DarkBlueGreen + 37: color.RGBA{0, 175, 175, 255}, // DarkGreenBlue + 38: color.RGBA{0, 175, 215, 255}, // GreenBlue4 + 39: color.RGBA{0, 175, 255, 255}, // GreenBlue3 + 40: color.RGBA{0, 215, 0, 255}, // Green7 + 41: color.RGBA{0, 215, 95, 255}, // Green6 + 42: color.RGBA{0, 215, 135, 255}, // Green5 + 43: color.RGBA{0, 215, 175, 255}, // BlueGreen1 + 44: color.RGBA{0, 215, 215, 255}, // GreenBlue2 + 45: color.RGBA{0, 215, 255, 255}, // GreenBlue1 + 46: color.RGBA{0, 255, 0, 255}, // Green4 + 47: color.RGBA{0, 255, 95, 255}, // Green3 + 48: color.RGBA{0, 255, 135, 255}, // Green2 + 49: color.RGBA{0, 255, 175, 255}, // Green1 + 50: color.RGBA{0, 255, 215, 255}, // BlueGreen + 51: color.RGBA{0, 255, 255, 255}, // GreenBlue + 52: color.RGBA{95, 0, 0, 255}, // DarkRed2 + 53: color.RGBA{95, 0, 95, 255}, // DarkPurple4 + 54: color.RGBA{95, 0, 135, 255}, // DarkBluePurple2 + 55: color.RGBA{95, 0, 175, 255}, // DarkBluePurple1 + 56: color.RGBA{95, 0, 215, 255}, // PurpleBlue + 57: color.RGBA{95, 0, 255, 255}, // Blue1 + 58: color.RGBA{95, 95, 0, 255}, // DarkYellow4 + 59: color.RGBA{95, 95, 95, 255}, // Gray3 + 60: color.RGBA{95, 95, 135, 255}, // PlueBlue8 + 61: color.RGBA{95, 95, 175, 255}, // PaleBlue7 + 62: color.RGBA{95, 95, 215, 255}, // PaleBlue6 + 63: color.RGBA{95, 95, 255, 255}, // PaleBlue5 + 64: color.RGBA{95, 135, 0, 255}, // DarkYellow3 + 65: color.RGBA{95, 135, 95, 255}, // PaleGreen12 + 66: color.RGBA{95, 135, 135, 255}, // PaleGreen11 + 67: color.RGBA{95, 135, 175, 255}, // PaleGreenBlue10 + 68: color.RGBA{95, 135, 215, 255}, // PaleGreenBlue9 + 69: color.RGBA{95, 135, 255, 255}, // PaleBlue4 + 70: color.RGBA{95, 175, 0, 255}, // DarkGreenYellow + 71: color.RGBA{95, 175, 95, 255}, // PaleGreen11 + 72: color.RGBA{95, 175, 135, 255}, // PaleGreen10 + 73: color.RGBA{95, 175, 175, 255}, // PaleGreenBlue8 + 74: color.RGBA{95, 175, 215, 255}, // PaleGreenBlue7 + 75: color.RGBA{95, 175, 255, 255}, // PaleGreenBlue6 + 76: color.RGBA{95, 215, 0, 255}, // YellowGreen1 + 77: color.RGBA{95, 215, 95, 255}, // PaleGreen9 + 78: color.RGBA{95, 215, 135, 255}, // PaleGreen8 + 79: color.RGBA{95, 215, 175, 255}, // PaleGreen7 + 80: color.RGBA{95, 215, 215, 255}, // PaleGreenBlue5 + 81: color.RGBA{95, 215, 255, 255}, // PaleGreenBlue4 + 82: color.RGBA{95, 255, 0, 255}, // YellowGreen + 83: color.RGBA{95, 255, 95, 255}, // PaleGreen6 + 84: color.RGBA{95, 255, 135, 255}, // PaleGreen5 + 85: color.RGBA{95, 255, 175, 255}, // PaleGreen4 + 86: color.RGBA{95, 255, 215, 255}, // PaleGreen3 + 87: color.RGBA{95, 255, 255, 255}, // PaleGreenBlue3 + 88: color.RGBA{135, 0, 0, 255}, // DarkRed1 + 89: color.RGBA{135, 0, 95, 255}, // DarkPurple3 + 90: color.RGBA{135, 0, 135, 255}, // DarkPurple2 + 91: color.RGBA{135, 0, 175, 255}, // DarkBluePurple + 92: color.RGBA{135, 0, 215, 255}, // BluePurple4 + 93: color.RGBA{135, 0, 255, 255}, // BluePurple3 + 94: color.RGBA{135, 95, 0, 255}, // DarkOrange1 + 95: color.RGBA{135, 95, 95, 255}, // PaleRed5 + 96: color.RGBA{135, 95, 135, 255}, // PalePurple7 + 97: color.RGBA{135, 95, 175, 255}, // PalePurpleBlue + 98: color.RGBA{135, 95, 215, 255}, // PaleBlue3 + 99: color.RGBA{135, 95, 255, 255}, // PaleBlue2 + 100: color.RGBA{135, 135, 0, 255}, // DarkYellow2 + 101: color.RGBA{135, 135, 95, 255}, // PaleYellow7 + 102: color.RGBA{135, 135, 135, 255}, // Gray2 + 103: color.RGBA{135, 135, 175, 255}, // PaleBlue1 + 104: color.RGBA{135, 135, 215, 255}, // PaleBlue + 105: color.RGBA{135, 135, 255, 255}, // LightPaleBlue4 + 106: color.RGBA{135, 175, 0, 255}, // DarkYellow1 + 107: color.RGBA{135, 175, 95, 255}, // PaleYellowGreen3 + 108: color.RGBA{135, 175, 135, 255}, // PaleGreen2 + 109: color.RGBA{135, 175, 175, 255}, // PaleGreenBlue2 + 110: color.RGBA{135, 175, 215, 255}, // PaleGreenBlue1 + 111: color.RGBA{135, 175, 255, 255}, // LightPaleGreenBlue6 + 112: color.RGBA{135, 215, 0, 255}, // Yellow6 + 113: color.RGBA{135, 215, 95, 255}, // PaleYellowGreen2 + 114: color.RGBA{135, 215, 135, 255}, // PaleGreen1 + 115: color.RGBA{135, 215, 175, 255}, // PaleGreen + 116: color.RGBA{135, 215, 215, 255}, // PaleGreenBlue + 117: color.RGBA{135, 215, 255, 255}, // LightPaleGreenBlue5 + 118: color.RGBA{135, 255, 0, 255}, // GreenYellow + 119: color.RGBA{135, 255, 95, 255}, // PaleYellowGreen1 + 120: color.RGBA{135, 255, 135, 255}, // LightPaleGreen6 + 121: color.RGBA{135, 255, 175, 255}, // LightPaleGreen5 + 122: color.RGBA{135, 255, 215, 255}, // LightPaleGreen4 + 123: color.RGBA{135, 255, 255, 255}, // LightPaleGreenBlue4 + 124: color.RGBA{175, 0, 0, 255}, // DarkRed + 125: color.RGBA{175, 0, 95, 255}, // DarkRedPurple + 126: color.RGBA{175, 0, 135, 255}, // DarkPurple1 + 127: color.RGBA{175, 0, 175, 255}, // DarkPurple + 128: color.RGBA{175, 0, 215, 255}, // BluePurple2 + 129: color.RGBA{175, 0, 255, 255}, // BluePurple1 + 130: color.RGBA{175, 95, 0, 255}, // DarkOrange + 131: color.RGBA{175, 95, 95, 255}, // PaleRed4 + 132: color.RGBA{175, 95, 135, 255}, // PalePurpleRed3 + 133: color.RGBA{175, 95, 175, 255}, // PalePurple6 + 134: color.RGBA{175, 95, 215, 255}, // PaleBluePurple3 + 135: color.RGBA{175, 95, 255, 255}, // PaleBluePurple2 + 136: color.RGBA{175, 135, 0, 255}, // DarkYellowOrange + 137: color.RGBA{175, 135, 95, 255}, // PaleRedOrange3 + 138: color.RGBA{175, 135, 135, 255}, // PaleRed3 + 139: color.RGBA{175, 135, 175, 255}, // PalePurple5 + 140: color.RGBA{175, 135, 215, 255}, // PaleBluePurple1 + 141: color.RGBA{175, 135, 255, 255}, // LightPaleBlue3 + 142: color.RGBA{175, 175, 0, 255}, // DarkYellow + 143: color.RGBA{175, 175, 95, 255}, // PaleYellow6 + 144: color.RGBA{175, 175, 135, 255}, // PaleYellow5 + 145: color.RGBA{175, 175, 175, 255}, // Gray1 + 146: color.RGBA{175, 175, 215, 255}, // LightPaleBlue2 + 147: color.RGBA{175, 175, 255, 255}, // LightPaleBlue1 + 148: color.RGBA{175, 215, 0, 255}, // Yellow5 + 149: color.RGBA{175, 215, 95, 255}, // PaleYellow4 + 150: color.RGBA{175, 215, 135, 255}, // PaleGreenYellow + 151: color.RGBA{175, 215, 175, 255}, // LightPaleGreen3 + 152: color.RGBA{175, 215, 215, 255}, // LightPaleGreenBlue3 + 153: color.RGBA{175, 215, 255, 255}, // LightPaleGreenBlue2 + 154: color.RGBA{175, 255, 0, 255}, // Yellow4 + 155: color.RGBA{175, 255, 95, 255}, // PaleYellowGreen + 156: color.RGBA{175, 255, 135, 255}, // LightPaleYellowGreen1 + 157: color.RGBA{175, 255, 215, 255}, // LightPaleGreen2 + 158: color.RGBA{175, 255, 215, 255}, // LightPaleGreen1 + 159: color.RGBA{175, 255, 255, 255}, // LightPaleGreenBlue1 + 160: color.RGBA{215, 0, 0, 255}, // Red2 + 161: color.RGBA{215, 0, 95, 255}, // PurpleRed1 + 162: color.RGBA{215, 0, 135, 255}, // Purple6 + 163: color.RGBA{215, 0, 175, 255}, // Purple5 + 164: color.RGBA{215, 0, 215, 255}, // Purple4 + 165: color.RGBA{215, 0, 255, 255}, // BluePurple + 166: color.RGBA{215, 95, 0, 255}, // RedOrange1 + 167: color.RGBA{215, 95, 95, 255}, // PaleRed2 + 168: color.RGBA{215, 95, 135, 255}, // PalePurpleRed2 + 169: color.RGBA{215, 95, 175, 255}, // PalePurple4 + 170: color.RGBA{215, 95, 215, 255}, // PalePurple3 + 171: color.RGBA{215, 95, 255, 255}, // PaleBluePurple + 172: color.RGBA{215, 135, 0, 255}, // Orange2 + 173: color.RGBA{215, 135, 95, 255}, // PaleRedOrange2 + 174: color.RGBA{215, 135, 135, 255}, // PaleRed1 + 175: color.RGBA{215, 135, 175, 255}, // PaleRedPurple + 176: color.RGBA{215, 135, 215, 255}, // PalePurple2 + 177: color.RGBA{215, 135, 255, 255}, // LightPaleBluePurple + 178: color.RGBA{215, 175, 0, 255}, // OrangeYellow1 + 179: color.RGBA{215, 175, 95, 255}, // PaleOrange1 + 180: color.RGBA{215, 175, 135, 255}, // PaleRedOrange1 + 181: color.RGBA{215, 175, 175, 255}, // LightPaleRed3 + 182: color.RGBA{215, 175, 215, 255}, // LightPalePurple4 + 183: color.RGBA{215, 175, 255, 255}, // LightPalePurpleBlue + 184: color.RGBA{215, 215, 0, 255}, // Yellow3 + 185: color.RGBA{215, 215, 95, 255}, // PaleYellow3 + 186: color.RGBA{215, 215, 135, 255}, // PaleYellow2 + 187: color.RGBA{215, 215, 175, 255}, // LightPaleYellow4 + 188: color.RGBA{215, 215, 215, 255}, // LightGray + 189: color.RGBA{215, 215, 255, 255}, // LightPaleBlue + 190: color.RGBA{215, 255, 0, 255}, // Yellow2 + 191: color.RGBA{215, 255, 95, 255}, // PaleYellow1 + 192: color.RGBA{215, 255, 135, 255}, // LightPaleYellow3 + 193: color.RGBA{215, 255, 175, 255}, // LightPaleYellowGreen + 194: color.RGBA{215, 255, 215, 255}, // LightPaleGreen + 195: color.RGBA{215, 255, 255, 255}, // LightPaleGreenBlue + 196: color.RGBA{255, 0, 0, 255}, // Red1 + 197: color.RGBA{255, 0, 95, 255}, // PurpleRed + 198: color.RGBA{255, 0, 135, 255}, // RedPurple + 199: color.RGBA{255, 0, 175, 255}, // Purple3 + 200: color.RGBA{255, 0, 215, 255}, // Purple2 + 201: color.RGBA{255, 0, 255, 255}, // Purple1 + 202: color.RGBA{255, 95, 0, 255}, // RedOrange + 203: color.RGBA{255, 95, 95, 255}, // PaleRed + 204: color.RGBA{255, 95, 135, 255}, // PalePurpleRed1 + 205: color.RGBA{255, 95, 175, 255}, // PalePurpleRed + 206: color.RGBA{255, 95, 215, 255}, // PalePurple1 + 207: color.RGBA{255, 95, 255, 255}, // PalePurple + 208: color.RGBA{255, 135, 0, 255}, // Orange1 + 209: color.RGBA{255, 135, 95, 255}, // PaleOrangeRed + 210: color.RGBA{255, 135, 135, 255}, // LightPaleRed2 + 211: color.RGBA{255, 135, 175, 255}, // LightPalePurpleRed1 + 212: color.RGBA{255, 135, 215, 255}, // LightPalePurple3 + 213: color.RGBA{255, 135, 255, 255}, // LightPalePurple2 + 214: color.RGBA{255, 175, 0, 255}, // Orange + 215: color.RGBA{255, 175, 95, 255}, // PaleRedOrange + 216: color.RGBA{255, 175, 135, 255}, // LightPaleRedOrange1 + 217: color.RGBA{255, 175, 175, 255}, // LightPaleRed1 + 218: color.RGBA{255, 175, 215, 255}, // LightPalePurpleRed + 219: color.RGBA{255, 175, 255, 255}, // LightPalePurple1 + 220: color.RGBA{255, 215, 0, 255}, // OrangeYellow + 221: color.RGBA{255, 215, 95, 255}, // PaleOrange + 222: color.RGBA{255, 215, 135, 255}, // LightPaleOrange + 223: color.RGBA{255, 215, 175, 255}, // LightPaleRedOrange + 224: color.RGBA{255, 215, 215, 255}, // LightPaleRed + 225: color.RGBA{255, 215, 255, 255}, // LightPalePurple + 226: color.RGBA{255, 255, 0, 255}, // Yellow1 + 227: color.RGBA{255, 255, 95, 255}, // PaleYellow + 228: color.RGBA{255, 255, 135, 255}, // LightPaleYellow2 + 229: color.RGBA{255, 255, 175, 255}, // LightPaleYellow1 + 230: color.RGBA{255, 255, 215, 255}, // LightPaleYellow + 231: color.RGBA{255, 255, 255, 255}, // White1 + 232: color.RGBA{8, 8, 8, 255}, // Gray4 + 233: color.RGBA{18, 18, 18, 255}, // Gray8 + 234: color.RGBA{28, 28, 28, 255}, // Gray11 + 235: color.RGBA{38, 38, 38, 255}, // Gray15 + 236: color.RGBA{48, 48, 48, 255}, // Gray19 + 237: color.RGBA{58, 58, 58, 255}, // Gray23 + 238: color.RGBA{68, 68, 68, 255}, // Gray27 + 239: color.RGBA{78, 78, 78, 255}, // Gray31 + 240: color.RGBA{88, 88, 88, 255}, // Gray35 + 241: color.RGBA{98, 98, 98, 255}, // Gray39 + 242: color.RGBA{108, 108, 108, 255}, // Gray43 + 243: color.RGBA{118, 118, 118, 255}, // Gray47 + 244: color.RGBA{128, 128, 128, 255}, // Gray51 + 245: color.RGBA{138, 138, 138, 255}, // Gray55 + 246: color.RGBA{148, 148, 148, 255}, // Gray59 + 247: color.RGBA{158, 158, 158, 255}, // Gray62 + 248: color.RGBA{168, 168, 168, 255}, // Gray66 + 249: color.RGBA{178, 178, 178, 255}, // Gray70 + 250: color.RGBA{188, 188, 188, 255}, // Gray74 + 251: color.RGBA{198, 198, 198, 255}, // Gray78 + 252: color.RGBA{208, 208, 208, 255}, // Gray82 + 253: color.RGBA{218, 218, 218, 255}, // Gray86 + 254: color.RGBA{228, 228, 228, 255}, // Gray90 + 255: color.RGBA{238, 238, 238, 255}, // Gray94 + } +} + +type Decoder struct { +} + +// Decode will parse sixel image data into an image or return an error. Because +// the sixel image format does not have a predictable size, the end of the sixel +// image data can only be identified when ST, ESC, or BEL has been read from a reader. +// In order to avoid reading bytes from a reader one at a time to avoid missing +// the end, this method simply accepts a byte slice instead of a reader. Callers +// should read the entire escape sequence and pass the Ps..Ps portion of the sequence +// to this method. +func (d *Decoder) Decode(data []byte) (image.Image, error) { + if len(data) == 0 { + return image.NewRGBA(image.Rect(0, 0, 0, 0)), nil + } + + buffer := bytes.NewBuffer(data) + b, err := buffer.ReadByte() + if err != nil { + return nil, d.readError(err) + } + + var bounds image.Rectangle + if b == '"' { + var fixedWidth, fixedHeight int + // We have pixel dimensions + _, err := fmt.Fscanf(buffer, "1;1;%d;%d", &fixedWidth, &fixedHeight) + if err != nil { + return nil, d.readError(err) + } + + bounds = image.Rect(0, 0, fixedWidth, fixedHeight) + } else { + // We're parsing the image with no pixel metrics so unread the byte for the + // main read loop + _ = buffer.UnreadByte() + + width, height := d.scanSize(data) + bounds = image.Rect(0, 0, width, height) + } + + img := image.NewRGBA(bounds) + palette := buildDefaultDecodePalette() + var currentX, currentBandY, currentPaletteIndex int + + for { + b, err := buffer.ReadByte() + if err != nil { + return img, d.readError(err) + } + + // Palette operation + if b == sixelUseColor { + _, err = fmt.Fscan(buffer, ¤tPaletteIndex) + if err != nil { + return img, d.readError(err) + } + + b, err = buffer.ReadByte() + if err != nil { + return img, d.readError(err) + } + + if b != ';' { + // If we're not defining a color, move on + _ = buffer.UnreadByte() + continue + } + + var red, green, blue uint32 + // We only know how to read RGB colors, which is preceded by a 2 + _, err = fmt.Fscanf(buffer, "2;%d;%d;%d", &red, &green, &blue) + if err != nil { + return img, d.readError(err) + } + + if red > 100 || green > 100 || blue > 100 { + return img, fmt.Errorf("invalid palette color: %d,%d,%d", red, green, blue) + } + + palette[currentPaletteIndex] = color.RGBA64{ + R: uint16(imageConvertChannel(red)), + G: uint16(imageConvertChannel(green)), + B: uint16(imageConvertChannel(blue)), + A: 65525, + } + + continue + } + + // LF + if b == sixelLineBreak { + currentBandY++ + currentX = 0 + continue + } + + // CR + if b == sixelCarriageReturn { + currentX = 0 + continue + } + + // RLE operation + count := 1 + if b == sixelRepeat { + _, err = fmt.Fscan(buffer, &count) + if err != nil { + return img, d.readError(err) + } + + // The next byte SHOULD be a pixel + b, err = buffer.ReadByte() + if err != nil { + return img, d.readError(err) + } + } + + if b >= '?' && b <= '~' { + color := palette[currentPaletteIndex] + for i := 0; i < count; i++ { + d.writePixel(currentX, currentBandY, b, color, img) + currentX++ + } + } + } +} + +// WritePixel will accept a sixel byte (from ? to ~) that defines 6 vertical pixels +// and write any filled pixels to the image +func (d *Decoder) writePixel(x int, bandY int, sixel byte, color color.Color, img *image.RGBA) { + maskedSixel := (sixel - '?') & 63 + yOffset := 0 + for maskedSixel != 0 { + if maskedSixel&1 != 0 { + img.Set(x, bandY*6+yOffset, color) + } + + yOffset++ + maskedSixel >>= 1 + } +} + +// scanSize is only used for legacy sixel images that do not define pixel metrics +// near the header (technically permitted). In this case, we need to quickly scan +// the image to figure out what the height and width are. Different terminals +// treat unfilled pixels around the border of the image diffently, but in our case +// we will treat all pixels, even empty ones, as part of the image. However, +// we will allow the image to end with an LF code without increasing the size +// of the image. +// +// In the interest of speed, this method doesn't really parse the image in any +// meaningful way: pixel codes (? to ~), and the RLE, CR, and LF indicators +// (!, $, -) cannot appear within a sixel image except as themselves, so we +// just ignore everything else. The only thing we actually take the time to parse +// is the number after the RLE indicator to know how much width to add to the current +// line. +func (d *Decoder) scanSize(data []byte) (int, int) { + var maxWidth, bandCount int + buffer := bytes.NewBuffer(data) + + // Pixel values are ? to ~. Each one of these encountered increases the max width. + // a - is a LF and increases the max band count by one. a $ is a CR and resets + // current width. (char - '?') will get a 6-bit number and the highest bit is + // the lowest y value, which we should use to increment maxBandPixels. + // + // a ! is a RLE indicator, and we should add the numeral to the current width + var currentWidth int + var newBand bool + for { + b, err := buffer.ReadByte() + if err != nil { + return maxWidth, bandCount * 6 + } + + if b == '-' { + // LF + currentWidth = 0 + // The image may end with an LF, so we shouldn't increment the band + // count until we encounter a pixel + newBand = true + } else if b == '$' { + // CR + currentWidth = 0 + } else if b == '!' || (b >= '?' && b <= '~') { + // Either an RLE operation or a single pixel + + var count int + if b == '!' { + // Get the run length for the RLE operation + _, err := fmt.Fscan(buffer, &count) + if err != nil { + return maxWidth, bandCount * 6 + } + // Decrement the RLE because the pixel code will follow the + // RLE and that will count as pixel + count-- + } else { + count = 1 + } + + currentWidth += count + + if newBand { + newBand = false + bandCount++ + } + if currentWidth > maxWidth { + maxWidth = currentWidth + } + } + } +} + +// readError will take any error returned from a read method (ReadByte, +// FScanF, etc.) and either wrap or ignore the error. An encountered EOF +// indicates that it's time to return the completed image so we just +// return it. +func (d *Decoder) readError(err error) error { + if errors.Is(err, io.EOF) { + return nil + } + + return fmt.Errorf("failed to read sixel data: %w", err) +} diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go new file mode 100644 index 00000000..ef60eea5 --- /dev/null +++ b/ansi/sixel/encoder.go @@ -0,0 +1,262 @@ +package sixel + +import ( + "image" + "image/color" + "io" + "strconv" + "strings" + + "github.com/bits-and-blooms/bitset" +) + +// Sixels are a protocol for writing images to the terminal by writing a large blob of ANSI-escaped data. +// They function by encoding columns of 6 pixels into a single character (in much the same way base64 +// encodes data 6 bits at a time). Sixel images are paletted, with a palette established at the beginning +// of the image blob and pixels identifying palette entires by index while writing the pixel data. +// +// Sixels are written one 6-pixel-tall band at a time, one color at a time. For each band, a single +// color's pixels are written, then a carriage return is written to bring the "cursor" back to the +// beginning of a band where a new color is selected and pixels written. This continues until the entire +// band has been drawn, at which time a line break is written to begin the next band. + +const ( + sixelLineBreak byte = '-' + sixelCarriageReturn byte = '$' + sixelRepeat byte = '!' + sixelUseColor byte = '#' +) + +type Options struct { +} + +type Encoder struct { +} + +// Encode will accept an Image and write sixel data to a Writer. The sixel data +// will be everything after the 'q' that ends the DCS parameters and before the ST +// that ends the sequence. That means it includes the pixel metrics and color +// palette. +func (e *Encoder) Encode(w io.Writer, img image.Image) error { + if img == nil { + return nil + } + + imageBounds := img.Bounds() + + io.WriteString(w, "\"1;1;") //nolint:errcheck + io.WriteString(w, strconv.Itoa(imageBounds.Dx())) //nolint:errcheck + w.Write([]byte{';'}) //nolint:errcheck + io.WriteString(w, strconv.Itoa(imageBounds.Dy())) //nolint:errcheck + + palette := newSixelPalette(img, sixelMaxColors) + + for paletteIndex, color := range palette.PaletteColors { + e.encodePaletteColor(w, paletteIndex, color) + } + + scratch := newSixelBuilder(imageBounds.Dx(), imageBounds.Dy(), palette) + + for y := 0; y < imageBounds.Dy(); y++ { + for x := 0; x < imageBounds.Dx(); x++ { + scratch.SetColor(x, y, img.At(x, y)) + } + } + + pixels := scratch.GeneratePixels() + io.WriteString(w, pixels) //nolint:errcheck + + return nil +} + +func (e *Encoder) encodePaletteColor(w io.Writer, paletteIndex int, c sixelColor) { + // Initializing palette entries + // #;;;; + // a = palette index + // b = color type, 2 is RGB + // c = R + // d = G + // e = B + + w.Write([]byte{sixelUseColor}) //nolint:errcheck + io.WriteString(w, strconv.Itoa(paletteIndex)) //nolint:errcheck + io.WriteString(w, ";2;") + io.WriteString(w, strconv.Itoa(int(c.Red))) //nolint:errcheck + w.Write([]byte{';'}) //nolint:errcheck + io.WriteString(w, strconv.Itoa(int(c.Green))) //nolint:errcheck + w.Write([]byte{';'}) + io.WriteString(w, strconv.Itoa(int(c.Blue))) //nolint:errcheck +} + +// sixelBuilder is a temporary structure used to create a SixelImage. It handles +// breaking pixels out into bits, and then encoding them into a sixel data string. RLE +// handling is included. +// +// Making use of a sixelBuilder is done in two phases. First, SetColor is used to write all +// pixels to the internal BitSet data. Then, GeneratePixels is called to retrieve a string +// representing the pixel data encoded in the sixel format. +type sixelBuilder struct { + SixelPalette sixelPalette + + imageHeight int + imageWidth int + + pixelBands bitset.BitSet + + imageData strings.Builder + repeatRune rune + repeatCount int +} + +// newSixelBuilder creates a sixelBuilder and prepares it for writing +func newSixelBuilder(width, height int, palette sixelPalette) sixelBuilder { + scratch := sixelBuilder{ + imageWidth: width, + imageHeight: height, + SixelPalette: palette, + } + + return scratch +} + +// BandHeight returns the number of six-pixel bands this image consists of +func (s *sixelBuilder) BandHeight() int { + bandHeight := s.imageHeight / 6 + if s.imageHeight%6 != 0 { + bandHeight++ + } + + return bandHeight +} + +// SetColor will write a single pixel to sixelBuilder's internal bitset data to be used by +// GeneratePixels +func (s *sixelBuilder) SetColor(x int, y int, color color.Color) { + bandY := y / 6 + paletteIndex := s.SixelPalette.ColorIndex(sixelConvertColor(color)) + + bit := s.BandHeight()*s.imageWidth*6*paletteIndex + bandY*s.imageWidth*6 + (x * 6) + (y % 6) + s.pixelBands.Set(uint(bit)) +} + +// GeneratePixels is used to write the pixel data to the internal imageData string builder. +// All pixels in the image must be written to the sixelBuilder using SetColor before this method is +// called. This method returns a string that represents the pixel data. Sixel strings consist of five parts: +// ISC
ST +// The header contains some arbitrary options indicating how the sixel image is to be drawn. +// The palette maps palette indices to RGB colors +// The pixels indicates which pixels are to be drawn with which palette colors. +// +// GeneratePixels only produces the part of the string. The rest is written by +// Style.RenderSixelImage. +func (s *sixelBuilder) GeneratePixels() string { + s.imageData = strings.Builder{} + bandHeight := s.BandHeight() + + for bandY := 0; bandY < bandHeight; bandY++ { + if bandY > 0 { + s.writeControlRune(sixelLineBreak) + } + + hasWrittenAColor := false + + for paletteIndex := 0; paletteIndex < len(s.SixelPalette.PaletteColors); paletteIndex++ { + if s.SixelPalette.PaletteColors[paletteIndex].Alpha < 1 { + // Don't draw anything for purely transparent pixels + continue + } + + firstColorBit := uint(s.BandHeight()*s.imageWidth*6*paletteIndex + bandY*s.imageWidth*6) + nextColorBit := firstColorBit + uint(s.imageWidth*6) + + firstSetBitInBand, anySet := s.pixelBands.NextSet(firstColorBit) + if !anySet || firstSetBitInBand >= nextColorBit { + // Color not appearing in this row + continue + } + + if hasWrittenAColor { + s.writeControlRune(sixelCarriageReturn) + } + hasWrittenAColor = true + + s.writeControlRune(sixelUseColor) + s.imageData.WriteString(strconv.Itoa(paletteIndex)) + for x := 0; x < s.imageWidth; x += 4 { + bit := firstColorBit + uint(x*6) + word := s.pixelBands.GetWord64AtBit(bit) + + pixel1 := rune((word & 63) + '?') + pixel2 := rune(((word >> 6) & 63) + '?') + pixel3 := rune(((word >> 12) & 63) + '?') + pixel4 := rune(((word >> 18) & 63) + '?') + + s.writeImageRune(pixel1) + + if x+1 >= s.imageWidth { + continue + } + s.writeImageRune(pixel2) + + if x+2 >= s.imageWidth { + continue + } + s.writeImageRune(pixel3) + + if x+3 >= s.imageWidth { + continue + } + s.writeImageRune(pixel4) + } + } + } + + s.writeControlRune('-') + return s.imageData.String() +} + +// writeImageRune will write a single line of six pixels to pixel data. The data +// doesn't get written to the imageData, it gets buffered for the purposes of RLE +func (s *sixelBuilder) writeImageRune(r rune) { + if r == s.repeatRune { + s.repeatCount++ + return + } + + s.flushRepeats() + s.repeatRune = r + s.repeatCount = 1 +} + +// writeControlRune will write a special rune such as a new line or carriage return +// rune. It will call flushRepeats first, if necessary. +func (s *sixelBuilder) writeControlRune(r byte) { + if s.repeatCount > 0 { + s.flushRepeats() + s.repeatCount = 0 + s.repeatRune = 0 + } + + s.imageData.WriteByte(r) +} + +// flushRepeats is used to actually write the current repeatRune to the imageData when +// it is about to change. This buffering is used to manage RLE in the sixelBuilder +func (s *sixelBuilder) flushRepeats() { + if s.repeatCount == 0 { + return + } + + // Only write using the RLE form if it's actually providing space savings + if s.repeatCount > 3 { + countStr := strconv.Itoa(s.repeatCount) + s.imageData.WriteByte(sixelRepeat) + s.imageData.WriteString(countStr) + s.imageData.WriteRune(s.repeatRune) + return + } + + for i := 0; i < s.repeatCount; i++ { + s.imageData.WriteRune(s.repeatRune) + } +} diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go new file mode 100644 index 00000000..c7908fcb --- /dev/null +++ b/ansi/sixel/palette.go @@ -0,0 +1,352 @@ +package sixel + +import ( + "cmp" + "container/heap" + "image" + "image/color" + "math" + "slices" +) + +// sixelPalette is a palette of up to 256 colors that lists the colors that will be used by +// a SixelImage. Most images, especially jpegs, have more than 256 colors, so creating a sixelPalette +// requires the use of color quantization. For this we use the Median Cut algorithm. +// +// Median cut requires all pixels in an image to be positioned in a 4D color cube, with one axis per channel. +// The cube is sliced in half along its longest axis such that half the pixels in the cube end up in one of +// the sub-cubes and half end up in the other. We continue slicing the cube with the longest axis in half +// along that axis until there are 256 sub-cubes. Then, the average of all pixels in each subcube is used +// as that cube's color. +// +// Colors are converted to palette colors based on which they are closest to (it's not +// always their cube's color). +// +// This implementation has a few minor (but seemingly very common) differences from the Official algorithm: +// - When determining the longest axis, the number of pixels in the cube are multiplied against axis length +// This improves color selection by quite a bit in cases where an image has a lot of space taken up by different +// shades of the same color. +// - If a single color sits on a cut line, all pixels of that color are assigned to one of the subcubes +// rather than try to split them up between the subcubes. This allows us to use a slice of unique colors +// and a map of pixel counts rather than try to represent each pixel individually. +type sixelPalette struct { + // Map used to convert colors from the image to palette colors + colorConvert map[sixelColor]sixelColor + // Lookup to get palette index from image color + paletteIndexes map[sixelColor]int + PaletteColors []sixelColor +} + +// quantizationChannel is an enum type which indicates an axis in the color cube. Used to indicate which +// axis in a cube is the longest +type quantizationChannel int + +const ( + sixelMaxColors int = 256 + quantizationRed quantizationChannel = iota + quantizationGreen + quantizationBlue + quantizationAlpha +) + +// quantizationCube represents a single cube in the median cut algorithm. +type quantizationCube struct { + // startIndex is the index in the uniqueColors slice where this cube starts + startIndex int + // length is the number of elements in the uniqueColors slice this cube occupies + length int + // sliceChannel is the axis that will be cut if this cube is cut in half + sliceChannel quantizationChannel + // score is a heuristic value: higher means this cube is more likely to be cut + score uint64 + // pixelCount is how many pixels are contained in this cube + pixelCount uint64 +} + +// cubePriorityQueue is a heap used to sort quantizationCube objects in order to select the correct +// one to cut next. Pop will remove the queue with the highest score +type cubePriorityQueue []any + +func (p *cubePriorityQueue) Push(x any) { + *p = append(*p, x) +} + +func (p *cubePriorityQueue) Pop() any { + popped := (*p)[len(*p)-1] + *p = (*p)[:len(*p)-1] + return popped +} + +func (p *cubePriorityQueue) Len() int { + return len(*p) +} + +func (p *cubePriorityQueue) Less(i, j int) bool { + left := (*p)[i].(quantizationCube) + right := (*p)[j].(quantizationCube) + + // We want the largest channel variance + return left.score > right.score +} + +func (p *cubePriorityQueue) Swap(i, j int) { + (*p)[i], (*p)[j] = (*p)[j], (*p)[i] +} + +// createCube is used to initialize a new quantizationCube containing a region of the uniqueColors slice +func (p *sixelPalette) createCube(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, startIndex, bucketLength int) quantizationCube { + minRed, minGreen, minBlue, minAlpha := uint32(0xffff), uint32(0xffff), uint32(0xffff), uint32(0xffff) + maxRed, maxGreen, maxBlue, maxAlpha := uint32(0), uint32(0), uint32(0), uint32(0) + totalWeight := uint64(0) + + // Figure out which channel has the greatest variance + for i := startIndex; i < startIndex+bucketLength; i++ { + r, g, b, a := uniqueColors[i].Red, uniqueColors[i].Green, uniqueColors[i].Blue, uniqueColors[i].Alpha + totalWeight += pixelCounts[uniqueColors[i]] + + if r < minRed { + minRed = r + } + if r > maxRed { + maxRed = r + } + if g < minGreen { + minGreen = g + } + if g > maxGreen { + maxGreen = g + } + if b < minBlue { + minBlue = b + } + if b > maxBlue { + maxBlue = b + } + if a < minAlpha { + minAlpha = a + } + if a > maxAlpha { + maxAlpha = a + } + } + + dRed := maxRed - minRed + dGreen := maxGreen - minGreen + dBlue := maxBlue - minBlue + dAlpha := maxAlpha - minAlpha + + cube := quantizationCube{ + startIndex: startIndex, + length: bucketLength, + pixelCount: totalWeight, + } + + if dRed >= dGreen && dRed >= dBlue && dRed >= dAlpha { + cube.sliceChannel = quantizationRed + cube.score = uint64(dRed) + } else if dGreen >= dBlue && dGreen >= dAlpha { + cube.sliceChannel = quantizationGreen + cube.score = uint64(dGreen) + } else if dBlue >= dAlpha { + cube.sliceChannel = quantizationBlue + cube.score = uint64(dBlue) + } else { + cube.sliceChannel = quantizationAlpha + cube.score = uint64(dAlpha) + } + + // Boost the score of cubes with more pixels in them + cube.score *= totalWeight + + return cube +} + +// quantize is a method that will initialize the palette's colors and lookups, provided a set +// of unique colors and a map containing pixel counts for those colors +func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, maxColors int) { + p.colorConvert = make(map[sixelColor]sixelColor) + p.paletteIndexes = make(map[sixelColor]int) + + // We don't need to quantize if we don't even have more than the maximum colors, and in fact, this code will explode + // if we have fewer than maximum colors + if len(uniqueColors) <= maxColors { + p.PaletteColors = uniqueColors + return + } + + cubeHeap := make(cubePriorityQueue, 0, maxColors) + + // Start with a cube that contains all colors + heap.Init(&cubeHeap) + heap.Push(&cubeHeap, p.createCube(uniqueColors, pixelCounts, 0, len(uniqueColors))) + + // Slice the best cube into two cubes until we have max colors, then we have our palette + for cubeHeap.Len() < maxColors { + cubeToSplit := heap.Pop(&cubeHeap).(quantizationCube) + + // Sort the colors in the bucket's range along the cube's longest color axis + slices.SortFunc(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], + func(left sixelColor, right sixelColor) int { + switch cubeToSplit.sliceChannel { + case quantizationRed: + return cmp.Compare(left.Red, right.Red) + case quantizationGreen: + return cmp.Compare(left.Green, right.Green) + case quantizationBlue: + return cmp.Compare(left.Blue, right.Blue) + default: + return cmp.Compare(left.Alpha, right.Alpha) + } + }) + + // We need to split up the colors in this cube so that the pixels are evenly split between the two, + // or at least as close as we can reasonably get. What we do is count up the pixels as we go through + // and place the cut point where around half of the pixels are on the left side + countSoFar := pixelCounts[uniqueColors[cubeToSplit.startIndex]] + targetCount := cubeToSplit.pixelCount / 2 + leftLength := 1 + + for i := cubeToSplit.startIndex + 1; i < cubeToSplit.startIndex+cubeToSplit.length; i++ { + c := uniqueColors[i] + weight := pixelCounts[c] + if countSoFar+weight > targetCount { + break + } + leftLength++ + countSoFar += weight + } + + rightLength := cubeToSplit.length - leftLength + rightIndex := cubeToSplit.startIndex + leftLength + heap.Push(&cubeHeap, p.createCube(uniqueColors, pixelCounts, cubeToSplit.startIndex, leftLength)) + heap.Push(&cubeHeap, p.createCube(uniqueColors, pixelCounts, rightIndex, rightLength)) + } + + // Once we've got max cubes in the heap, pull them all out and load them into the palette + for cubeHeap.Len() > 0 { + bucketToLoad := heap.Pop(&cubeHeap).(quantizationCube) + p.loadColor(uniqueColors, pixelCounts, bucketToLoad.startIndex, bucketToLoad.length) + } +} + +// ColorIndex accepts a raw image color (NOT a palette color) and provides the palette index of that color +func (p *sixelPalette) ColorIndex(c sixelColor) int { + return p.paletteIndexes[c] +} + +// loadColor accepts a range of colors representing a single median cut cube. It calculates the +// average color in the cube and adds it to the palette. +func (p *sixelPalette) loadColor(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, startIndex, cubeLen int) { + totalRed, totalGreen, totalBlue, totalAlpha := uint64(0), uint64(0), uint64(0), uint64(0) + totalCount := uint64(0) + for i := startIndex; i < startIndex+cubeLen; i++ { + count := pixelCounts[uniqueColors[i]] + totalRed += uint64(uniqueColors[i].Red) * count + totalGreen += uint64(uniqueColors[i].Green) * count + totalBlue += uint64(uniqueColors[i].Blue) * count + totalAlpha += uint64(uniqueColors[i].Alpha) * count + totalCount += count + } + + averageColor := sixelColor{ + Red: uint32(totalRed / totalCount), + Green: uint32(totalGreen / totalCount), + Blue: uint32(totalBlue / totalCount), + Alpha: uint32(totalAlpha / totalCount), + } + + p.PaletteColors = append(p.PaletteColors, averageColor) +} + +// sixelColor is a flat struct that contains a single color: all channels are 0-100 +// instead of anything sensible +type sixelColor struct { + Red uint32 + Green uint32 + Blue uint32 + Alpha uint32 +} + +// sixelConvertColor accepts an ordinary Go color and converts it to a sixelColor, which +// has channels ranging from 0-100 +func sixelConvertColor(c color.Color) sixelColor { + r, g, b, a := c.RGBA() + return sixelColor{ + Red: sixelConvertChannel(r), + Green: sixelConvertChannel(g), + Blue: sixelConvertChannel(b), + Alpha: sixelConvertChannel(a), + } +} + +// sixelConvertChannel converts a single color channel from go's standard 0-0xffff range to +// sixel's 0-100 range +func sixelConvertChannel(channel uint32) uint32 { + // We add 328 because that is about 0.5 in the sixel 0-100 color range, we're trying to + // round to the nearest value + return (channel + 328) * 100 / 0xffff +} + +// imageConvertChannel converts a single color channel from sixel's 0-100 range to +// go's standard 0-0xffff range +func imageConvertChannel(channel uint32) uint32 { + return (channel*0xffff + 50) / 100 +} + +// newSixelPalette accepts an image and produces an N-color quantized color palette using the median cut +// algorithm. The produced sixelPalette can convert colors from the image to the quantized palette +// in O(1) time. +func newSixelPalette(image image.Image, maxColors int) sixelPalette { + pixelCounts := make(map[sixelColor]uint64) + + height := image.Bounds().Dy() + width := image.Bounds().Dx() + + // Record pixel counts for every color while also getting a set of all unique colors in the image + for y := 0; y < height; y++ { + for x := 0; x < width; x++ { + c := sixelConvertColor(image.At(x, y)) + count, _ := pixelCounts[c] + count++ + + pixelCounts[c] = count + } + } + + p := sixelPalette{} + uniqueColors := make([]sixelColor, 0, len(pixelCounts)) + for c := range pixelCounts { + uniqueColors = append(uniqueColors, c) + } + + // Build up p.PaletteColors using the median cut algorithm + p.quantize(uniqueColors, pixelCounts, maxColors) + + // The average color for a cube a color occupies is not always the closest palette color. As a result, + // we need to use this very upsetting double loop to find the lookup palette color for each + // unique color in the image. + for _, c := range uniqueColors { + var bestColor sixelColor + var bestColorIndex int + bestScore := uint32(math.MaxUint32) + + for paletteIndex, paletteColor := range p.PaletteColors { + redDiff := c.Red - paletteColor.Red + greenDiff := c.Green - paletteColor.Green + blueDiff := c.Blue - paletteColor.Blue + alphaDiff := c.Alpha - paletteColor.Alpha + + score := (redDiff * redDiff) + (greenDiff * greenDiff) + (blueDiff * blueDiff) + (alphaDiff * alphaDiff) + if score < bestScore { + bestColor = paletteColor + bestColorIndex = paletteIndex + bestScore = score + } + } + + p.paletteIndexes[c] = bestColorIndex + p.colorConvert[c] = bestColor + } + + return p +} diff --git a/ansi/sixel/palette_test.go b/ansi/sixel/palette_test.go new file mode 100644 index 00000000..e3b2caab --- /dev/null +++ b/ansi/sixel/palette_test.go @@ -0,0 +1,124 @@ +package sixel + +import ( + "image" + "image/color" + "testing" +) + +type testCase struct { + maxColors int + expectedPalette []sixelColor +} + +func TestPaletteCreationRedGreen(t *testing.T) { + redGreen := image.NewRGBA(image.Rect(0, 0, 2, 2)) + redGreen.Set(0, 0, color.RGBA{255, 0, 0, 255}) + redGreen.Set(0, 1, color.RGBA{128, 0, 0, 255}) + redGreen.Set(1, 0, color.RGBA{0, 255, 0, 255}) + redGreen.Set(1, 1, color.RGBA{0, 128, 0, 255}) + + testCases := map[string]testCase{ + "way too many colors": { + maxColors: 16, + expectedPalette: []sixelColor{ + {100, 0, 0, 100}, + {50, 0, 0, 100}, + {0, 100, 0, 100}, + {0, 50, 0, 100}, + }, + }, + "just the right number of colors": { + maxColors: 4, + expectedPalette: []sixelColor{ + {100, 0, 0, 100}, + {50, 0, 0, 100}, + {0, 100, 0, 100}, + {0, 50, 0, 100}, + }, + }, + "color reduction": { + maxColors: 2, + expectedPalette: []sixelColor{ + {75, 0, 0, 100}, + {0, 75, 0, 100}, + }, + }, + } + + runTests(t, redGreen, testCases) +} + +func TestPaletteWithSemiTransparency(t *testing.T) { + blueAlpha := image.NewRGBA(image.Rect(0, 0, 2, 2)) + blueAlpha.Set(0, 0, color.RGBA{0, 0, 255, 255}) + blueAlpha.Set(0, 1, color.RGBA{0, 0, 128, 255}) + blueAlpha.Set(1, 0, color.RGBA{0, 0, 255, 128}) + blueAlpha.Set(1, 1, color.RGBA{0, 0, 255, 0}) + + testCases := map[string]testCase{ + "just the right number of colors": { + maxColors: 4, + expectedPalette: []sixelColor{ + {0, 0, 100, 100}, + {0, 0, 50, 100}, + {0, 0, 100, 50}, + {0, 0, 100, 0}, + }, + }, + "color reduction": { + maxColors: 2, + expectedPalette: []sixelColor{ + {0, 0, 75, 100}, + {0, 0, 100, 25}, + }, + }, + } + runTests(t, blueAlpha, testCases) +} + +func runTests(t *testing.T, img image.Image, testCases map[string]testCase) { + for testName, test := range testCases { + t.Run(testName, func(t *testing.T) { + palette := newSixelPalette(img, test.maxColors) + if len(palette.PaletteColors) != len(test.expectedPalette) { + t.Errorf("Expected colors %+v in palette, but got %+v", test.expectedPalette, palette.PaletteColors) + return + } + + for _, c := range test.expectedPalette { + var foundColor bool + for _, paletteColor := range palette.PaletteColors { + if paletteColor == c { + foundColor = true + break + } + } + + if !foundColor { + t.Errorf("Expected colors %+v in palette, but got %+v", test.expectedPalette, palette.PaletteColors) + return + } + } + + for lookupRawColor, lookupPaletteColor := range palette.colorConvert { + paletteIndex, inReverseLookup := palette.paletteIndexes[lookupRawColor] + if !inReverseLookup { + t.Errorf("Color %+v maps to color %+v in the colorConvert map, but %+v is does not have a corresponding palette index.", lookupRawColor, lookupPaletteColor, lookupPaletteColor) + return + } + + if paletteIndex >= len(palette.PaletteColors) { + t.Errorf("Image color %+v maps to palette index %d, but there are only %d palette colors.", lookupRawColor, paletteIndex, len(palette.PaletteColors)) + return + } + + colorFromPalette := palette.PaletteColors[paletteIndex] + if colorFromPalette != lookupPaletteColor { + t.Errorf("Image color %+v maps to palette color %+v and palette index %d, but palette index %d is actually palette color %+v", lookupRawColor, lookupPaletteColor, paletteIndex, paletteIndex, colorFromPalette) + return + } + } + }) + } +} diff --git a/ansi/sixel/sixel_test.go b/ansi/sixel/sixel_test.go new file mode 100644 index 00000000..3cb0744a --- /dev/null +++ b/ansi/sixel/sixel_test.go @@ -0,0 +1,161 @@ +package sixel + +import ( + "bytes" + "image" + "image/color" + "testing" +) + +func TestFullImage(t *testing.T) { + testCases := map[string]struct { + imageWidth int + imageHeight int + bandCount int + // When filling the image, we'll use a map of indices to colors and change colors every + // time the current index is in the map- this will prevent dozens of lines with the same color + // in a row and make this slightly more legible + colors map[int]color.RGBA + }{ + "3x12 single color filled": { + 3, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + "3x12 two color filled": { + 3, 12, 2, + map[int]color.RGBA{ + // 3-pixel high alternating bands + 0: {0, 0, 255, 255}, + 9: {0, 255, 0, 255}, + 18: {0, 0, 255, 255}, + 27: {0, 255, 0, 255}, + }, + }, + "3x12 8 color with right gutter": { + 3, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + 2: {0, 255, 0, 255}, + 3: {255, 0, 0, 255}, + 5: {0, 255, 0, 255}, + 6: {255, 0, 0, 255}, + 8: {0, 255, 0, 255}, + 9: {0, 0, 255, 255}, + 11: {128, 128, 0, 255}, + 12: {0, 0, 255, 255}, + 14: {128, 128, 0, 255}, + 15: {0, 0, 255, 255}, + 17: {128, 128, 0, 255}, + 18: {0, 128, 128, 255}, + 20: {128, 0, 128, 255}, + 21: {0, 128, 128, 255}, + 23: {128, 0, 128, 255}, + 24: {0, 128, 128, 255}, + 26: {128, 0, 128, 255}, + 27: {64, 0, 0, 255}, + 29: {0, 64, 0, 255}, + 30: {64, 0, 0, 255}, + 32: {0, 64, 0, 255}, + 33: {64, 0, 0, 255}, + 35: {0, 64, 0, 255}, + }, + }, + "3x12 single color with transparent band in the middle": { + 3, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + 15: {0, 0, 0, 0}, + 21: {255, 0, 0, 255}, + }, + }, + "3x5 single color": { + 3, 5, 1, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + "12x4 single color use RLE": { + 12, 4, 1, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + "12x1 two color use RLE": { + 12, 1, 1, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + 6: {0, 255, 0, 255}, + }, + }, + "12x12 single color use RLE": { + 12, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + } + + for testName, testCase := range testCases { + t.Run(testName, func(t *testing.T) { + img := image.NewRGBA(image.Rect(0, 0, testCase.imageWidth, testCase.imageHeight)) + + currentColor := color.RGBA{0, 0, 0, 0} + for y := 0; y < testCase.imageHeight; y++ { + for x := 0; x < testCase.imageWidth; x++ { + index := y*testCase.imageWidth + x + newColor, changingColor := testCase.colors[index] + if changingColor { + currentColor = newColor + } + + img.Set(x, y, currentColor) + } + } + + buffer := bytes.NewBuffer(nil) + encoder := Encoder{} + decoder := Decoder{} + + err := encoder.Encode(buffer, img) + if err != nil { + t.Errorf("Unexpected error: %+v", err) + return + } + + compareImg, err := decoder.Decode(buffer.Bytes()) + if err != nil { + t.Errorf("Unexpected error: %+v", err) + return + } + + expectedWidth := img.Bounds().Dx() + expectedHeight := img.Bounds().Dy() + actualWidth := compareImg.Bounds().Dx() + actualHeight := compareImg.Bounds().Dy() + + if actualHeight != expectedHeight { + t.Errorf("SixelImage had a height of %d, but a height of %d was expected", actualHeight, expectedHeight) + return + } + if actualWidth != expectedWidth { + t.Errorf("SixelImage had a width of %d, but a width of %d was expected", actualWidth, expectedWidth) + return + } + + for y := 0; y < expectedHeight; y++ { + for x := 0; x < expectedWidth; x++ { + r, g, b, a := compareImg.At(x, y).RGBA() + expectedR, expectedG, expectedB, expectedA := img.At(x, y).RGBA() + + if r != expectedR || g != expectedG || b != expectedB || a != expectedA { + t.Errorf("SixelImage had color (%d,%d,%d,%d) at coordinates (%d,%d), but color (%d,%d,%d,%d) was expected", + r, g, b, a, x, y, expectedR, expectedG, expectedB, expectedA) + return + } + } + } + }) + } +} From d44fac5e5467e686fb157df3c2f3ee4a323bbae6 Mon Sep 17 00:00:00 2001 From: Stephen Baynham Date: Sat, 1 Feb 2025 10:06:27 -0800 Subject: [PATCH 02/36] scanSize tests --- ansi/sixel/decoder.go | 2 +- ansi/sixel/sixel_test.go | 46 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index 68a66c09..bf5f0f5f 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -447,7 +447,7 @@ func (d *Decoder) scanSize(data []byte) (int, int) { // // a ! is a RLE indicator, and we should add the numeral to the current width var currentWidth int - var newBand bool + newBand := true for { b, err := buffer.ReadByte() if err != nil { diff --git a/ansi/sixel/sixel_test.go b/ansi/sixel/sixel_test.go index 3cb0744a..d18400c5 100644 --- a/ansi/sixel/sixel_test.go +++ b/ansi/sixel/sixel_test.go @@ -7,6 +7,52 @@ import ( "testing" ) +func TestScanSize(t *testing.T) { + testCases := map[string]struct { + data string + expectedWidth int + expectedHeight int + }{ + "two lines": { + "~~~~~~-~~~~~~-", 6, 12, + }, + "two lines no newline at end": { + "~~~~~~-~~~~~~", 6, 12, + }, + "no pixels": { + "", 0, 0, + }, + "smaller carriage returns": { + "~$~~$~~~$~~~~$~~~~~$~~~~~~", 6, 6, + }, + "transparent": { + "??????", 6, 6, + }, + "RLE": { + "??!20?", 22, 6, + }, + "Colors": { + "#0;2;0;0;0~~~~~$#1;2;100;100;100;~~~~~~-#0~~~~~~-#1~~~~~~", 6, 18, + }, + } + + for testName, testCase := range testCases { + t.Run(testName, func(t *testing.T) { + decoder := &Decoder{} + width, height := decoder.scanSize([]byte(testCase.data)) + if width != testCase.expectedWidth { + t.Errorf("expected width of %d, but received width of %d", testCase.expectedWidth, width) + return + } + + if height != testCase.expectedHeight { + t.Errorf("expected height of %d, but received height of %d", testCase.expectedHeight, height) + return + } + }) + } +} + func TestFullImage(t *testing.T) { testCases := map[string]struct { imageWidth int From 16b724809db6a91a63d8e032340cee3cc64ec2f4 Mon Sep 17 00:00:00 2001 From: Stephen Baynham Date: Sat, 1 Feb 2025 15:46:17 -0800 Subject: [PATCH 03/36] Update ansi/sixel/encoder.go Co-authored-by: Ayman Bagabas --- ansi/sixel/encoder.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index ef60eea5..4eaf4358 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -21,10 +21,12 @@ import ( // band has been drawn, at which time a line break is written to begin the next band. const ( - sixelLineBreak byte = '-' - sixelCarriageReturn byte = '$' - sixelRepeat byte = '!' - sixelUseColor byte = '#' + LineBreak = '-' + CarriageReturn = '$' + RepeatIntroducer = '!' + ColorIntroducer = '#' + RasterAttribute = '"' + ) type Options struct { From f672bee68ee291179d166a7f1e8afbeb6cbba6d6 Mon Sep 17 00:00:00 2001 From: Stephen Baynham Date: Sat, 1 Feb 2025 15:46:24 -0800 Subject: [PATCH 04/36] Update ansi/graphics.go Co-authored-by: Ayman Bagabas --- ansi/graphics.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansi/graphics.go b/ansi/graphics.go index a2504cbc..0243870b 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -29,7 +29,7 @@ import ( // size, as far as I can tell. // // See https://shuford.invisible-island.net/all_about_sixels.txt -func SixelGraphics(payload []byte) string { +func SixelGraphics(p1, p2, p3 int, payload []byte) string { var buf bytes.Buffer buf.WriteString("\x1bP0;1;0;q") From 9734d1f1224840ab724960e9d317b80f4d1e2290 Mon Sep 17 00:00:00 2001 From: Stephen Baynham Date: Sat, 1 Feb 2025 15:55:54 -0800 Subject: [PATCH 05/36] pr comments --- ansi/graphics.go | 11 +++++++++-- ansi/sixel/decoder.go | 10 +++++----- ansi/sixel/encoder.go | 24 ++++++++++++------------ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/ansi/graphics.go b/ansi/graphics.go index 0243870b..d76657c6 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -8,6 +8,7 @@ import ( "image" "io" "os" + "strconv" "strings" "github.com/charmbracelet/x/ansi/kitty" @@ -32,7 +33,13 @@ import ( func SixelGraphics(p1, p2, p3 int, payload []byte) string { var buf bytes.Buffer - buf.WriteString("\x1bP0;1;0;q") + buf.WriteString("\x1bP") + buf.WriteString(strconv.Itoa(p1)) + buf.WriteByte(';') + buf.WriteString(strconv.Itoa(p2)) + buf.WriteByte(';') + buf.WriteString(strconv.Itoa(p3)) + buf.WriteString(";q") buf.Write(payload) buf.WriteString("\x1b\\") @@ -54,7 +61,7 @@ func WriteSixelGraphics(w io.Writer, m image.Image, o *sixel.Options) error { return fmt.Errorf("failed to encode sixel image: %w", err) } - _, err := io.WriteString(w, SixelGraphics(data.Bytes())) + _, err := io.WriteString(w, SixelGraphics(0, 1, 0, data.Bytes())) return err } diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index bf5f0f5f..b75a6388 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -302,7 +302,7 @@ func (d *Decoder) Decode(data []byte) (image.Image, error) { } var bounds image.Rectangle - if b == '"' { + if b == RasterAttribute { var fixedWidth, fixedHeight int // We have pixel dimensions _, err := fmt.Fscanf(buffer, "1;1;%d;%d", &fixedWidth, &fixedHeight) @@ -331,7 +331,7 @@ func (d *Decoder) Decode(data []byte) (image.Image, error) { } // Palette operation - if b == sixelUseColor { + if b == ColorIntroducer { _, err = fmt.Fscan(buffer, ¤tPaletteIndex) if err != nil { return img, d.readError(err) @@ -370,21 +370,21 @@ func (d *Decoder) Decode(data []byte) (image.Image, error) { } // LF - if b == sixelLineBreak { + if b == LineBreak { currentBandY++ currentX = 0 continue } // CR - if b == sixelCarriageReturn { + if b == CarriageReturn { currentX = 0 continue } // RLE operation count := 1 - if b == sixelRepeat { + if b == RepeatIntroducer { _, err = fmt.Fscan(buffer, &count) if err != nil { return img, d.readError(err) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index 4eaf4358..fed900ef 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -21,12 +21,11 @@ import ( // band has been drawn, at which time a line break is written to begin the next band. const ( - LineBreak = '-' - CarriageReturn = '$' - RepeatIntroducer = '!' - ColorIntroducer = '#' - RasterAttribute = '"' - + LineBreak = '-' + CarriageReturn = '$' + RepeatIntroducer = '!' + ColorIntroducer = '#' + RasterAttribute = '"' ) type Options struct { @@ -46,7 +45,8 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { imageBounds := img.Bounds() - io.WriteString(w, "\"1;1;") //nolint:errcheck + w.Write([]byte{RasterAttribute}) //nolint:errcheck + io.WriteString(w, "1;1;") //nolint:errcheck io.WriteString(w, strconv.Itoa(imageBounds.Dx())) //nolint:errcheck w.Write([]byte{';'}) //nolint:errcheck io.WriteString(w, strconv.Itoa(imageBounds.Dy())) //nolint:errcheck @@ -80,7 +80,7 @@ func (e *Encoder) encodePaletteColor(w io.Writer, paletteIndex int, c sixelColor // d = G // e = B - w.Write([]byte{sixelUseColor}) //nolint:errcheck + w.Write([]byte{ColorIntroducer}) //nolint:errcheck io.WriteString(w, strconv.Itoa(paletteIndex)) //nolint:errcheck io.WriteString(w, ";2;") io.WriteString(w, strconv.Itoa(int(c.Red))) //nolint:errcheck @@ -157,7 +157,7 @@ func (s *sixelBuilder) GeneratePixels() string { for bandY := 0; bandY < bandHeight; bandY++ { if bandY > 0 { - s.writeControlRune(sixelLineBreak) + s.writeControlRune(LineBreak) } hasWrittenAColor := false @@ -178,11 +178,11 @@ func (s *sixelBuilder) GeneratePixels() string { } if hasWrittenAColor { - s.writeControlRune(sixelCarriageReturn) + s.writeControlRune(CarriageReturn) } hasWrittenAColor = true - s.writeControlRune(sixelUseColor) + s.writeControlRune(ColorIntroducer) s.imageData.WriteString(strconv.Itoa(paletteIndex)) for x := 0; x < s.imageWidth; x += 4 { bit := firstColorBit + uint(x*6) @@ -252,7 +252,7 @@ func (s *sixelBuilder) flushRepeats() { // Only write using the RLE form if it's actually providing space savings if s.repeatCount > 3 { countStr := strconv.Itoa(s.repeatCount) - s.imageData.WriteByte(sixelRepeat) + s.imageData.WriteByte(RepeatIntroducer) s.imageData.WriteString(countStr) s.imageData.WriteRune(s.repeatRune) return From 41a45583ce71d095e25b9508770d50c55e446efd Mon Sep 17 00:00:00 2001 From: Stephen Baynham Date: Sat, 1 Feb 2025 16:04:36 -0800 Subject: [PATCH 06/36] raster/parseraster --- ansi/sixel/decoder.go | 7 ++++++- ansi/sixel/encoder.go | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index b75a6388..e780648a 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -283,6 +283,11 @@ func buildDefaultDecodePalette() map[int]color.Color { type Decoder struct { } +func ParseRaster(data io.Reader) (pan, pad, ph, pv int, err error) { + _, err = fmt.Fscanf(data, "%d;%d;%d;%d", &pan, &pad, &ph, &pv) + return +} + // Decode will parse sixel image data into an image or return an error. Because // the sixel image format does not have a predictable size, the end of the sixel // image data can only be identified when ST, ESC, or BEL has been read from a reader. @@ -305,7 +310,7 @@ func (d *Decoder) Decode(data []byte) (image.Image, error) { if b == RasterAttribute { var fixedWidth, fixedHeight int // We have pixel dimensions - _, err := fmt.Fscanf(buffer, "1;1;%d;%d", &fixedWidth, &fixedHeight) + _, _, fixedWidth, fixedHeight, err := ParseRaster(buffer) if err != nil { return nil, d.readError(err) } diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index fed900ef..a706d40f 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -1,6 +1,7 @@ package sixel import ( + "fmt" "image" "image/color" "io" @@ -21,11 +22,11 @@ import ( // band has been drawn, at which time a line break is written to begin the next band. const ( - LineBreak = '-' - CarriageReturn = '$' - RepeatIntroducer = '!' - ColorIntroducer = '#' - RasterAttribute = '"' + LineBreak byte = '-' + CarriageReturn byte = '$' + RepeatIntroducer byte = '!' + ColorIntroducer byte = '#' + RasterAttribute byte = '"' ) type Options struct { @@ -34,6 +35,10 @@ type Options struct { type Encoder struct { } +func Raster(pan, pad, ph, pv int) string { + return fmt.Sprintf("%s%d;%d;%d;%d", string(RasterAttribute), pan, pad, ph, pv) +} + // Encode will accept an Image and write sixel data to a Writer. The sixel data // will be everything after the 'q' that ends the DCS parameters and before the ST // that ends the sequence. That means it includes the pixel metrics and color @@ -45,11 +50,7 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { imageBounds := img.Bounds() - w.Write([]byte{RasterAttribute}) //nolint:errcheck - io.WriteString(w, "1;1;") //nolint:errcheck - io.WriteString(w, strconv.Itoa(imageBounds.Dx())) //nolint:errcheck - w.Write([]byte{';'}) //nolint:errcheck - io.WriteString(w, strconv.Itoa(imageBounds.Dy())) //nolint:errcheck + io.WriteString(w, Raster(1, 1, imageBounds.Dx(), imageBounds.Dy())) //nolint:errcheck palette := newSixelPalette(img, sixelMaxColors) From 8705df7cf4a32da68d8167ee18925f3c26277d73 Mon Sep 17 00:00:00 2001 From: Stephen Baynham Date: Sat, 1 Feb 2025 16:14:09 -0800 Subject: [PATCH 07/36] repeat/parserepeat --- ansi/sixel/decoder.go | 13 ++++++------- ansi/sixel/encoder.go | 13 +++++++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index e780648a..185115f5 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -288,6 +288,11 @@ func ParseRaster(data io.Reader) (pan, pad, ph, pv int, err error) { return } +func ParseRepeat(data io.Reader) (count int, r byte, err error) { + _, err = fmt.Fscanf(data, "%d%b", &count, &r) + return +} + // Decode will parse sixel image data into an image or return an error. Because // the sixel image format does not have a predictable size, the end of the sixel // image data can only be identified when ST, ESC, or BEL has been read from a reader. @@ -390,13 +395,7 @@ func (d *Decoder) Decode(data []byte) (image.Image, error) { // RLE operation count := 1 if b == RepeatIntroducer { - _, err = fmt.Fscan(buffer, &count) - if err != nil { - return img, d.readError(err) - } - - // The next byte SHOULD be a pixel - b, err = buffer.ReadByte() + count, b, err = ParseRepeat(buffer) if err != nil { return img, d.readError(err) } diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index a706d40f..eb77e689 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -39,6 +39,14 @@ func Raster(pan, pad, ph, pv int) string { return fmt.Sprintf("%s%d;%d;%d;%d", string(RasterAttribute), pan, pad, ph, pv) } +func Repeat(count int, repeatRune rune) string { + var sb strings.Builder + sb.WriteByte(RepeatIntroducer) + sb.WriteString(strconv.Itoa(count)) + sb.WriteRune(repeatRune) + return sb.String() +} + // Encode will accept an Image and write sixel data to a Writer. The sixel data // will be everything after the 'q' that ends the DCS parameters and before the ST // that ends the sequence. That means it includes the pixel metrics and color @@ -252,10 +260,7 @@ func (s *sixelBuilder) flushRepeats() { // Only write using the RLE form if it's actually providing space savings if s.repeatCount > 3 { - countStr := strconv.Itoa(s.repeatCount) - s.imageData.WriteByte(RepeatIntroducer) - s.imageData.WriteString(countStr) - s.imageData.WriteRune(s.repeatRune) + s.imageData.WriteString(Repeat(s.repeatCount, s.repeatRune)) return } From 01e9042e83d0bb1a5eefcf8fbe528c95ba912a12 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 16:49:58 -0300 Subject: [PATCH 08/36] remove sixel.Options and address pX conditional --- ansi/graphics.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ansi/graphics.go b/ansi/graphics.go index d76657c6..83a2f142 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -34,11 +34,17 @@ func SixelGraphics(p1, p2, p3 int, payload []byte) string { var buf bytes.Buffer buf.WriteString("\x1bP") - buf.WriteString(strconv.Itoa(p1)) + if p1 >= 0 { + buf.WriteString(strconv.Itoa(p1)) + } buf.WriteByte(';') - buf.WriteString(strconv.Itoa(p2)) + if p2 >= 0 { + buf.WriteString(strconv.Itoa(p2)) + } buf.WriteByte(';') - buf.WriteString(strconv.Itoa(p3)) + if p3 >= 0 { + buf.WriteString(strconv.Itoa(p3)) + } buf.WriteString(";q") buf.Write(payload) buf.WriteString("\x1b\\") @@ -49,11 +55,7 @@ func SixelGraphics(p1, p2, p3 int, payload []byte) string { // WriteSixelGraphics encodes an image as sixels into the provided io.Writer. // Options is provided in expectation of future options (such as dithering), but // none are yet implemented. o can be nil to use the default options. -func WriteSixelGraphics(w io.Writer, m image.Image, o *sixel.Options) error { - if o == nil { - o = &sixel.Options{} - } - +func WriteSixelGraphics(w io.Writer, m image.Image) error { e := &sixel.Encoder{} data := bytes.NewBuffer(nil) From 59b77441ac31815dec4bd73c6d9d4c0d7ccb535e Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:12:48 -0300 Subject: [PATCH 09/36] remove WriteSixelGraphics func --- ansi/graphics.go | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/ansi/graphics.go b/ansi/graphics.go index 83a2f142..c2e3b4f6 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -12,7 +12,6 @@ import ( "strings" "github.com/charmbracelet/x/ansi/kitty" - "github.com/charmbracelet/x/ansi/sixel" ) // SixelGraphics returns a sequence that encodes the given sixel image payload to @@ -52,21 +51,6 @@ func SixelGraphics(p1, p2, p3 int, payload []byte) string { return buf.String() } -// WriteSixelGraphics encodes an image as sixels into the provided io.Writer. -// Options is provided in expectation of future options (such as dithering), but -// none are yet implemented. o can be nil to use the default options. -func WriteSixelGraphics(w io.Writer, m image.Image) error { - e := &sixel.Encoder{} - - data := bytes.NewBuffer(nil) - if err := e.Encode(data, m); err != nil { - return fmt.Errorf("failed to encode sixel image: %w", err) - } - - _, err := io.WriteString(w, SixelGraphics(0, 1, 0, data.Bytes())) - return err -} - // KittyGraphics returns a sequence that encodes the given image in the Kitty // graphics protocol. // From 693be272123919c66bc78f8801136368a1efcf80 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:17:24 -0300 Subject: [PATCH 10/36] ignore p3 --- ansi/graphics.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ansi/graphics.go b/ansi/graphics.go index c2e3b4f6..bdd5cdfb 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -41,10 +41,11 @@ func SixelGraphics(p1, p2, p3 int, payload []byte) string { buf.WriteString(strconv.Itoa(p2)) } buf.WriteByte(';') - if p3 >= 0 { + if p3 > 0 { + buf.WriteByte(';') buf.WriteString(strconv.Itoa(p3)) } - buf.WriteString(";q") + buf.WriteString("q") buf.Write(payload) buf.WriteString("\x1b\\") From 0f4f1028e8c300692e67f33d2fdf205f270f59a0 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:37:21 -0300 Subject: [PATCH 11/36] move back to ;q --- ansi/graphics.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ansi/graphics.go b/ansi/graphics.go index bdd5cdfb..b3b37ea3 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -40,12 +40,11 @@ func SixelGraphics(p1, p2, p3 int, payload []byte) string { if p2 >= 0 { buf.WriteString(strconv.Itoa(p2)) } - buf.WriteByte(';') if p3 > 0 { buf.WriteByte(';') buf.WriteString(strconv.Itoa(p3)) } - buf.WriteString("q") + buf.WriteString(";q") buf.Write(payload) buf.WriteString("\x1b\\") From 2a70985a385c0b1225d9c67a57f3bb5d87077653 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:39:50 -0300 Subject: [PATCH 12/36] use byte instead of rune --- ansi/sixel/encoder.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index eb77e689..f7530e90 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -115,7 +115,7 @@ type sixelBuilder struct { pixelBands bitset.BitSet imageData strings.Builder - repeatRune rune + repeatByte byte repeatCount int } @@ -228,14 +228,14 @@ func (s *sixelBuilder) GeneratePixels() string { // writeImageRune will write a single line of six pixels to pixel data. The data // doesn't get written to the imageData, it gets buffered for the purposes of RLE -func (s *sixelBuilder) writeImageRune(r rune) { - if r == s.repeatRune { +func (s *sixelBuilder) writeImageRune(r byte) { + if r == s.repeatByte { s.repeatCount++ return } s.flushRepeats() - s.repeatRune = r + s.repeatByte = r s.repeatCount = 1 } @@ -245,7 +245,7 @@ func (s *sixelBuilder) writeControlRune(r byte) { if s.repeatCount > 0 { s.flushRepeats() s.repeatCount = 0 - s.repeatRune = 0 + s.repeatByte = 0 } s.imageData.WriteByte(r) From ce91bcb2ef6b6604bf847ec7280ebe1b38475567 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:44:23 -0300 Subject: [PATCH 13/36] remove WriteString --- ansi/graphics.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansi/graphics.go b/ansi/graphics.go index b3b37ea3..a3545b21 100644 --- a/ansi/graphics.go +++ b/ansi/graphics.go @@ -44,7 +44,7 @@ func SixelGraphics(p1, p2, p3 int, payload []byte) string { buf.WriteByte(';') buf.WriteString(strconv.Itoa(p3)) } - buf.WriteString(";q") + buf.WriteByte('q') buf.Write(payload) buf.WriteString("\x1b\\") From af13a23c27fec7f790ca1b3cd5c8d7619ba3bb59 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:50:50 -0300 Subject: [PATCH 14/36] remove slices --- ansi/sixel/palette.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go index c7908fcb..849a3ec8 100644 --- a/ansi/sixel/palette.go +++ b/ansi/sixel/palette.go @@ -6,7 +6,6 @@ import ( "image" "image/color" "math" - "slices" ) // sixelPalette is a palette of up to 256 colors that lists the colors that will be used by @@ -185,7 +184,7 @@ func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixel cubeToSplit := heap.Pop(&cubeHeap).(quantizationCube) // Sort the colors in the bucket's range along the cube's longest color axis - slices.SortFunc(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], + sort.SliceFunc(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], func(left sixelColor, right sixelColor) int { switch cubeToSplit.sliceChannel { case quantizationRed: From d68cbadcded47a160f762022ef2b89b33a4747fb Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:56:02 -0300 Subject: [PATCH 15/36] use Compare and isNan from 1.24 --- ansi/sixel/palette.go | 44 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go index 849a3ec8..323141ca 100644 --- a/ansi/sixel/palette.go +++ b/ansi/sixel/palette.go @@ -1,7 +1,6 @@ package sixel import ( - "cmp" "container/heap" "image" "image/color" @@ -160,6 +159,41 @@ func (p *sixelPalette) createCube(uniqueColors []sixelColor, pixelCounts map[six return cube } +type Ordered interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 | + ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | + ~float32 | ~float64 | + ~string +} + + +// isNaN reports whether x is a NaN without requiring the math package. +// This will always return false if T is not floating-point. +func isNaN[T Ordered](x T) bool { + return x != x +} + +func Compare[T Ordered](x, y T) int { + xNaN := isNaN(x) + yNaN := isNaN(y) + if xNaN { + if yNaN { + return 0 + } + return -1 + } + if yNaN { + return +1 + } + if x < y { + return -1 + } + if x > y { + return +1 + } + return 0 +} + // quantize is a method that will initialize the palette's colors and lookups, provided a set // of unique colors and a map containing pixel counts for those colors func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, maxColors int) { @@ -188,13 +222,13 @@ func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixel func(left sixelColor, right sixelColor) int { switch cubeToSplit.sliceChannel { case quantizationRed: - return cmp.Compare(left.Red, right.Red) + return Compare(left.Red, right.Red) case quantizationGreen: - return cmp.Compare(left.Green, right.Green) + return Compare(left.Green, right.Green) case quantizationBlue: - return cmp.Compare(left.Blue, right.Blue) + return Compare(left.Blue, right.Blue) default: - return cmp.Compare(left.Alpha, right.Alpha) + return Compare(left.Alpha, right.Alpha) } }) From e3b87803949d63880437fe78a4c0f0820e57df53 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:58:48 -0300 Subject: [PATCH 16/36] fixup! use Compare and isNan from 1.24 --- ansi/sixel/encoder.go | 8 ++++---- ansi/sixel/palette.go | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index f7530e90..18b91404 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -197,10 +197,10 @@ func (s *sixelBuilder) GeneratePixels() string { bit := firstColorBit + uint(x*6) word := s.pixelBands.GetWord64AtBit(bit) - pixel1 := rune((word & 63) + '?') - pixel2 := rune(((word >> 6) & 63) + '?') - pixel3 := rune(((word >> 12) & 63) + '?') - pixel4 := rune(((word >> 18) & 63) + '?') + pixel1 := byte((word & 63) + '?') + pixel2 := byte(((word >> 6) & 63) + '?') + pixel3 := byte(((word >> 12) & 63) + '?') + pixel4 := byte(((word >> 18) & 63) + '?') s.writeImageRune(pixel1) diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go index 323141ca..b86f1e42 100644 --- a/ansi/sixel/palette.go +++ b/ansi/sixel/palette.go @@ -5,6 +5,7 @@ import ( "image" "image/color" "math" + "sort" ) // sixelPalette is a palette of up to 256 colors that lists the colors that will be used by From 394b1459c188c4daa877d36c8abbbb6bc07dbaa2 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 17:59:51 -0300 Subject: [PATCH 17/36] fixup! fixup! use Compare and isNan from 1.24 --- ansi/sixel/palette.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go index b86f1e42..c59da523 100644 --- a/ansi/sixel/palette.go +++ b/ansi/sixel/palette.go @@ -160,7 +160,7 @@ func (p *sixelPalette) createCube(uniqueColors []sixelColor, pixelCounts map[six return cube } -type Ordered interface { +type ordered interface { ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64 | @@ -170,11 +170,11 @@ type Ordered interface { // isNaN reports whether x is a NaN without requiring the math package. // This will always return false if T is not floating-point. -func isNaN[T Ordered](x T) bool { +func isNaN[T ordered](x T) bool { return x != x } -func Compare[T Ordered](x, y T) int { +func compare[T ordered](x, y T) int { xNaN := isNaN(x) yNaN := isNaN(y) if xNaN { @@ -223,13 +223,13 @@ func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixel func(left sixelColor, right sixelColor) int { switch cubeToSplit.sliceChannel { case quantizationRed: - return Compare(left.Red, right.Red) + return compare(left.Red, right.Red) case quantizationGreen: - return Compare(left.Green, right.Green) + return compare(left.Green, right.Green) case quantizationBlue: - return Compare(left.Blue, right.Blue) + return compare(left.Blue, right.Blue) default: - return Compare(left.Alpha, right.Alpha) + return compare(left.Alpha, right.Alpha) } }) From 39755ba5101ef19ea31d9733053d9a69b85339bd Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 18:04:59 -0300 Subject: [PATCH 18/36] fixup! fixup! fixup! use Compare and isNan from 1.24 --- ansi/sixel/encoder.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index 18b91404..d739a992 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -39,11 +39,11 @@ func Raster(pan, pad, ph, pv int) string { return fmt.Sprintf("%s%d;%d;%d;%d", string(RasterAttribute), pan, pad, ph, pv) } -func Repeat(count int, repeatRune rune) string { +func Repeat(count int, repeatByte byte) string { var sb strings.Builder sb.WriteByte(RepeatIntroducer) sb.WriteString(strconv.Itoa(count)) - sb.WriteRune(repeatRune) + sb.WriteByte(repeatByte) return sb.String() } @@ -251,7 +251,7 @@ func (s *sixelBuilder) writeControlRune(r byte) { s.imageData.WriteByte(r) } -// flushRepeats is used to actually write the current repeatRune to the imageData when +// flushRepeats is used to actually write the current repeatByte to the imageData when // it is about to change. This buffering is used to manage RLE in the sixelBuilder func (s *sixelBuilder) flushRepeats() { if s.repeatCount == 0 { @@ -260,11 +260,11 @@ func (s *sixelBuilder) flushRepeats() { // Only write using the RLE form if it's actually providing space savings if s.repeatCount > 3 { - s.imageData.WriteString(Repeat(s.repeatCount, s.repeatRune)) + s.imageData.WriteString(Repeat(s.repeatCount, s.repeatByte)) return } for i := 0; i < s.repeatCount; i++ { - s.imageData.WriteRune(s.repeatRune) + s.imageData.WriteByte(s.repeatByte) } } From d53c02c5f7ceb2334327a1c4f89a6c5f53a95614 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Wed, 19 Feb 2025 18:40:16 -0300 Subject: [PATCH 19/36] remove code --- ansi/sixel/palette.go | 49 +++++++------------------------------------ 1 file changed, 8 insertions(+), 41 deletions(-) diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go index c59da523..cf9cf1b1 100644 --- a/ansi/sixel/palette.go +++ b/ansi/sixel/palette.go @@ -160,41 +160,6 @@ func (p *sixelPalette) createCube(uniqueColors []sixelColor, pixelCounts map[six return cube } -type ordered interface { - ~int | ~int8 | ~int16 | ~int32 | ~int64 | - ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | - ~float32 | ~float64 | - ~string -} - - -// isNaN reports whether x is a NaN without requiring the math package. -// This will always return false if T is not floating-point. -func isNaN[T ordered](x T) bool { - return x != x -} - -func compare[T ordered](x, y T) int { - xNaN := isNaN(x) - yNaN := isNaN(y) - if xNaN { - if yNaN { - return 0 - } - return -1 - } - if yNaN { - return +1 - } - if x < y { - return -1 - } - if x > y { - return +1 - } - return 0 -} - // quantize is a method that will initialize the palette's colors and lookups, provided a set // of unique colors and a map containing pixel counts for those colors func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, maxColors int) { @@ -219,17 +184,19 @@ func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixel cubeToSplit := heap.Pop(&cubeHeap).(quantizationCube) // Sort the colors in the bucket's range along the cube's longest color axis - sort.SliceFunc(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], - func(left sixelColor, right sixelColor) int { + // TODO: Use slices.SortFunc in the future + sort.SliceStable(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], + func(i, j int) bool { + slice := uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length] switch cubeToSplit.sliceChannel { case quantizationRed: - return compare(left.Red, right.Red) + return slice[i].Red < slice[j].Red case quantizationGreen: - return compare(left.Green, right.Green) + return slice[i].Green < slice[j].Green case quantizationBlue: - return compare(left.Blue, right.Blue) + return slice[i].Blue < slice[j].Blue default: - return compare(left.Alpha, right.Alpha) + return slice[i].Alpha < slice[j].Alpha } }) From 226b4c24da6964bf6a63866117b15222c31e4f30 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Thu, 20 Feb 2025 15:25:30 -0300 Subject: [PATCH 20/36] add bench --- .gitignore | 3 + .../graphics/JigokudaniMonkeyPark.png | Bin 0 -> 698785 bytes ansi/go.mod | 2 + ansi/go.sum | 4 + ansi/sixel/bench_test.go | 69 ++++++++++++++++++ 5 files changed, 78 insertions(+) create mode 100644 ansi/fixtures/graphics/JigokudaniMonkeyPark.png create mode 100644 ansi/sixel/bench_test.go diff --git a/.gitignore b/.gitignore index 398516f2..a2f7b2eb 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ testdata *.png + +# Allow graphics used for bench test +!ansi/fixtures/graphics/*.png \ No newline at end of file diff --git a/ansi/fixtures/graphics/JigokudaniMonkeyPark.png b/ansi/fixtures/graphics/JigokudaniMonkeyPark.png new file mode 100644 index 0000000000000000000000000000000000000000..14db9c97291a41cbbf84b63118c42f2e062d67bb GIT binary patch literal 698785 zcmV)?K!U%CP)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ500006 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

-j+F(G&e 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

67pHy1 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∨!xQ%R(cEKpRurRrPdq)jD-;W)p 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 Date: Thu, 20 Feb 2025 15:30:55 -0300 Subject: [PATCH 21/36] rename file --- ansi/sixel/{bench_test.go => sixel_bench_test.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ansi/sixel/{bench_test.go => sixel_bench_test.go} (100%) diff --git a/ansi/sixel/bench_test.go b/ansi/sixel/sixel_bench_test.go similarity index 100% rename from ansi/sixel/bench_test.go rename to ansi/sixel/sixel_bench_test.go From f1a551f4452ad4bd1c670aef68d0952c11cc1b19 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Thu, 20 Feb 2025 17:42:50 -0300 Subject: [PATCH 22/36] add palette_sort --- ansi/sixel/palette.go | 29 +- ansi/sixel/palette_sort.go | 550 +++++++++++++++++++++++++++++++++++++ 2 files changed, 571 insertions(+), 8 deletions(-) create mode 100644 ansi/sixel/palette_sort.go diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go index cf9cf1b1..d58f438b 100644 --- a/ansi/sixel/palette.go +++ b/ansi/sixel/palette.go @@ -5,7 +5,6 @@ import ( "image" "image/color" "math" - "sort" ) // sixelPalette is a palette of up to 256 colors that lists the colors that will be used by @@ -185,18 +184,32 @@ func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixel // Sort the colors in the bucket's range along the cube's longest color axis // TODO: Use slices.SortFunc in the future - sort.SliceStable(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], - func(i, j int) bool { - slice := uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length] + // sort.SliceStable(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], + // func(i, j int) bool { + // slice := uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length] + // switch cubeToSplit.sliceChannel { + // case quantizationRed: + // return slice[i].Red < slice[j].Red + // case quantizationGreen: + // return slice[i].Green < slice[j].Green + // case quantizationBlue: + // return slice[i].Blue < slice[j].Blue + // default: + // return slice[i].Alpha < slice[j].Alpha + // } + // }) + + sortFunc(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], + func(left sixelColor, right sixelColor) int { switch cubeToSplit.sliceChannel { case quantizationRed: - return slice[i].Red < slice[j].Red + return compare(left.Red, right.Red) case quantizationGreen: - return slice[i].Green < slice[j].Green + return compare(left.Green, right.Green) case quantizationBlue: - return slice[i].Blue < slice[j].Blue + return compare(left.Blue, right.Blue) default: - return slice[i].Alpha < slice[j].Alpha + return compare(left.Alpha, right.Alpha) } }) diff --git a/ansi/sixel/palette_sort.go b/ansi/sixel/palette_sort.go new file mode 100644 index 00000000..902bdcd9 --- /dev/null +++ b/ansi/sixel/palette_sort.go @@ -0,0 +1,550 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package sixel + +import ( + "math/bits" +) + +const ( + unknownHint sortedHint = iota + increasingHint + decreasingHint +) + +type ordered interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 | + ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | + ~float32 | ~float64 | + ~string +} + +// Compare returns +// +// -1 if x is less than y, +// 0 if x equals y, +// +1 if x is greater than y. +// +// For floating-point types, a NaN is considered less than any non-NaN, +// a NaN is considered equal to a NaN, and -0.0 is equal to 0.0. +func compare[T ordered](x, y T) int { + xNaN := isNaN(x) + yNaN := isNaN(y) + if xNaN { + if yNaN { + return 0 + } + return -1 + } + if yNaN { + return +1 + } + if x < y { + return -1 + } + if x > y { + return +1 + } + return 0 +} + +// isNaN reports whether x is a NaN without requiring the math package. +// This will always return false if T is not floating-point. +func isNaN[T ordered](x T) bool { + return x != x +} + +func sortFunc[S ~[]E, E any](x S, cmp func(a, b E) int) { + n := len(x) + pdqsortCmpFunc(x, 0, n, bits.Len(uint(n)), cmp) +} + +type sortedHint int // hint for pdqsort when choosing the pivot + +// xorshift paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf +type xorshift uint64 + +func (r *xorshift) Next() uint64 { + *r ^= *r << 13 + *r ^= *r >> 7 + *r ^= *r << 17 + return uint64(*r) +} + +func nextPowerOfTwo(length int) uint { + return 1 << bits.Len(uint(length)) +} + +// insertionSortCmpFunc sorts data[a:b] using insertion sort. +func insertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + for i := a + 1; i < b; i++ { + for j := i; j > a && (cmp(data[j], data[j-1]) < 0); j-- { + data[j], data[j-1] = data[j-1], data[j] + } + } +} + +// siftDownCmpFunc implements the heap property on data[lo:hi]. +// first is an offset into the array where the root of the heap lies. +func siftDownCmpFunc[E any](data []E, lo, hi, first int, cmp func(a, b E) int) { + root := lo + for { + child := 2*root + 1 + if child >= hi { + break + } + if child+1 < hi && (cmp(data[first+child], data[first+child+1]) < 0) { + child++ + } + if !(cmp(data[first+root], data[first+child]) < 0) { + return + } + data[first+root], data[first+child] = data[first+child], data[first+root] + root = child + } +} + +func heapSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + first := a + lo := 0 + hi := b - a + + // Build heap with greatest element at top. + for i := (hi - 1) / 2; i >= 0; i-- { + siftDownCmpFunc(data, i, hi, first, cmp) + } + + // Pop elements, largest first, into end of data. + for i := hi - 1; i >= 0; i-- { + data[first], data[first+i] = data[first+i], data[first] + siftDownCmpFunc(data, lo, i, first, cmp) + } +} + +// pdqsortCmpFunc sorts data[a:b]. +// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. +// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf +// C++ implementation: https://github.com/orlp/pdqsort +// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ +// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. +func pdqsortCmpFunc[E any](data []E, a, b, limit int, cmp func(a, b E) int) { + const maxInsertion = 12 + + var ( + wasBalanced = true // whether the last partitioning was reasonably balanced + wasPartitioned = true // whether the slice was already partitioned + ) + + for { + length := b - a + + if length <= maxInsertion { + insertionSortCmpFunc(data, a, b, cmp) + return + } + + // Fall back to heapsort if too many bad choices were made. + if limit == 0 { + heapSortCmpFunc(data, a, b, cmp) + return + } + + // If the last partitioning was imbalanced, we need to breaking patterns. + if !wasBalanced { + breakPatternsCmpFunc(data, a, b, cmp) + limit-- + } + + pivot, hint := choosePivotCmpFunc(data, a, b, cmp) + if hint == decreasingHint { + reverseRangeCmpFunc(data, a, b, cmp) + // The chosen pivot was pivot-a elements after the start of the array. + // After reversing it is pivot-a elements before the end of the array. + // The idea came from Rust's implementation. + pivot = (b - 1) - (pivot - a) + hint = increasingHint + } + + // The slice is likely already sorted. + if wasBalanced && wasPartitioned && hint == increasingHint { + if partialInsertionSortCmpFunc(data, a, b, cmp) { + return + } + } + + // Probably the slice contains many duplicate elements, partition the slice into + // elements equal to and elements greater than the pivot. + if a > 0 && !(cmp(data[a-1], data[pivot]) < 0) { + mid := partitionEqualCmpFunc(data, a, b, pivot, cmp) + a = mid + continue + } + + mid, alreadyPartitioned := partitionCmpFunc(data, a, b, pivot, cmp) + wasPartitioned = alreadyPartitioned + + leftLen, rightLen := mid-a, b-mid + balanceThreshold := length / 8 + if leftLen < rightLen { + wasBalanced = leftLen >= balanceThreshold + pdqsortCmpFunc(data, a, mid, limit, cmp) + a = mid + 1 + } else { + wasBalanced = rightLen >= balanceThreshold + pdqsortCmpFunc(data, mid+1, b, limit, cmp) + b = mid + } + } +} + +// partitionCmpFunc does one quicksort partition. +// Let p = data[pivot] +// Moves elements in data[a:b] around, so that data[i]

=p for inewpivot. +// On return, data[newpivot] = p +func partitionCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int, alreadyPartitioned bool) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for i <= j && (cmp(data[i], data[a]) < 0) { + i++ + } + for i <= j && !(cmp(data[j], data[a]) < 0) { + j-- + } + if i > j { + data[j], data[a] = data[a], data[j] + return j, true + } + data[i], data[j] = data[j], data[i] + i++ + j-- + + for { + for i <= j && (cmp(data[i], data[a]) < 0) { + i++ + } + for i <= j && !(cmp(data[j], data[a]) < 0) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + data[j], data[a] = data[a], data[j] + return j, false +} + +// partitionEqualCmpFunc partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. +// It assumed that data[a:b] does not contain elements smaller than the data[pivot]. +func partitionEqualCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int) { + data[a], data[pivot] = data[pivot], data[a] + i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned + + for { + for i <= j && !(cmp(data[a], data[i]) < 0) { + i++ + } + for i <= j && (cmp(data[a], data[j]) < 0) { + j-- + } + if i > j { + break + } + data[i], data[j] = data[j], data[i] + i++ + j-- + } + return i +} + +// partialInsertionSortCmpFunc partially sorts a slice, returns true if the slice is sorted at the end. +func partialInsertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) bool { + const ( + maxSteps = 5 // maximum number of adjacent out-of-order pairs that will get shifted + shortestShifting = 50 // don't shift any elements on short arrays + ) + i := a + 1 + for j := 0; j < maxSteps; j++ { + for i < b && !(cmp(data[i], data[i-1]) < 0) { + i++ + } + + if i == b { + return true + } + + if b-a < shortestShifting { + return false + } + + data[i], data[i-1] = data[i-1], data[i] + + // Shift the smaller one to the left. + if i-a >= 2 { + for j := i - 1; j >= 1; j-- { + if !(cmp(data[j], data[j-1]) < 0) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + // Shift the greater one to the right. + if b-i >= 2 { + for j := i + 1; j < b; j++ { + if !(cmp(data[j], data[j-1]) < 0) { + break + } + data[j], data[j-1] = data[j-1], data[j] + } + } + } + return false +} + +// breakPatternsCmpFunc scatters some elements around in an attempt to break some patterns +// that might cause imbalanced partitions in quicksort. +func breakPatternsCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + length := b - a + if length >= 8 { + random := xorshift(length) + modulus := nextPowerOfTwo(length) + + for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { + other := int(uint(random.Next()) & (modulus - 1)) + if other >= length { + other -= length + } + data[idx], data[a+other] = data[a+other], data[idx] + } + } +} + +// choosePivotCmpFunc chooses a pivot in data[a:b]. +// +// [0,8): chooses a static pivot. +// [8,shortestNinther): uses the simple median-of-three method. +// [shortestNinther,∞): uses the Tukey ninther method. +func choosePivotCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) (pivot int, hint sortedHint) { + const ( + shortestNinther = 50 + maxSwaps = 4 * 3 + ) + + l := b - a + + var ( + swaps int + i = a + l/4*1 + j = a + l/4*2 + k = a + l/4*3 + ) + + if l >= 8 { + if l >= shortestNinther { + // Tukey ninther method, the idea came from Rust's implementation. + i = medianAdjacentCmpFunc(data, i, &swaps, cmp) + j = medianAdjacentCmpFunc(data, j, &swaps, cmp) + k = medianAdjacentCmpFunc(data, k, &swaps, cmp) + } + // Find the median among i, j, k and stores it into j. + j = medianCmpFunc(data, i, j, k, &swaps, cmp) + } + + switch swaps { + case 0: + return j, increasingHint + case maxSwaps: + return j, decreasingHint + default: + return j, unknownHint + } +} + +// order2CmpFunc returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. +func order2CmpFunc[E any](data []E, a, b int, swaps *int, cmp func(a, b E) int) (int, int) { + if cmp(data[b], data[a]) < 0 { + *swaps++ + return b, a + } + return a, b +} + +// medianCmpFunc returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. +func medianCmpFunc[E any](data []E, a, b, c int, swaps *int, cmp func(a, b E) int) int { + a, b = order2CmpFunc(data, a, b, swaps, cmp) + b, c = order2CmpFunc(data, b, c, swaps, cmp) + a, b = order2CmpFunc(data, a, b, swaps, cmp) + return b +} + +// medianAdjacentCmpFunc finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. +func medianAdjacentCmpFunc[E any](data []E, a int, swaps *int, cmp func(a, b E) int) int { + return medianCmpFunc(data, a-1, a, a+1, swaps, cmp) +} + +func reverseRangeCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { + i := a + j := b - 1 + for i < j { + data[i], data[j] = data[j], data[i] + i++ + j-- + } +} + +func swapRangeCmpFunc[E any](data []E, a, b, n int, cmp func(a, b E) int) { + for i := 0; i < n; i++ { + data[a+i], data[b+i] = data[b+i], data[a+i] + } +} + +func stableCmpFunc[E any](data []E, n int, cmp func(a, b E) int) { + blockSize := 20 // must be > 0 + a, b := 0, blockSize + for b <= n { + insertionSortCmpFunc(data, a, b, cmp) + a = b + b += blockSize + } + insertionSortCmpFunc(data, a, n, cmp) + + for blockSize < n { + a, b = 0, 2*blockSize + for b <= n { + symMergeCmpFunc(data, a, a+blockSize, b, cmp) + a = b + b += 2 * blockSize + } + if m := a + blockSize; m < n { + symMergeCmpFunc(data, a, m, n, cmp) + } + blockSize *= 2 + } +} + +// symMergeCmpFunc merges the two sorted subsequences data[a:m] and data[m:b] using +// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum +// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz +// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in +// Computer Science, pages 714-723. Springer, 2004. +// +// Let M = m-a and N = b-n. Wolog M < N. +// The recursion depth is bound by ceil(log(N+M)). +// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. +// The algorithm needs O((M+N)*log(M)) calls to data.Swap. +// +// The paper gives O((M+N)*log(M)) as the number of assignments assuming a +// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation +// in the paper carries through for Swap operations, especially as the block +// swapping rotate uses only O(M+N) Swaps. +// +// symMerge assumes non-degenerate arguments: a < m && m < b. +// Having the caller check this condition eliminates many leaf recursion calls, +// which improves performance. +func symMergeCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[a] into data[m:b] + // if data[a:m] only contains one element. + if m-a == 1 { + // Use binary search to find the lowest index i + // such that data[i] >= data[a] for m <= i < b. + // Exit the search loop with i == b in case no such index exists. + i := m + j := b + for i < j { + h := int(uint(i+j) >> 1) + if cmp(data[h], data[a]) < 0 { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[a] reaches the position before i. + for k := a; k < i-1; k++ { + data[k], data[k+1] = data[k+1], data[k] + } + return + } + + // Avoid unnecessary recursions of symMerge + // by direct insertion of data[m] into data[a:m] + // if data[m:b] only contains one element. + if b-m == 1 { + // Use binary search to find the lowest index i + // such that data[i] > data[m] for a <= i < m. + // Exit the search loop with i == m in case no such index exists. + i := a + j := m + for i < j { + h := int(uint(i+j) >> 1) + if !(cmp(data[m], data[h]) < 0) { + i = h + 1 + } else { + j = h + } + } + // Swap values until data[m] reaches the position i. + for k := m; k > i; k-- { + data[k], data[k-1] = data[k-1], data[k] + } + return + } + + mid := int(uint(a+b) >> 1) + n := mid + m + var start, r int + if m > mid { + start = n - b + r = mid + } else { + start = a + r = m + } + p := n - 1 + + for start < r { + c := int(uint(start+r) >> 1) + if !(cmp(data[p-c], data[c]) < 0) { + start = c + 1 + } else { + r = c + } + } + + end := n - start + if start < m && m < end { + rotateCmpFunc(data, start, m, end, cmp) + } + if a < start && start < mid { + symMergeCmpFunc(data, a, start, mid, cmp) + } + if mid < end && end < b { + symMergeCmpFunc(data, mid, end, b, cmp) + } +} + +// rotateCmpFunc rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: +// Data of the form 'x u v y' is changed to 'x v u y'. +// rotate performs at most b-a many calls to data.Swap, +// and it assumes non-degenerate arguments: a < m && m < b. +func rotateCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { + i := m - a + j := b - m + + for i != j { + if i > j { + swapRangeCmpFunc(data, m-i, m, j, cmp) + i -= j + } else { + swapRangeCmpFunc(data, m-i, m+j-i, i, cmp) + j -= i + } + } + // i == j + swapRangeCmpFunc(data, m-i, m, i, cmp) +} From 49ef04486816d7908c6c0d8ec6ff84c892343fe7 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Thu, 20 Feb 2025 17:47:11 -0300 Subject: [PATCH 23/36] remove stableCmpFunc --- ansi/sixel/palette_sort.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/ansi/sixel/palette_sort.go b/ansi/sixel/palette_sort.go index 902bdcd9..ace6d35e 100644 --- a/ansi/sixel/palette_sort.go +++ b/ansi/sixel/palette_sort.go @@ -403,30 +403,6 @@ func swapRangeCmpFunc[E any](data []E, a, b, n int, cmp func(a, b E) int) { } } -func stableCmpFunc[E any](data []E, n int, cmp func(a, b E) int) { - blockSize := 20 // must be > 0 - a, b := 0, blockSize - for b <= n { - insertionSortCmpFunc(data, a, b, cmp) - a = b - b += blockSize - } - insertionSortCmpFunc(data, a, n, cmp) - - for blockSize < n { - a, b = 0, 2*blockSize - for b <= n { - symMergeCmpFunc(data, a, a+blockSize, b, cmp) - a = b - b += 2 * blockSize - } - if m := a + blockSize; m < n { - symMergeCmpFunc(data, a, m, n, cmp) - } - blockSize *= 2 - } -} - // symMergeCmpFunc merges the two sorted subsequences data[a:m] and data[m:b] using // the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum // Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz From eb42d4e790001b0955a37a1249bacd6d986d3224 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Thu, 20 Feb 2025 17:50:17 -0300 Subject: [PATCH 24/36] remove unnecessary stuff --- ansi/sixel/decoder.go | 1 - ansi/sixel/palette_sort.go | 130 +------------------------------------ 2 files changed, 1 insertion(+), 130 deletions(-) diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index 185115f5..72c21671 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -14,7 +14,6 @@ import ( // we are decoding a legacy sixel image that doesn't define its own colors (technically // permitted). func buildDefaultDecodePalette() map[int]color.Color { - // Undefined colors in sixel images use a set of default colors: 0-15 // are sixel-specific, 16-255 are the same as the xterm 256-color values return map[int]color.Color{ diff --git a/ansi/sixel/palette_sort.go b/ansi/sixel/palette_sort.go index ace6d35e..0fe21e0c 100644 --- a/ansi/sixel/palette_sort.go +++ b/ansi/sixel/palette_sort.go @@ -395,132 +395,4 @@ func reverseRangeCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { i++ j-- } -} - -func swapRangeCmpFunc[E any](data []E, a, b, n int, cmp func(a, b E) int) { - for i := 0; i < n; i++ { - data[a+i], data[b+i] = data[b+i], data[a+i] - } -} - -// symMergeCmpFunc merges the two sorted subsequences data[a:m] and data[m:b] using -// the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum -// Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz -// Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in -// Computer Science, pages 714-723. Springer, 2004. -// -// Let M = m-a and N = b-n. Wolog M < N. -// The recursion depth is bound by ceil(log(N+M)). -// The algorithm needs O(M*log(N/M + 1)) calls to data.Less. -// The algorithm needs O((M+N)*log(M)) calls to data.Swap. -// -// The paper gives O((M+N)*log(M)) as the number of assignments assuming a -// rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation -// in the paper carries through for Swap operations, especially as the block -// swapping rotate uses only O(M+N) Swaps. -// -// symMerge assumes non-degenerate arguments: a < m && m < b. -// Having the caller check this condition eliminates many leaf recursion calls, -// which improves performance. -func symMergeCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { - // Avoid unnecessary recursions of symMerge - // by direct insertion of data[a] into data[m:b] - // if data[a:m] only contains one element. - if m-a == 1 { - // Use binary search to find the lowest index i - // such that data[i] >= data[a] for m <= i < b. - // Exit the search loop with i == b in case no such index exists. - i := m - j := b - for i < j { - h := int(uint(i+j) >> 1) - if cmp(data[h], data[a]) < 0 { - i = h + 1 - } else { - j = h - } - } - // Swap values until data[a] reaches the position before i. - for k := a; k < i-1; k++ { - data[k], data[k+1] = data[k+1], data[k] - } - return - } - - // Avoid unnecessary recursions of symMerge - // by direct insertion of data[m] into data[a:m] - // if data[m:b] only contains one element. - if b-m == 1 { - // Use binary search to find the lowest index i - // such that data[i] > data[m] for a <= i < m. - // Exit the search loop with i == m in case no such index exists. - i := a - j := m - for i < j { - h := int(uint(i+j) >> 1) - if !(cmp(data[m], data[h]) < 0) { - i = h + 1 - } else { - j = h - } - } - // Swap values until data[m] reaches the position i. - for k := m; k > i; k-- { - data[k], data[k-1] = data[k-1], data[k] - } - return - } - - mid := int(uint(a+b) >> 1) - n := mid + m - var start, r int - if m > mid { - start = n - b - r = mid - } else { - start = a - r = m - } - p := n - 1 - - for start < r { - c := int(uint(start+r) >> 1) - if !(cmp(data[p-c], data[c]) < 0) { - start = c + 1 - } else { - r = c - } - } - - end := n - start - if start < m && m < end { - rotateCmpFunc(data, start, m, end, cmp) - } - if a < start && start < mid { - symMergeCmpFunc(data, a, start, mid, cmp) - } - if mid < end && end < b { - symMergeCmpFunc(data, mid, end, b, cmp) - } -} - -// rotateCmpFunc rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: -// Data of the form 'x u v y' is changed to 'x v u y'. -// rotate performs at most b-a many calls to data.Swap, -// and it assumes non-degenerate arguments: a < m && m < b. -func rotateCmpFunc[E any](data []E, a, m, b int, cmp func(a, b E) int) { - i := m - a - j := b - m - - for i != j { - if i > j { - swapRangeCmpFunc(data, m-i, m, j, cmp) - i -= j - } else { - swapRangeCmpFunc(data, m-i, m+j-i, i, cmp) - j -= i - } - } - // i == j - swapRangeCmpFunc(data, m-i, m, i, cmp) -} +} \ No newline at end of file From 53d8da5fc276f01b4bbedf8af1366368df19e905 Mon Sep 17 00:00:00 2001 From: Raphael Amorim Date: Thu, 20 Feb 2025 18:20:44 -0300 Subject: [PATCH 25/36] remove comments --- ansi/sixel/palette.go | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go index d58f438b..8205b3d8 100644 --- a/ansi/sixel/palette.go +++ b/ansi/sixel/palette.go @@ -182,23 +182,8 @@ func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixel for cubeHeap.Len() < maxColors { cubeToSplit := heap.Pop(&cubeHeap).(quantizationCube) - // Sort the colors in the bucket's range along the cube's longest color axis - // TODO: Use slices.SortFunc in the future - // sort.SliceStable(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], - // func(i, j int) bool { - // slice := uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length] - // switch cubeToSplit.sliceChannel { - // case quantizationRed: - // return slice[i].Red < slice[j].Red - // case quantizationGreen: - // return slice[i].Green < slice[j].Green - // case quantizationBlue: - // return slice[i].Blue < slice[j].Blue - // default: - // return slice[i].Alpha < slice[j].Alpha - // } - // }) - + // TODO: Use slices.SortFunc and cmp.Compare in the future (>=1.24) + // Then can delete palette_sort.go sortFunc(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], func(left sixelColor, right sixelColor) int { switch cubeToSplit.sliceChannel { From 83cc2487f27b5a9d552d6a8fe9f2000bac714f84 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 14:02:29 -0500 Subject: [PATCH 26/36] feat(ansi): sixel: implement types and use io.Reader --- ansi/sixel/color.go | 129 +++++++++++++++ ansi/sixel/color_test.go | 286 +++++++++++++++++++++++++++++++++ ansi/sixel/decoder.go | 232 +++++++++++++------------- ansi/sixel/encoder.go | 29 ++-- ansi/sixel/raster.go | 72 +++++++++ ansi/sixel/raster_test.go | 200 +++++++++++++++++++++++ ansi/sixel/repeat.go | 59 +++++++ ansi/sixel/repeat_test.go | 148 +++++++++++++++++ ansi/sixel/sixel_bench_test.go | 92 +++++------ ansi/sixel/sixel_test.go | 2 +- ansi/sixel/util.go | 8 + 11 files changed, 1082 insertions(+), 175 deletions(-) create mode 100644 ansi/sixel/color.go create mode 100644 ansi/sixel/color_test.go create mode 100644 ansi/sixel/raster.go create mode 100644 ansi/sixel/raster_test.go create mode 100644 ansi/sixel/repeat.go create mode 100644 ansi/sixel/repeat_test.go create mode 100644 ansi/sixel/util.go diff --git a/ansi/sixel/color.go b/ansi/sixel/color.go new file mode 100644 index 00000000..761d6c30 --- /dev/null +++ b/ansi/sixel/color.go @@ -0,0 +1,129 @@ +package sixel + +import ( + "fmt" + "image/color" + "io" + + "github.com/lucasb-eyer/go-colorful" +) + +// ErrInvalidColor is returned when a Sixel color is invalid. +var ErrInvalidColor = fmt.Errorf("invalid color") + +// WriteColor writes a Sixel color to a writer. If pu is 0, the rest of the +// parameters are ignored. +func WriteColor(w io.Writer, pc, pu, px, py, pz uint) (int, error) { + if pu <= 0 || pu > 2 { + return fmt.Fprintf(w, "#%d", pc) + } + + return fmt.Fprintf(w, "#%d;%d;%d;%d;%d", pc, pu, px, py, pz) +} + +// DecodeColor decodes a Sixel color from a byte slice. It returns the Color and +// the number of bytes read. +func DecodeColor(data []byte) (c Color, n int) { + if len(data) == 0 || data[0] != ColorIntroducer { + return + } + + if len(data) < 2 { // The minimum length is 2: the introducer and a digit. + return + } + + // Parse the color number and optional color system. + pc := &c.Pc + for n = 1; n < len(data); n++ { + if data[n] == ';' { + if pc == &c.Pc { + pc = &c.Pu + } else { + n++ + break + } + } else if data[n] >= '0' && data[n] <= '9' { + *pc = (*pc)*10 + data[n] - '0' + } else { + break + } + } + + // Parse the color components. + ptr := &c.Px + for ; n < len(data); n++ { + if data[n] == ';' { + if ptr == &c.Px { + ptr = &c.Py + } else if ptr == &c.Py { + ptr = &c.Pz + } else { + n++ + break + } + } else if data[n] >= '0' && data[n] <= '9' { + *ptr = (*ptr)*10 + uint(data[n]-'0') + } else { + break + } + } + + return +} + +// Color represents a Sixel color. +type Color struct { + // Pc is the color number (0-255). + Pc uint8 + // Pu is an optional color system (1: HLS, 2: RGB, 0: default color map). + Pu uint8 + // Color components range from 0-100 for RGB values. For HLS format, the Px + // (Hue) component ranges from 0-360 degrees while L (Lightness) and S + // (Saturation) are 0-100. + Px, Py, Pz uint +} + +// RGBA implements the color.Color interface. +func (c Color) RGBA() (r, g, b, a uint32) { + switch c.Pu { + case 1: + return sixelHLS(c.Px, c.Py, c.Pz).RGBA() + case 2: + return sixelRGB(c.Px, c.Py, c.Pz).RGBA() + default: + return colors[c.Pc].RGBA() + } +} + +var colors = map[uint8]color.Color{ + // 16 predefined color registers of VT340 + 0: sixelRGB(0, 0, 0), + 1: sixelRGB(20, 20, 80), + 2: sixelRGB(80, 13, 13), + 3: sixelRGB(20, 80, 20), + 4: sixelRGB(80, 20, 80), + 5: sixelRGB(20, 80, 80), + 6: sixelRGB(80, 80, 20), + 7: sixelRGB(53, 53, 53), + 8: sixelRGB(26, 26, 26), + 9: sixelRGB(33, 33, 60), + 10: sixelRGB(60, 26, 26), + 11: sixelRGB(33, 60, 33), + 12: sixelRGB(60, 33, 60), + 13: sixelRGB(33, 60, 60), + 14: sixelRGB(60, 60, 33), + 15: sixelRGB(80, 80, 80), +} + +// #define PALVAL(n,a,m) (((n) * (a) + ((m) / 2)) / (m)) +func palval(n, a, m uint) uint { + return (n*a + m/2) / m +} + +func sixelRGB(r, g, b uint) color.Color { + return color.RGBA{uint8(palval(r, 0xff, 100)), uint8(palval(g, 0xff, 100)), uint8(palval(b, 0xff, 100)), 0xFF} //nolint:gosec +} + +func sixelHLS(h, l, s uint) color.Color { + return colorful.Hsl(float64(h), float64(s)/100.0, float64(l)/100.0).Clamped() +} diff --git a/ansi/sixel/color_test.go b/ansi/sixel/color_test.go new file mode 100644 index 00000000..282c3796 --- /dev/null +++ b/ansi/sixel/color_test.go @@ -0,0 +1,286 @@ +package sixel + +import ( + "bytes" + "image/color" + "testing" +) + +func TestWriteColor(t *testing.T) { + tests := []struct { + name string + pc uint + pu uint + px uint + py uint + pz uint + expected string + }{ + { + name: "simple color number", + pc: 1, + pu: 0, + expected: "#1", + }, + { + name: "RGB color", + pc: 1, + pu: 2, + px: 50, + py: 60, + pz: 70, + expected: "#1;2;50;60;70", + }, + { + name: "HLS color", + pc: 2, + pu: 1, + px: 180, + py: 50, + pz: 100, + expected: "#2;1;180;50;100", + }, + { + name: "invalid pu > 2", + pc: 1, + pu: 3, + expected: "#1", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := &bytes.Buffer{} + n, err := WriteColor(buf, tt.pc, tt.pu, tt.px, tt.py, tt.pz) + if err != nil { + t.Errorf("WriteColor() unexpected error = %v", err) + return + } + if got := buf.String(); got != tt.expected { + t.Errorf("WriteColor() = %v, want %v", got, tt.expected) + } + if n != len(tt.expected) { + t.Errorf("WriteColor() returned length = %v, want %v", n, len(tt.expected)) + } + }) + } +} + +func TestDecodeColor(t *testing.T) { + tests := []struct { + name string + input []byte + wantC Color + wantN int + }{ + { + name: "simple color number", + input: []byte("#1"), + wantC: Color{Pc: 1}, + wantN: 2, + }, + { + name: "RGB color", + input: []byte("#1;2;50;60;70"), + wantC: Color{Pc: 1, Pu: 2, Px: 50, Py: 60, Pz: 70}, + wantN: 13, + }, + { + name: "HLS color", + input: []byte("#2;1;180;50;100"), + wantC: Color{Pc: 2, Pu: 1, Px: 180, Py: 50, Pz: 100}, + wantN: 15, + }, + { + name: "empty input", + input: []byte{}, + wantC: Color{}, + wantN: 0, + }, + { + name: "invalid introducer", + input: []byte("X1"), + wantC: Color{}, + wantN: 0, + }, + { + name: "incomplete sequence", + input: []byte("#"), + wantC: Color{}, + wantN: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotC, gotN := DecodeColor(tt.input) + if gotC != tt.wantC { + t.Errorf("DecodeColor() gotColor = %v, want %v", gotC, tt.wantC) + } + if gotN != tt.wantN { + t.Errorf("DecodeColor() gotN = %v, want %v", gotN, tt.wantN) + } + }) + } +} + +func TestColor_RGBA(t *testing.T) { + tests := []struct { + name string + color Color + wantR uint32 + wantG uint32 + wantB uint32 + wantA uint32 + }{ + { + name: "default color map 0 (black)", + color: Color{Pc: 0}, + wantR: 0x0000, + wantG: 0x0000, + wantB: 0x0000, + wantA: 0xFFFF, + }, + { + name: "RGB mode (50%, 60%, 70%)", + color: Color{Pc: 1, Pu: 2, Px: 50, Py: 60, Pz: 70}, + wantR: 0x8080, + wantG: 0x9999, + wantB: 0xB3B3, + wantA: 0xFFFF, + }, + { + name: "HLS mode (180°, 50%, 100%)", + color: Color{Pc: 1, Pu: 1, Px: 180, Py: 50, Pz: 100}, + wantR: 0x0000, + wantG: 0xFFFF, + wantB: 0xFFFF, + wantA: 0xFFFF, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotR, gotG, gotB, gotA := tt.color.RGBA() + if gotR != tt.wantR { + t.Errorf("Color.RGBA() gotR = %v, want %v", gotR, tt.wantR) + } + if gotG != tt.wantG { + t.Errorf("Color.RGBA() gotG = %v, want %v", gotG, tt.wantG) + } + if gotB != tt.wantB { + t.Errorf("Color.RGBA() gotB = %v, want %v", gotB, tt.wantB) + } + if gotA != tt.wantA { + t.Errorf("Color.RGBA() gotA = %v, want %v", gotA, tt.wantA) + } + }) + } +} + +func TestSixelRGB(t *testing.T) { + tests := []struct { + name string + r uint + g uint + b uint + want color.Color + }{ + { + name: "black", + r: 0, + g: 0, + b: 0, + want: color.NRGBA{R: 0, G: 0, B: 0, A: 255}, + }, + { + name: "white", + r: 100, + g: 100, + b: 100, + want: color.NRGBA{R: 255, G: 255, B: 255, A: 255}, + }, + { + name: "red", + r: 100, + g: 0, + b: 0, + want: color.NRGBA{R: 255, G: 0, B: 0, A: 255}, + }, + { + name: "half intensity", + r: 50, + g: 50, + b: 50, + want: color.NRGBA{R: 128, G: 128, B: 128, A: 255}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := sixelRGB(tt.r, tt.g, tt.b) + gotR, gotG, gotB, gotA := got.RGBA() + wantR, wantG, wantB, wantA := tt.want.RGBA() + if gotR != wantR || gotG != wantG || gotB != wantB || gotA != wantA { + t.Errorf("sixelRGB() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestSixelHLS(t *testing.T) { + tests := []struct { + name string + h uint + l uint + s uint + want color.Color + }{ + { + name: "black", + h: 0, + l: 0, + s: 0, + want: color.NRGBA{R: 0, G: 0, B: 0, A: 255}, + }, + { + name: "white", + h: 0, + l: 100, + s: 0, + want: color.NRGBA{R: 255, G: 255, B: 255, A: 255}, + }, + { + name: "pure red", + h: 0, + l: 50, + s: 100, + want: color.NRGBA{R: 255, G: 0, B: 0, A: 255}, + }, + { + name: "pure green", + h: 120, + l: 50, + s: 100, + want: color.NRGBA{R: 0, G: 255, B: 0, A: 255}, + }, + { + name: "pure blue", + h: 240, + l: 50, + s: 100, + want: color.NRGBA{R: 0, G: 0, B: 255, A: 255}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := sixelHLS(tt.h, tt.l, tt.s) + gotR, gotG, gotB, gotA := got.RGBA() + wantR, wantG, wantB, wantA := tt.want.RGBA() + if gotR != wantR || gotG != wantG || gotB != wantB || gotA != wantA { + t.Errorf("sixelHLS() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index 72c21671..9b505ee8 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -1,7 +1,7 @@ package sixel import ( - "bytes" + "bufio" "errors" "fmt" "image" @@ -279,18 +279,9 @@ func buildDefaultDecodePalette() map[int]color.Color { } } -type Decoder struct { -} - -func ParseRaster(data io.Reader) (pan, pad, ph, pv int, err error) { - _, err = fmt.Fscanf(data, "%d;%d;%d;%d", &pan, &pad, &ph, &pv) - return -} - -func ParseRepeat(data io.Reader) (count int, r byte, err error) { - _, err = fmt.Fscanf(data, "%d%b", &count, &r) - return -} +// Decoder is a Sixel image decoder. It reads Sixel image data from an +// io.Reader and decodes it into an image.Image. +type Decoder struct{} // Decode will parse sixel image data into an image or return an error. Because // the sixel image format does not have a predictable size, the end of the sixel @@ -299,31 +290,55 @@ func ParseRepeat(data io.Reader) (count int, r byte, err error) { // the end, this method simply accepts a byte slice instead of a reader. Callers // should read the entire escape sequence and pass the Ps..Ps portion of the sequence // to this method. -func (d *Decoder) Decode(data []byte) (image.Image, error) { - if len(data) == 0 { - return image.NewRGBA(image.Rect(0, 0, 0, 0)), nil - } - - buffer := bytes.NewBuffer(data) - b, err := buffer.ReadByte() +func (d *Decoder) Decode(r io.Reader) (image.Image, error) { + rd := bufio.NewReader(r) + peeked, err := rd.Peek(1) if err != nil { - return nil, d.readError(err) + return nil, err } var bounds image.Rectangle - if b == RasterAttribute { - var fixedWidth, fixedHeight int - // We have pixel dimensions - _, _, fixedWidth, fixedHeight, err := ParseRaster(buffer) - if err != nil { - return nil, d.readError(err) + var raster Raster + if peeked[0] == RasterAttribute { + var read int + n := 16 + for { + peeked, err = rd.Peek(n) // random number, just need to read a few bytes + if err != nil { + return nil, err + } + + raster, read = DecodeRaster(peeked) + if read == 0 { + return nil, ErrInvalidRaster + } + if read >= n { + // We need to read more bytes to get the full raster + n *= 2 + continue + } + + rd.Discard(read) //nolint:errcheck + break } - bounds = image.Rect(0, 0, fixedWidth, fixedHeight) - } else { + bounds = image.Rect(0, 0, raster.Ph, raster.Pv) + } + + if bounds.Max.X == 0 || bounds.Max.Y == 0 { // We're parsing the image with no pixel metrics so unread the byte for the // main read loop - _ = buffer.UnreadByte() + // Peek the whole buffer to get the size of the image before we start + // decoding it. + var data []byte + toPeak := 64 // arbitrary number of bytes to peak + for { + data, err = rd.Peek(toPeak) + if err != nil || len(data) < toPeak { + break + } + toPeak *= 2 + } width, height := d.scanSize(data) bounds = image.Rect(0, 0, width, height) @@ -333,74 +348,80 @@ func (d *Decoder) Decode(data []byte) (image.Image, error) { palette := buildDefaultDecodePalette() var currentX, currentBandY, currentPaletteIndex int + // data buffer used to decode Sixel commands + data := make([]byte, 0, 16) // arbitrary number of bytes to read for { - b, err := buffer.ReadByte() + b, err := rd.ReadByte() if err != nil { return img, d.readError(err) } - // Palette operation - if b == ColorIntroducer { - _, err = fmt.Fscan(buffer, ¤tPaletteIndex) - if err != nil { - return img, d.readError(err) - } - - b, err = buffer.ReadByte() - if err != nil { - return img, d.readError(err) - } + count := 1 // default count for Sixel commands + switch { + case b == LineBreak: // LF + currentBandY++ + currentX = 0 + case b == CarriageReturn: // CR + currentX = 0 + case b == ColorIntroducer: // # + data = data[0:] + data = append(data, b) + for { + b, err = rd.ReadByte() + if err != nil { + return img, d.readError(err) + } + // Read bytes until we hit a non-color byte i.e. non-numeric + // and non-; + if (b < '0' || b > '9') && b != ';' { + rd.UnreadByte() //nolint:errcheck + break + } - if b != ';' { - // If we're not defining a color, move on - _ = buffer.UnreadByte() - continue + data = append(data, b) } - var red, green, blue uint32 - // We only know how to read RGB colors, which is preceded by a 2 - _, err = fmt.Fscanf(buffer, "2;%d;%d;%d", &red, &green, &blue) - if err != nil { - return img, d.readError(err) + // Palette operation + c, n := DecodeColor(data) + if n == 0 { + return img, ErrInvalidColor } - if red > 100 || green > 100 || blue > 100 { - return img, fmt.Errorf("invalid palette color: %d,%d,%d", red, green, blue) - } + currentPaletteIndex = int(c.Pc) + palette[currentPaletteIndex] = c + // palette[currentPaletteIndex] = color.RGBA64{ + // R: uint16(imageConvertChannel(uint32(c.Px))), + // G: uint16(imageConvertChannel(uint32(c.Py))), + // B: uint16(imageConvertChannel(uint32(c.Pz))), + // A: 65525, + // } + case b == RepeatIntroducer: // ! + data = data[0:] + data = append(data, b) + for { + b, err = rd.ReadByte() + if err != nil { + return img, d.readError(err) + } + // Read bytes until we hit a non-numeric and non-repeat byte. + if (b < '0' || b > '9') && (b < '?' || b > '~') { + rd.UnreadByte() //nolint:errcheck + break + } - palette[currentPaletteIndex] = color.RGBA64{ - R: uint16(imageConvertChannel(red)), - G: uint16(imageConvertChannel(green)), - B: uint16(imageConvertChannel(blue)), - A: 65525, + data = append(data, b) } - continue - } - - // LF - if b == LineBreak { - currentBandY++ - currentX = 0 - continue - } - - // CR - if b == CarriageReturn { - currentX = 0 - continue - } - - // RLE operation - count := 1 - if b == RepeatIntroducer { - count, b, err = ParseRepeat(buffer) - if err != nil { - return img, d.readError(err) + // RLE operation + r, n := DecodeRepeat(data) + if n == 0 { + return img, ErrInvalidRepeat } - } - if b >= '?' && b <= '~' { + count = r.Count + b = r.Char + fallthrough + case b >= '?' && b <= '~': color := palette[currentPaletteIndex] for i := 0; i < count; i++ { d.writePixel(currentX, currentBandY, b, color, img) @@ -410,7 +431,7 @@ func (d *Decoder) Decode(data []byte) (image.Image, error) { } } -// WritePixel will accept a sixel byte (from ? to ~) that defines 6 vertical pixels +// writePixel will accept a sixel byte (from ? to ~) that defines 6 vertical pixels // and write any filled pixels to the image func (d *Decoder) writePixel(x int, bandY int, sixel byte, color color.Color, img *image.RGBA) { maskedSixel := (sixel - '?') & 63 @@ -441,7 +462,6 @@ func (d *Decoder) writePixel(x int, bandY int, sixel byte, color color.Color, im // line. func (d *Decoder) scanSize(data []byte) (int, int) { var maxWidth, bandCount int - buffer := bytes.NewBuffer(data) // Pixel values are ? to ~. Each one of these encountered increases the max width. // a - is a LF and increases the max band count by one. a $ is a CR and resets @@ -451,49 +471,43 @@ func (d *Decoder) scanSize(data []byte) (int, int) { // a ! is a RLE indicator, and we should add the numeral to the current width var currentWidth int newBand := true - for { - b, err := buffer.ReadByte() - if err != nil { - return maxWidth, bandCount * 6 - } - - if b == '-' { + for i := 0; i < len(data); i++ { + b := data[i] + switch { + case b == LineBreak: // LF currentWidth = 0 // The image may end with an LF, so we shouldn't increment the band // count until we encounter a pixel newBand = true - } else if b == '$' { + case b == CarriageReturn: // CR currentWidth = 0 - } else if b == '!' || (b >= '?' && b <= '~') { - // Either an RLE operation or a single pixel - - var count int - if b == '!' { + case b == RepeatIntroducer || (b <= '~' && b >= '?'): + count := 1 + if b == RepeatIntroducer { // Get the run length for the RLE operation - _, err := fmt.Fscan(buffer, &count) - if err != nil { + r, n := DecodeRepeat(data[i:]) + if n == 0 { return maxWidth, bandCount * 6 } - // Decrement the RLE because the pixel code will follow the - // RLE and that will count as pixel - count-- - } else { - count = 1 + + // 1 is added in the loop + i += n - 1 + count = r.Count } currentWidth += count - if newBand { newBand = false bandCount++ } - if currentWidth > maxWidth { - maxWidth = currentWidth - } + + maxWidth = max(maxWidth, currentWidth) } } + + return maxWidth, bandCount * 6 } // readError will take any error returned from a read method (ReadByte, diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index d739a992..1e6fdc4f 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -21,6 +21,7 @@ import ( // beginning of a band where a new color is selected and pixels written. This continues until the entire // band has been drawn, at which time a line break is written to begin the next band. +// Sixel control functions. const ( LineBreak byte = '-' CarriageReturn byte = '$' @@ -29,22 +30,9 @@ const ( RasterAttribute byte = '"' ) -type Options struct { -} - +// Encoder is a Sixel encoder. It encodes an image to Sixel data format. type Encoder struct { -} - -func Raster(pan, pad, ph, pv int) string { - return fmt.Sprintf("%s%d;%d;%d;%d", string(RasterAttribute), pan, pad, ph, pv) -} - -func Repeat(count int, repeatByte byte) string { - var sb strings.Builder - sb.WriteByte(RepeatIntroducer) - sb.WriteString(strconv.Itoa(count)) - sb.WriteByte(repeatByte) - return sb.String() + // TODO: Support aspect ratio } // Encode will accept an Image and write sixel data to a Writer. The sixel data @@ -58,7 +46,10 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { imageBounds := img.Bounds() - io.WriteString(w, Raster(1, 1, imageBounds.Dx(), imageBounds.Dy())) //nolint:errcheck + // Set the default raster 1:1 aspect ratio if it's not set + if _, err := WriteRaster(w, 1, 1, imageBounds.Dx(), imageBounds.Dy()); err != nil { + return fmt.Errorf("error encoding raster: %w", err) + } palette := newSixelPalette(img, sixelMaxColors) @@ -191,8 +182,8 @@ func (s *sixelBuilder) GeneratePixels() string { } hasWrittenAColor = true - s.writeControlRune(ColorIntroducer) - s.imageData.WriteString(strconv.Itoa(paletteIndex)) + // s.writeControlRune(ColorIntroducer) + // s.imageData.WriteString(strconv.Itoa(paletteIndex)) for x := 0; x < s.imageWidth; x += 4 { bit := firstColorBit + uint(x*6) word := s.pixelBands.GetWord64AtBit(bit) @@ -260,7 +251,7 @@ func (s *sixelBuilder) flushRepeats() { // Only write using the RLE form if it's actually providing space savings if s.repeatCount > 3 { - s.imageData.WriteString(Repeat(s.repeatCount, s.repeatByte)) + WriteRepeat(&s.imageData, s.repeatCount, s.repeatByte) //nolint:errcheck return } diff --git a/ansi/sixel/raster.go b/ansi/sixel/raster.go new file mode 100644 index 00000000..22ca9ed5 --- /dev/null +++ b/ansi/sixel/raster.go @@ -0,0 +1,72 @@ +package sixel + +import ( + "fmt" + "io" + "strings" +) + +// ErrInvalidRaster is returned when Raster Attributes are invalid. +var ErrInvalidRaster = fmt.Errorf("invalid raster attributes") + +// WriteRaster writes Raster attributes to a writer. If ph and pv are 0, they +// are omitted. +func WriteRaster(w io.Writer, pan, pad, ph, pv int) (n int, err error) { + if pad == 0 { + return WriteRaster(w, 1, 1, ph, pv) + } + + if ph <= 0 && pv <= 0 { + return fmt.Fprintf(w, "%c%d;%d", RasterAttribute, pan, pad) + } + + return fmt.Fprintf(w, "%c%d;%d;%d;%d", RasterAttribute, pan, pad, ph, pv) +} + +// Raster represents Sixel raster attributes. +type Raster struct { + Pan, Pad, Ph, Pv int +} + +// WriteTo writes Raster attributes to a writer. +func (r Raster) WriteTo(w io.Writer) (int64, error) { + n, err := WriteRaster(w, r.Pan, r.Pad, r.Ph, r.Pv) + return int64(n), err +} + +// String returns the Raster as a string. +func (r Raster) String() string { + var b strings.Builder + r.WriteTo(&b) //nolint:errcheck + return b.String() +} + +// DecodeRaster decodes a Raster from a byte slice. It returns the Raster and +// the number of bytes read. +func DecodeRaster(data []byte) (r Raster, n int) { + if len(data) == 0 || data[0] != RasterAttribute { + return + } + + ptr := &r.Pan + for n = 1; n < len(data); n++ { + if data[n] == ';' { + if ptr == &r.Pan { + ptr = &r.Pad + } else if ptr == &r.Pad { + ptr = &r.Ph + } else if ptr == &r.Ph { + ptr = &r.Pv + } else { + n++ + break + } + } else if data[n] >= '0' && data[n] <= '9' { + *ptr = (*ptr)*10 + int(data[n]-'0') + } else { + break + } + } + + return +} diff --git a/ansi/sixel/raster_test.go b/ansi/sixel/raster_test.go new file mode 100644 index 00000000..d8d12e52 --- /dev/null +++ b/ansi/sixel/raster_test.go @@ -0,0 +1,200 @@ +package sixel + +import ( + "bytes" + "testing" +) + +func TestWriteRaster(t *testing.T) { + tests := []struct { + name string + pan int + pad int + ph int + pv int + want string + wantErr bool + }{ + { + name: "basic case", + pan: 1, + pad: 2, + want: "\"1;2", + }, + { + name: "with ph and pv", + pan: 2, + pad: 3, + ph: 4, + pv: 5, + want: "\"2;3;4;5", + }, + { + name: "zero pad converts to 1,1", + pan: 2, + pad: 0, + want: "\"1;1", + }, + { + name: "with ph only", + pan: 1, + pad: 2, + ph: 3, + pv: 0, + want: "\"1;2;3;0", + }, + { + name: "with pv only", + pan: 1, + pad: 2, + ph: 0, + pv: 3, + want: "\"1;2;0;3", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var buf bytes.Buffer + n, err := WriteRaster(&buf, tt.pan, tt.pad, tt.ph, tt.pv) + if (err != nil) != tt.wantErr { + t.Errorf("WriteRaster() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got := buf.String(); got != tt.want { + t.Errorf("WriteRaster() = %q, want %q", got, tt.want) + } + if n != len(tt.want) { + t.Errorf("WriteRaster() returned length %d, want %d", n, len(tt.want)) + } + }) + } +} + +func TestRaster_WriteTo(t *testing.T) { + tests := []struct { + name string + raster Raster + want string + wantErr bool + }{ + { + name: "basic case", + raster: Raster{Pan: 1, Pad: 2}, + want: "\"1;2", + }, + { + name: "full attributes", + raster: Raster{Pan: 2, Pad: 3, Ph: 4, Pv: 5}, + want: "\"2;3;4;5", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var buf bytes.Buffer + n, err := tt.raster.WriteTo(&buf) + if (err != nil) != tt.wantErr { + t.Errorf("Raster.WriteTo() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got := buf.String(); got != tt.want { + t.Errorf("Raster.WriteTo() = %q, want %q", got, tt.want) + } + if n != int64(len(tt.want)) { + t.Errorf("Raster.WriteTo() returned length %d, want %d", n, len(tt.want)) + } + }) + } +} + +func TestDecodeRaster(t *testing.T) { + tests := []struct { + name string + input string + want Raster + wantRead int + }{ + { + name: "basic case", + input: "\"1;2", + want: Raster{Pan: 1, Pad: 2}, + wantRead: 4, + }, + { + name: "full attributes", + input: "\"2;3;4;5", + want: Raster{Pan: 2, Pad: 3, Ph: 4, Pv: 5}, + wantRead: 8, + }, + { + name: "empty input", + input: "", + want: Raster{}, + wantRead: 0, + }, + { + name: "invalid start character", + input: "x1;2", + want: Raster{}, + wantRead: 0, + }, + { + name: "too short", + input: "\"1", + want: Raster{Pan: 1}, + wantRead: 2, + }, + { + name: "invalid character", + input: "\"1;a", + want: Raster{Pan: 1}, + wantRead: 3, + }, + { + name: "partial attributes", + input: "\"1;2;3", + want: Raster{Pan: 1, Pad: 2, Ph: 3}, + wantRead: 6, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, n := DecodeRaster([]byte(tt.input)) + if got != tt.want { + t.Errorf("DecodeRaster() = %+v, want %+v", got, tt.want) + } + if n != tt.wantRead { + t.Errorf("DecodeRaster() read = %d, want %d", n, tt.wantRead) + } + }) + } +} + +func TestRaster_String(t *testing.T) { + tests := []struct { + name string + raster Raster + want string + }{ + { + name: "basic case", + raster: Raster{Pan: 1, Pad: 2}, + want: "\"1;2", + }, + { + name: "full attributes", + raster: Raster{Pan: 2, Pad: 3, Ph: 4, Pv: 5}, + want: "\"2;3;4;5", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.raster.String(); got != tt.want { + t.Errorf("Raster.String() = %q, want %q", got, tt.want) + } + }) + } +} diff --git a/ansi/sixel/repeat.go b/ansi/sixel/repeat.go new file mode 100644 index 00000000..d19ca70e --- /dev/null +++ b/ansi/sixel/repeat.go @@ -0,0 +1,59 @@ +package sixel + +import ( + "fmt" + "io" + "strings" +) + +// ErrInvalidRepeat is returned when a Repeat is invalid +var ErrInvalidRepeat = fmt.Errorf("invalid repeat") + +// WriteRepeat writes a Repeat to a writer. A repeat character is in the range +// of '?' (0x3F) to '~' (0x7E). +func WriteRepeat(w io.Writer, count int, char byte) (int, error) { + return fmt.Fprintf(w, "%c%d%c", RepeatIntroducer, count, char) +} + +// Repeat represents a Sixel repeat introducer. +type Repeat struct { + Count int + Char byte +} + +// WriteTo writes a Repeat to a writer. +func (r Repeat) WriteTo(w io.Writer) (int64, error) { + n, err := WriteRepeat(w, r.Count, r.Char) + return int64(n), err +} + +// String returns the Repeat as a string. +func (r Repeat) String() string { + var b strings.Builder + r.WriteTo(&b) //nolint:errcheck + return b.String() +} + +// DecodeRepeat decodes a Repeat from a byte slice. It returns the Repeat and +// the number of bytes read. +func DecodeRepeat(data []byte) (r Repeat, n int) { + if len(data) == 0 || data[0] != RepeatIntroducer { + return + } + + if len(data) < 3 { // The minimum length is 3: the introducer, a digit, and a character. + return + } + + for n = 1; n < len(data); n++ { + if data[n] >= '0' && data[n] <= '9' { + r.Count = r.Count*10 + int(data[n]-'0') + } else { + r.Char = data[n] + n++ // Include the character in the count. + break + } + } + + return +} diff --git a/ansi/sixel/repeat_test.go b/ansi/sixel/repeat_test.go new file mode 100644 index 00000000..4c5d9da3 --- /dev/null +++ b/ansi/sixel/repeat_test.go @@ -0,0 +1,148 @@ +package sixel + +import ( + "bytes" + "testing" +) + +func TestWriteRepeat(t *testing.T) { + tests := []struct { + name string + count int + char byte + expected string + wantErr bool + }{ + { + name: "basic repeat", + count: 3, + char: 'A', + expected: "!3A", + }, + { + name: "single digit", + count: 5, + char: '#', + expected: "!5#", + }, + { + name: "multiple digits", + count: 123, + char: 'x', + expected: "!123x", + }, + { + name: "zero count", + count: 0, + char: 'B', + expected: "!0B", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := &bytes.Buffer{} + n, err := WriteRepeat(buf, tt.count, tt.char) + if (err != nil) != tt.wantErr { + t.Errorf("WriteRepeat() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got := buf.String(); got != tt.expected { + t.Errorf("WriteRepeat() = %v, want %v", got, tt.expected) + } + if n != len(tt.expected) { + t.Errorf("WriteRepeat() returned length = %v, want %v", n, len(tt.expected)) + } + }) + } +} + +func TestDecodeRepeat(t *testing.T) { + tests := []struct { + name string + input []byte + wantRepeat Repeat + wantN int + description string + }{ + { + name: "basic repeat", + input: []byte("!3A"), + wantRepeat: Repeat{Count: 3, Char: 'A'}, + wantN: 3, + description: "simple single digit repeat", + }, + { + name: "multiple digits", + input: []byte("!123x"), + wantRepeat: Repeat{Count: 123, Char: 'x'}, + wantN: 5, + description: "repeat with multiple digits", + }, + { + name: "empty input", + input: []byte{}, + wantRepeat: Repeat{}, + wantN: 0, + description: "empty input should return zero values", + }, + { + name: "invalid introducer", + input: []byte("X3A"), + wantRepeat: Repeat{}, + wantN: 0, + description: "input without proper introducer", + }, + { + name: "incomplete sequence", + input: []byte("!3"), + wantRepeat: Repeat{}, + wantN: 0, + description: "incomplete sequence without character", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotRepeat, gotN := DecodeRepeat(tt.input) + if gotRepeat != tt.wantRepeat { + t.Errorf("DecodeRepeat() gotRepeat = %v, want %v", gotRepeat, tt.wantRepeat) + } + if gotN != tt.wantN { + t.Errorf("DecodeRepeat() gotN = %v, want %v", gotN, tt.wantN) + } + }) + } +} + +func TestRepeat_String(t *testing.T) { + tests := []struct { + name string + repeat Repeat + expected string + }{ + { + name: "basic repeat", + repeat: Repeat{Count: 3, Char: 'A'}, + expected: "!3A", + }, + { + name: "multiple digits", + repeat: Repeat{Count: 123, Char: 'x'}, + expected: "!123x", + }, + { + name: "zero count", + repeat: Repeat{Count: 0, Char: 'B'}, + expected: "!0B", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.repeat.String(); got != tt.expected { + t.Errorf("Repeat.String() = %v, want %v", got, tt.expected) + } + }) + } +} diff --git a/ansi/sixel/sixel_bench_test.go b/ansi/sixel/sixel_bench_test.go index 7bf2f5b7..a59176f4 100644 --- a/ansi/sixel/sixel_bench_test.go +++ b/ansi/sixel/sixel_bench_test.go @@ -1,69 +1,69 @@ package sixel import ( - "io" - "os" - "bytes" - "fmt" - "testing" - "image" - "image/png" + "bytes" + "fmt" + "image" + "image/png" + "io" + "os" + "testing" - "github.com/charmbracelet/x/ansi" - gosixel "github.com/mattn/go-sixel" + "github.com/charmbracelet/x/ansi" + gosixel "github.com/mattn/go-sixel" ) func BenchmarkEncodingGoSixel(b *testing.B) { - for b.Loop() { - raw, err := loadImage("./../fixtures/graphics/JigokudaniMonkeyPark.png") - if err != nil { - os.Exit(1) - } + for i := 0; i < b.N; i++ { + raw, err := loadImage("./../fixtures/graphics/JigokudaniMonkeyPark.png") + if err != nil { + os.Exit(1) + } - var b = bytes.NewBuffer(nil) - enc := gosixel.NewEncoder(b) - if err := enc.Encode(raw); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } + b := bytes.NewBuffer(nil) + enc := gosixel.NewEncoder(b) + if err := enc.Encode(raw); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } - // fmt.Println(b) - } + // fmt.Println(b) + } } func writeSixelGraphics(w io.Writer, m image.Image) error { - e := &Encoder{} + e := &Encoder{} - data := bytes.NewBuffer(nil) - if err := e.Encode(data, m); err != nil { - return fmt.Errorf("failed to encode sixel image: %w", err) - } + data := bytes.NewBuffer(nil) + if err := e.Encode(data, m); err != nil { + return fmt.Errorf("failed to encode sixel image: %w", err) + } - _, err := io.WriteString(w, ansi.SixelGraphics(0, 1, 0, data.Bytes())) - return err + _, err := io.WriteString(w, ansi.SixelGraphics(0, 1, 0, data.Bytes())) + return err } func BenchmarkEncodingXSixel(b *testing.B) { - for b.Loop() { - raw, err := loadImage("./../fixtures/graphics/JigokudaniMonkeyPark.png") - if err != nil { - os.Exit(1) - } + for i := 0; i < b.N; i++ { + raw, err := loadImage("./../fixtures/graphics/JigokudaniMonkeyPark.png") + if err != nil { + os.Exit(1) + } - var b = bytes.NewBuffer(nil) - if err := writeSixelGraphics(b, raw); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } + b := bytes.NewBuffer(nil) + if err := writeSixelGraphics(b, raw); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } - // fmt.Println(b) - } + // fmt.Println(b) + } } func loadImage(path string) (image.Image, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - return png.Decode(f) + f, err := os.Open(path) + if err != nil { + return nil, err + } + return png.Decode(f) } diff --git a/ansi/sixel/sixel_test.go b/ansi/sixel/sixel_test.go index d18400c5..5aff710f 100644 --- a/ansi/sixel/sixel_test.go +++ b/ansi/sixel/sixel_test.go @@ -170,7 +170,7 @@ func TestFullImage(t *testing.T) { return } - compareImg, err := decoder.Decode(buffer.Bytes()) + compareImg, err := decoder.Decode(buffer) if err != nil { t.Errorf("Unexpected error: %+v", err) return diff --git a/ansi/sixel/util.go b/ansi/sixel/util.go new file mode 100644 index 00000000..afbddf4d --- /dev/null +++ b/ansi/sixel/util.go @@ -0,0 +1,8 @@ +package sixel + +func max(a, b int) int { + if a > b { + return a + } + return b +} From 5735ce9e94f4c78ea4239cfdba97849b98d4e38a Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 17:44:02 -0500 Subject: [PATCH 27/36] refactor(ansi): sixel: clean up and refactor, use quant --- ansi/sixel/color.go | 50 +++-- ansi/sixel/color_test.go | 22 +- ansi/sixel/decoder.go | 21 +- ansi/sixel/encoder.go | 231 ++++++++++----------- ansi/sixel/palette.go | 351 -------------------------------- ansi/sixel/palette_sort.go | 398 ------------------------------------- ansi/sixel/palette_test.go | 124 ------------ 7 files changed, 168 insertions(+), 1029 deletions(-) delete mode 100644 ansi/sixel/palette.go delete mode 100644 ansi/sixel/palette_sort.go delete mode 100644 ansi/sixel/palette_test.go diff --git a/ansi/sixel/color.go b/ansi/sixel/color.go index 761d6c30..a5ecec23 100644 --- a/ansi/sixel/color.go +++ b/ansi/sixel/color.go @@ -13,7 +13,7 @@ var ErrInvalidColor = fmt.Errorf("invalid color") // WriteColor writes a Sixel color to a writer. If pu is 0, the rest of the // parameters are ignored. -func WriteColor(w io.Writer, pc, pu, px, py, pz uint) (int, error) { +func WriteColor(w io.Writer, pc, pu, px, py, pz int) (int, error) { if pu <= 0 || pu > 2 { return fmt.Fprintf(w, "#%d", pc) } @@ -21,6 +21,29 @@ func WriteColor(w io.Writer, pc, pu, px, py, pz uint) (int, error) { return fmt.Fprintf(w, "#%d;%d;%d;%d;%d", pc, pu, px, py, pz) } +// ConvertChannel converts a color channel from color.Color 0xffff to 0-100 +// Sixel RGB format. +func ConvertChannel(c uint32) uint32 { + // We add 328 because that is about 0.5 in the sixel 0-100 color range, we're trying to + // round to the nearest value + return (c + 328) * 100 / 0xffff +} + +// FromColor returns a Sixel color from a color.Color. It converts the color +// channels to the 0-100 range. +func FromColor(c color.Color) Color { + r, g, b, a := c.RGBA() + if a == 0 { + return Color{Pu: 3} // Transparent color + } + return Color{ + Pu: 2, // Always use RGB format "2" + Px: int(ConvertChannel(r)), + Py: int(ConvertChannel(g)), + Pz: int(ConvertChannel(b)), + } +} + // DecodeColor decodes a Sixel color from a byte slice. It returns the Color and // the number of bytes read. func DecodeColor(data []byte) (c Color, n int) { @@ -43,7 +66,7 @@ func DecodeColor(data []byte) (c Color, n int) { break } } else if data[n] >= '0' && data[n] <= '9' { - *pc = (*pc)*10 + data[n] - '0' + *pc = (*pc)*10 + int(data[n]-'0') } else { break } @@ -62,7 +85,7 @@ func DecodeColor(data []byte) (c Color, n int) { break } } else if data[n] >= '0' && data[n] <= '9' { - *ptr = (*ptr)*10 + uint(data[n]-'0') + *ptr = (*ptr)*10 + int(data[n]-'0') } else { break } @@ -74,13 +97,16 @@ func DecodeColor(data []byte) (c Color, n int) { // Color represents a Sixel color. type Color struct { // Pc is the color number (0-255). - Pc uint8 - // Pu is an optional color system (1: HLS, 2: RGB, 0: default color map). - Pu uint8 + Pc int + // Pu is an optional color system + // - 0: default color map + // - 1: HLS + // - 2: RGB + Pu int // Color components range from 0-100 for RGB values. For HLS format, the Px // (Hue) component ranges from 0-360 degrees while L (Lightness) and S // (Saturation) are 0-100. - Px, Py, Pz uint + Px, Py, Pz int } // RGBA implements the color.Color interface. @@ -95,7 +121,7 @@ func (c Color) RGBA() (r, g, b, a uint32) { } } -var colors = map[uint8]color.Color{ +var colors = map[int]color.Color{ // 16 predefined color registers of VT340 0: sixelRGB(0, 0, 0), 1: sixelRGB(20, 20, 80), @@ -116,14 +142,14 @@ var colors = map[uint8]color.Color{ } // #define PALVAL(n,a,m) (((n) * (a) + ((m) / 2)) / (m)) -func palval(n, a, m uint) uint { +func palval(n, a, m int) int { return (n*a + m/2) / m } -func sixelRGB(r, g, b uint) color.Color { - return color.RGBA{uint8(palval(r, 0xff, 100)), uint8(palval(g, 0xff, 100)), uint8(palval(b, 0xff, 100)), 0xFF} //nolint:gosec +func sixelRGB(r, g, b int) color.Color { + return color.NRGBA{uint8(palval(r, 0xff, 100)), uint8(palval(g, 0xff, 100)), uint8(palval(b, 0xff, 100)), 0xFF} //nolint:gosec } -func sixelHLS(h, l, s uint) color.Color { +func sixelHLS(h, l, s int) color.Color { return colorful.Hsl(float64(h), float64(s)/100.0, float64(l)/100.0).Clamped() } diff --git a/ansi/sixel/color_test.go b/ansi/sixel/color_test.go index 282c3796..5844fdc8 100644 --- a/ansi/sixel/color_test.go +++ b/ansi/sixel/color_test.go @@ -9,11 +9,11 @@ import ( func TestWriteColor(t *testing.T) { tests := []struct { name string - pc uint - pu uint - px uint - py uint - pz uint + pc int + pu int + px int + py int + pz int expected string }{ { @@ -181,9 +181,9 @@ func TestColor_RGBA(t *testing.T) { func TestSixelRGB(t *testing.T) { tests := []struct { name string - r uint - g uint - b uint + r int + g int + b int want color.Color }{ { @@ -231,9 +231,9 @@ func TestSixelRGB(t *testing.T) { func TestSixelHLS(t *testing.T) { tests := []struct { name string - h uint - l uint - s uint + h int + l int + s int want color.Color }{ { diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index 9b505ee8..8fa4e9a1 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -349,7 +349,8 @@ func (d *Decoder) Decode(r io.Reader) (image.Image, error) { var currentX, currentBandY, currentPaletteIndex int // data buffer used to decode Sixel commands - data := make([]byte, 0, 16) // arbitrary number of bytes to read + data := make([]byte, 0, 6) // arbitrary number of bytes to read + // i := 0 // keeps track of the data buffer index for { b, err := rd.ReadByte() if err != nil { @@ -364,7 +365,7 @@ func (d *Decoder) Decode(r io.Reader) (image.Image, error) { case b == CarriageReturn: // CR currentX = 0 case b == ColorIntroducer: // # - data = data[0:] + data = data[:0] data = append(data, b) for { b, err = rd.ReadByte() @@ -387,16 +388,14 @@ func (d *Decoder) Decode(r io.Reader) (image.Image, error) { return img, ErrInvalidColor } - currentPaletteIndex = int(c.Pc) - palette[currentPaletteIndex] = c - // palette[currentPaletteIndex] = color.RGBA64{ - // R: uint16(imageConvertChannel(uint32(c.Px))), - // G: uint16(imageConvertChannel(uint32(c.Py))), - // B: uint16(imageConvertChannel(uint32(c.Pz))), - // A: 65525, - // } + currentPaletteIndex = c.Pc + if c.Pu > 0 { + // Non-zero Pu means we have a color definition to set. + palette[currentPaletteIndex] = c + } + case b == RepeatIntroducer: // ! - data = data[0:] + data = data[:0] data = append(data, b) for { b, err = rd.ReadByte() diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index 1e6fdc4f..6f18f2a5 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -1,14 +1,15 @@ package sixel import ( + "bytes" "fmt" "image" - "image/color" "io" "strconv" - "strings" "github.com/bits-and-blooms/bitset" + "github.com/soniakeys/quant" + "github.com/soniakeys/quant/median" ) // Sixels are a protocol for writing images to the terminal by writing a large blob of ANSI-escaped data. @@ -28,11 +29,20 @@ const ( RepeatIntroducer byte = '!' ColorIntroducer byte = '#' RasterAttribute byte = '"' + + // MaxColors is the maximum number of colors that can be used in a Sixel + // image. + MaxColors = 256 ) // Encoder is a Sixel encoder. It encodes an image to Sixel data format. type Encoder struct { - // TODO: Support aspect ratio + // Colors is the number of colors to use in the palette. The default is + // 256. + Colors int + + // Quantizer is the color quantizer to use. The default is median cut. + Quantizer quant.Quantizer } // Encode will accept an Image and write sixel data to a Writer. The sixel data @@ -44,117 +54,93 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { return nil } + nc := MaxColors + if e.Colors >= 2 { + nc = e.Colors + } + + var paletted *image.Paletted + if p, ok := img.(*image.Paletted); ok && len(p.Palette) < nc { + paletted = p + } else { + // make adaptive palette using median cut alogrithm + q := e.Quantizer + if q == nil { + q = median.Quantizer(nc) + } + paletted = q.Paletted(img) + } + imageBounds := img.Bounds() + imageWidth := imageBounds.Dx() + imageHeight := imageBounds.Dy() // Set the default raster 1:1 aspect ratio if it's not set - if _, err := WriteRaster(w, 1, 1, imageBounds.Dx(), imageBounds.Dy()); err != nil { + if _, err := WriteRaster(w, 1, 1, imageWidth, imageHeight); err != nil { return fmt.Errorf("error encoding raster: %w", err) } - palette := newSixelPalette(img, sixelMaxColors) - - for paletteIndex, color := range palette.PaletteColors { - e.encodePaletteColor(w, paletteIndex, color) + // Write palette colors + for i, c := range paletted.Palette { + c := FromColor(c) + // Always use RGB format "2" + if _, err := WriteColor(w, i, c.Pu, c.Px, c.Py, c.Pz); err != nil { + return fmt.Errorf("error encoding color: %w", err) + } + paletted.Palette[i] = c } - scratch := newSixelBuilder(imageBounds.Dx(), imageBounds.Dy(), palette) + var pixelBands bitset.BitSet + bandHeight := bandHeight(img) - for y := 0; y < imageBounds.Dy(); y++ { - for x := 0; x < imageBounds.Dx(); x++ { - scratch.SetColor(x, y, img.At(x, y)) + // Write pixel data to bitset. + for y := 0; y < imageHeight; y++ { + for x := 0; x < imageWidth; x++ { + setColor(&pixelBands, x, y, imageWidth, bandHeight, int(paletted.ColorIndexAt(x, y))) } } - pixels := scratch.GeneratePixels() - io.WriteString(w, pixels) //nolint:errcheck - - return nil -} - -func (e *Encoder) encodePaletteColor(w io.Writer, paletteIndex int, c sixelColor) { - // Initializing palette entries - // #;;;; - // a = palette index - // b = color type, 2 is RGB - // c = R - // d = G - // e = B - - w.Write([]byte{ColorIntroducer}) //nolint:errcheck - io.WriteString(w, strconv.Itoa(paletteIndex)) //nolint:errcheck - io.WriteString(w, ";2;") - io.WriteString(w, strconv.Itoa(int(c.Red))) //nolint:errcheck - w.Write([]byte{';'}) //nolint:errcheck - io.WriteString(w, strconv.Itoa(int(c.Green))) //nolint:errcheck - w.Write([]byte{';'}) - io.WriteString(w, strconv.Itoa(int(c.Blue))) //nolint:errcheck + return newEncoder(w, &pixelBands).writePixelData(img, paletted) } -// sixelBuilder is a temporary structure used to create a SixelImage. It handles -// breaking pixels out into bits, and then encoding them into a sixel data string. RLE -// handling is included. -// -// Making use of a sixelBuilder is done in two phases. First, SetColor is used to write all -// pixels to the internal BitSet data. Then, GeneratePixels is called to retrieve a string -// representing the pixel data encoded in the sixel format. -type sixelBuilder struct { - SixelPalette sixelPalette - - imageHeight int - imageWidth int - - pixelBands bitset.BitSet - - imageData strings.Builder - repeatByte byte - repeatCount int -} - -// newSixelBuilder creates a sixelBuilder and prepares it for writing -func newSixelBuilder(width, height int, palette sixelPalette) sixelBuilder { - scratch := sixelBuilder{ - imageWidth: width, - imageHeight: height, - SixelPalette: palette, - } - - return scratch +// setColor will write a single pixel to the bitset data to be used by +// [encoder.writePixelData]. +func setColor(bands *bitset.BitSet, x int, y int, imageWidth int, bandHeight int, paletteIndex int) { + bandY := y / 6 + bit := bandHeight*imageWidth*6*paletteIndex + bandY*imageWidth*6 + (x * 6) + (y % 6) + bands.Set(uint(bit)) //nolint:gosec } -// BandHeight returns the number of six-pixel bands this image consists of -func (s *sixelBuilder) BandHeight() int { - bandHeight := s.imageHeight / 6 - if s.imageHeight%6 != 0 { +func bandHeight(img image.Image) int { + imageHeight := img.Bounds().Dy() + bandHeight := imageHeight / 6 + if imageHeight%6 != 0 { bandHeight++ } - return bandHeight } -// SetColor will write a single pixel to sixelBuilder's internal bitset data to be used by -// GeneratePixels -func (s *sixelBuilder) SetColor(x int, y int, color color.Color) { - bandY := y / 6 - paletteIndex := s.SixelPalette.ColorIndex(sixelConvertColor(color)) +// encoder is the internal encoder used to write sixel pixel data to a writer. +type encoder struct { + w io.Writer - bit := s.BandHeight()*s.imageWidth*6*paletteIndex + bandY*s.imageWidth*6 + (x * 6) + (y % 6) - s.pixelBands.Set(uint(bit)) + bands *bitset.BitSet + + repeatCount int + repeatChar byte } -// GeneratePixels is used to write the pixel data to the internal imageData string builder. -// All pixels in the image must be written to the sixelBuilder using SetColor before this method is -// called. This method returns a string that represents the pixel data. Sixel strings consist of five parts: -// ISC

ST -// The header contains some arbitrary options indicating how the sixel image is to be drawn. -// The palette maps palette indices to RGB colors -// The pixels indicates which pixels are to be drawn with which palette colors. -// -// GeneratePixels only produces the part of the string. The rest is written by -// Style.RenderSixelImage. -func (s *sixelBuilder) GeneratePixels() string { - s.imageData = strings.Builder{} - bandHeight := s.BandHeight() +func newEncoder(w io.Writer, bands *bitset.BitSet) *encoder { + return &encoder{ + w: w, + bands: bands, + } +} +// writePixelData will write the image pixel data to the writer. +func (s *encoder) writePixelData(img image.Image, paletted *image.Paletted) error { + imageWidth := img.Bounds().Dx() + bandHeight := bandHeight(img) for bandY := 0; bandY < bandHeight; bandY++ { if bandY > 0 { s.writeControlRune(LineBreak) @@ -162,16 +148,18 @@ func (s *sixelBuilder) GeneratePixels() string { hasWrittenAColor := false - for paletteIndex := 0; paletteIndex < len(s.SixelPalette.PaletteColors); paletteIndex++ { - if s.SixelPalette.PaletteColors[paletteIndex].Alpha < 1 { + for paletteIndex := 0; paletteIndex < len(paletted.Palette); paletteIndex++ { + c := paletted.Palette[paletteIndex] + _, _, _, a := c.RGBA() + if a == 0 { // Don't draw anything for purely transparent pixels continue } - firstColorBit := uint(s.BandHeight()*s.imageWidth*6*paletteIndex + bandY*s.imageWidth*6) - nextColorBit := firstColorBit + uint(s.imageWidth*6) + firstColorBit := uint(bandHeight*imageWidth*6*paletteIndex + bandY*imageWidth*6) //nolint:gosec + nextColorBit := firstColorBit + uint(imageWidth*6) //nolint:gosec - firstSetBitInBand, anySet := s.pixelBands.NextSet(firstColorBit) + firstSetBitInBand, anySet := s.bands.NextSet(firstColorBit) if !anySet || firstSetBitInBand >= nextColorBit { // Color not appearing in this row continue @@ -182,11 +170,12 @@ func (s *sixelBuilder) GeneratePixels() string { } hasWrittenAColor = true - // s.writeControlRune(ColorIntroducer) - // s.imageData.WriteString(strconv.Itoa(paletteIndex)) - for x := 0; x < s.imageWidth; x += 4 { - bit := firstColorBit + uint(x*6) - word := s.pixelBands.GetWord64AtBit(bit) + s.writeControlRune(ColorIntroducer) + io.WriteString(s.w, strconv.Itoa(paletteIndex)) //nolint:errcheck + + for x := 0; x < imageWidth; x += 4 { + bit := firstColorBit + uint(x*6) //nolint:gosec + word := s.bands.GetWord64AtBit(bit) pixel1 := byte((word & 63) + '?') pixel2 := byte(((word >> 6) & 63) + '?') @@ -195,17 +184,17 @@ func (s *sixelBuilder) GeneratePixels() string { s.writeImageRune(pixel1) - if x+1 >= s.imageWidth { + if x+1 >= imageWidth { continue } s.writeImageRune(pixel2) - if x+2 >= s.imageWidth { + if x+2 >= imageWidth { continue } s.writeImageRune(pixel3) - if x+3 >= s.imageWidth { + if x+3 >= imageWidth { continue } s.writeImageRune(pixel4) @@ -214,48 +203,46 @@ func (s *sixelBuilder) GeneratePixels() string { } s.writeControlRune('-') - return s.imageData.String() + return nil } // writeImageRune will write a single line of six pixels to pixel data. The data // doesn't get written to the imageData, it gets buffered for the purposes of RLE -func (s *sixelBuilder) writeImageRune(r byte) { - if r == s.repeatByte { - s.repeatCount++ +func (e *encoder) writeImageRune(r byte) { //nolint:revive + if r == e.repeatChar { + e.repeatCount++ return } - s.flushRepeats() - s.repeatByte = r - s.repeatCount = 1 + e.flushRepeats() + e.repeatChar = r + e.repeatCount = 1 } // writeControlRune will write a special rune such as a new line or carriage return // rune. It will call flushRepeats first, if necessary. -func (s *sixelBuilder) writeControlRune(r byte) { - if s.repeatCount > 0 { - s.flushRepeats() - s.repeatCount = 0 - s.repeatByte = 0 +func (e *encoder) writeControlRune(r byte) { + if e.repeatCount > 0 { + e.flushRepeats() + e.repeatCount = 0 + e.repeatChar = 0 } - s.imageData.WriteByte(r) + e.w.Write([]byte{r}) //nolint:errcheck } // flushRepeats is used to actually write the current repeatByte to the imageData when // it is about to change. This buffering is used to manage RLE in the sixelBuilder -func (s *sixelBuilder) flushRepeats() { - if s.repeatCount == 0 { +func (e *encoder) flushRepeats() { + if e.repeatCount == 0 { return } // Only write using the RLE form if it's actually providing space savings - if s.repeatCount > 3 { - WriteRepeat(&s.imageData, s.repeatCount, s.repeatByte) //nolint:errcheck + if e.repeatCount > 3 { + WriteRepeat(e.w, e.repeatCount, e.repeatChar) //nolint:errcheck return } - for i := 0; i < s.repeatCount; i++ { - s.imageData.WriteByte(s.repeatByte) - } + e.w.Write(bytes.Repeat([]byte{e.repeatChar}, e.repeatCount)) //nolint:errcheck } diff --git a/ansi/sixel/palette.go b/ansi/sixel/palette.go deleted file mode 100644 index 8205b3d8..00000000 --- a/ansi/sixel/palette.go +++ /dev/null @@ -1,351 +0,0 @@ -package sixel - -import ( - "container/heap" - "image" - "image/color" - "math" -) - -// sixelPalette is a palette of up to 256 colors that lists the colors that will be used by -// a SixelImage. Most images, especially jpegs, have more than 256 colors, so creating a sixelPalette -// requires the use of color quantization. For this we use the Median Cut algorithm. -// -// Median cut requires all pixels in an image to be positioned in a 4D color cube, with one axis per channel. -// The cube is sliced in half along its longest axis such that half the pixels in the cube end up in one of -// the sub-cubes and half end up in the other. We continue slicing the cube with the longest axis in half -// along that axis until there are 256 sub-cubes. Then, the average of all pixels in each subcube is used -// as that cube's color. -// -// Colors are converted to palette colors based on which they are closest to (it's not -// always their cube's color). -// -// This implementation has a few minor (but seemingly very common) differences from the Official algorithm: -// - When determining the longest axis, the number of pixels in the cube are multiplied against axis length -// This improves color selection by quite a bit in cases where an image has a lot of space taken up by different -// shades of the same color. -// - If a single color sits on a cut line, all pixels of that color are assigned to one of the subcubes -// rather than try to split them up between the subcubes. This allows us to use a slice of unique colors -// and a map of pixel counts rather than try to represent each pixel individually. -type sixelPalette struct { - // Map used to convert colors from the image to palette colors - colorConvert map[sixelColor]sixelColor - // Lookup to get palette index from image color - paletteIndexes map[sixelColor]int - PaletteColors []sixelColor -} - -// quantizationChannel is an enum type which indicates an axis in the color cube. Used to indicate which -// axis in a cube is the longest -type quantizationChannel int - -const ( - sixelMaxColors int = 256 - quantizationRed quantizationChannel = iota - quantizationGreen - quantizationBlue - quantizationAlpha -) - -// quantizationCube represents a single cube in the median cut algorithm. -type quantizationCube struct { - // startIndex is the index in the uniqueColors slice where this cube starts - startIndex int - // length is the number of elements in the uniqueColors slice this cube occupies - length int - // sliceChannel is the axis that will be cut if this cube is cut in half - sliceChannel quantizationChannel - // score is a heuristic value: higher means this cube is more likely to be cut - score uint64 - // pixelCount is how many pixels are contained in this cube - pixelCount uint64 -} - -// cubePriorityQueue is a heap used to sort quantizationCube objects in order to select the correct -// one to cut next. Pop will remove the queue with the highest score -type cubePriorityQueue []any - -func (p *cubePriorityQueue) Push(x any) { - *p = append(*p, x) -} - -func (p *cubePriorityQueue) Pop() any { - popped := (*p)[len(*p)-1] - *p = (*p)[:len(*p)-1] - return popped -} - -func (p *cubePriorityQueue) Len() int { - return len(*p) -} - -func (p *cubePriorityQueue) Less(i, j int) bool { - left := (*p)[i].(quantizationCube) - right := (*p)[j].(quantizationCube) - - // We want the largest channel variance - return left.score > right.score -} - -func (p *cubePriorityQueue) Swap(i, j int) { - (*p)[i], (*p)[j] = (*p)[j], (*p)[i] -} - -// createCube is used to initialize a new quantizationCube containing a region of the uniqueColors slice -func (p *sixelPalette) createCube(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, startIndex, bucketLength int) quantizationCube { - minRed, minGreen, minBlue, minAlpha := uint32(0xffff), uint32(0xffff), uint32(0xffff), uint32(0xffff) - maxRed, maxGreen, maxBlue, maxAlpha := uint32(0), uint32(0), uint32(0), uint32(0) - totalWeight := uint64(0) - - // Figure out which channel has the greatest variance - for i := startIndex; i < startIndex+bucketLength; i++ { - r, g, b, a := uniqueColors[i].Red, uniqueColors[i].Green, uniqueColors[i].Blue, uniqueColors[i].Alpha - totalWeight += pixelCounts[uniqueColors[i]] - - if r < minRed { - minRed = r - } - if r > maxRed { - maxRed = r - } - if g < minGreen { - minGreen = g - } - if g > maxGreen { - maxGreen = g - } - if b < minBlue { - minBlue = b - } - if b > maxBlue { - maxBlue = b - } - if a < minAlpha { - minAlpha = a - } - if a > maxAlpha { - maxAlpha = a - } - } - - dRed := maxRed - minRed - dGreen := maxGreen - minGreen - dBlue := maxBlue - minBlue - dAlpha := maxAlpha - minAlpha - - cube := quantizationCube{ - startIndex: startIndex, - length: bucketLength, - pixelCount: totalWeight, - } - - if dRed >= dGreen && dRed >= dBlue && dRed >= dAlpha { - cube.sliceChannel = quantizationRed - cube.score = uint64(dRed) - } else if dGreen >= dBlue && dGreen >= dAlpha { - cube.sliceChannel = quantizationGreen - cube.score = uint64(dGreen) - } else if dBlue >= dAlpha { - cube.sliceChannel = quantizationBlue - cube.score = uint64(dBlue) - } else { - cube.sliceChannel = quantizationAlpha - cube.score = uint64(dAlpha) - } - - // Boost the score of cubes with more pixels in them - cube.score *= totalWeight - - return cube -} - -// quantize is a method that will initialize the palette's colors and lookups, provided a set -// of unique colors and a map containing pixel counts for those colors -func (p *sixelPalette) quantize(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, maxColors int) { - p.colorConvert = make(map[sixelColor]sixelColor) - p.paletteIndexes = make(map[sixelColor]int) - - // We don't need to quantize if we don't even have more than the maximum colors, and in fact, this code will explode - // if we have fewer than maximum colors - if len(uniqueColors) <= maxColors { - p.PaletteColors = uniqueColors - return - } - - cubeHeap := make(cubePriorityQueue, 0, maxColors) - - // Start with a cube that contains all colors - heap.Init(&cubeHeap) - heap.Push(&cubeHeap, p.createCube(uniqueColors, pixelCounts, 0, len(uniqueColors))) - - // Slice the best cube into two cubes until we have max colors, then we have our palette - for cubeHeap.Len() < maxColors { - cubeToSplit := heap.Pop(&cubeHeap).(quantizationCube) - - // TODO: Use slices.SortFunc and cmp.Compare in the future (>=1.24) - // Then can delete palette_sort.go - sortFunc(uniqueColors[cubeToSplit.startIndex:cubeToSplit.startIndex+cubeToSplit.length], - func(left sixelColor, right sixelColor) int { - switch cubeToSplit.sliceChannel { - case quantizationRed: - return compare(left.Red, right.Red) - case quantizationGreen: - return compare(left.Green, right.Green) - case quantizationBlue: - return compare(left.Blue, right.Blue) - default: - return compare(left.Alpha, right.Alpha) - } - }) - - // We need to split up the colors in this cube so that the pixels are evenly split between the two, - // or at least as close as we can reasonably get. What we do is count up the pixels as we go through - // and place the cut point where around half of the pixels are on the left side - countSoFar := pixelCounts[uniqueColors[cubeToSplit.startIndex]] - targetCount := cubeToSplit.pixelCount / 2 - leftLength := 1 - - for i := cubeToSplit.startIndex + 1; i < cubeToSplit.startIndex+cubeToSplit.length; i++ { - c := uniqueColors[i] - weight := pixelCounts[c] - if countSoFar+weight > targetCount { - break - } - leftLength++ - countSoFar += weight - } - - rightLength := cubeToSplit.length - leftLength - rightIndex := cubeToSplit.startIndex + leftLength - heap.Push(&cubeHeap, p.createCube(uniqueColors, pixelCounts, cubeToSplit.startIndex, leftLength)) - heap.Push(&cubeHeap, p.createCube(uniqueColors, pixelCounts, rightIndex, rightLength)) - } - - // Once we've got max cubes in the heap, pull them all out and load them into the palette - for cubeHeap.Len() > 0 { - bucketToLoad := heap.Pop(&cubeHeap).(quantizationCube) - p.loadColor(uniqueColors, pixelCounts, bucketToLoad.startIndex, bucketToLoad.length) - } -} - -// ColorIndex accepts a raw image color (NOT a palette color) and provides the palette index of that color -func (p *sixelPalette) ColorIndex(c sixelColor) int { - return p.paletteIndexes[c] -} - -// loadColor accepts a range of colors representing a single median cut cube. It calculates the -// average color in the cube and adds it to the palette. -func (p *sixelPalette) loadColor(uniqueColors []sixelColor, pixelCounts map[sixelColor]uint64, startIndex, cubeLen int) { - totalRed, totalGreen, totalBlue, totalAlpha := uint64(0), uint64(0), uint64(0), uint64(0) - totalCount := uint64(0) - for i := startIndex; i < startIndex+cubeLen; i++ { - count := pixelCounts[uniqueColors[i]] - totalRed += uint64(uniqueColors[i].Red) * count - totalGreen += uint64(uniqueColors[i].Green) * count - totalBlue += uint64(uniqueColors[i].Blue) * count - totalAlpha += uint64(uniqueColors[i].Alpha) * count - totalCount += count - } - - averageColor := sixelColor{ - Red: uint32(totalRed / totalCount), - Green: uint32(totalGreen / totalCount), - Blue: uint32(totalBlue / totalCount), - Alpha: uint32(totalAlpha / totalCount), - } - - p.PaletteColors = append(p.PaletteColors, averageColor) -} - -// sixelColor is a flat struct that contains a single color: all channels are 0-100 -// instead of anything sensible -type sixelColor struct { - Red uint32 - Green uint32 - Blue uint32 - Alpha uint32 -} - -// sixelConvertColor accepts an ordinary Go color and converts it to a sixelColor, which -// has channels ranging from 0-100 -func sixelConvertColor(c color.Color) sixelColor { - r, g, b, a := c.RGBA() - return sixelColor{ - Red: sixelConvertChannel(r), - Green: sixelConvertChannel(g), - Blue: sixelConvertChannel(b), - Alpha: sixelConvertChannel(a), - } -} - -// sixelConvertChannel converts a single color channel from go's standard 0-0xffff range to -// sixel's 0-100 range -func sixelConvertChannel(channel uint32) uint32 { - // We add 328 because that is about 0.5 in the sixel 0-100 color range, we're trying to - // round to the nearest value - return (channel + 328) * 100 / 0xffff -} - -// imageConvertChannel converts a single color channel from sixel's 0-100 range to -// go's standard 0-0xffff range -func imageConvertChannel(channel uint32) uint32 { - return (channel*0xffff + 50) / 100 -} - -// newSixelPalette accepts an image and produces an N-color quantized color palette using the median cut -// algorithm. The produced sixelPalette can convert colors from the image to the quantized palette -// in O(1) time. -func newSixelPalette(image image.Image, maxColors int) sixelPalette { - pixelCounts := make(map[sixelColor]uint64) - - height := image.Bounds().Dy() - width := image.Bounds().Dx() - - // Record pixel counts for every color while also getting a set of all unique colors in the image - for y := 0; y < height; y++ { - for x := 0; x < width; x++ { - c := sixelConvertColor(image.At(x, y)) - count, _ := pixelCounts[c] - count++ - - pixelCounts[c] = count - } - } - - p := sixelPalette{} - uniqueColors := make([]sixelColor, 0, len(pixelCounts)) - for c := range pixelCounts { - uniqueColors = append(uniqueColors, c) - } - - // Build up p.PaletteColors using the median cut algorithm - p.quantize(uniqueColors, pixelCounts, maxColors) - - // The average color for a cube a color occupies is not always the closest palette color. As a result, - // we need to use this very upsetting double loop to find the lookup palette color for each - // unique color in the image. - for _, c := range uniqueColors { - var bestColor sixelColor - var bestColorIndex int - bestScore := uint32(math.MaxUint32) - - for paletteIndex, paletteColor := range p.PaletteColors { - redDiff := c.Red - paletteColor.Red - greenDiff := c.Green - paletteColor.Green - blueDiff := c.Blue - paletteColor.Blue - alphaDiff := c.Alpha - paletteColor.Alpha - - score := (redDiff * redDiff) + (greenDiff * greenDiff) + (blueDiff * blueDiff) + (alphaDiff * alphaDiff) - if score < bestScore { - bestColor = paletteColor - bestColorIndex = paletteIndex - bestScore = score - } - } - - p.paletteIndexes[c] = bestColorIndex - p.colorConvert[c] = bestColor - } - - return p -} diff --git a/ansi/sixel/palette_sort.go b/ansi/sixel/palette_sort.go deleted file mode 100644 index 0fe21e0c..00000000 --- a/ansi/sixel/palette_sort.go +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sixel - -import ( - "math/bits" -) - -const ( - unknownHint sortedHint = iota - increasingHint - decreasingHint -) - -type ordered interface { - ~int | ~int8 | ~int16 | ~int32 | ~int64 | - ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | - ~float32 | ~float64 | - ~string -} - -// Compare returns -// -// -1 if x is less than y, -// 0 if x equals y, -// +1 if x is greater than y. -// -// For floating-point types, a NaN is considered less than any non-NaN, -// a NaN is considered equal to a NaN, and -0.0 is equal to 0.0. -func compare[T ordered](x, y T) int { - xNaN := isNaN(x) - yNaN := isNaN(y) - if xNaN { - if yNaN { - return 0 - } - return -1 - } - if yNaN { - return +1 - } - if x < y { - return -1 - } - if x > y { - return +1 - } - return 0 -} - -// isNaN reports whether x is a NaN without requiring the math package. -// This will always return false if T is not floating-point. -func isNaN[T ordered](x T) bool { - return x != x -} - -func sortFunc[S ~[]E, E any](x S, cmp func(a, b E) int) { - n := len(x) - pdqsortCmpFunc(x, 0, n, bits.Len(uint(n)), cmp) -} - -type sortedHint int // hint for pdqsort when choosing the pivot - -// xorshift paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf -type xorshift uint64 - -func (r *xorshift) Next() uint64 { - *r ^= *r << 13 - *r ^= *r >> 7 - *r ^= *r << 17 - return uint64(*r) -} - -func nextPowerOfTwo(length int) uint { - return 1 << bits.Len(uint(length)) -} - -// insertionSortCmpFunc sorts data[a:b] using insertion sort. -func insertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { - for i := a + 1; i < b; i++ { - for j := i; j > a && (cmp(data[j], data[j-1]) < 0); j-- { - data[j], data[j-1] = data[j-1], data[j] - } - } -} - -// siftDownCmpFunc implements the heap property on data[lo:hi]. -// first is an offset into the array where the root of the heap lies. -func siftDownCmpFunc[E any](data []E, lo, hi, first int, cmp func(a, b E) int) { - root := lo - for { - child := 2*root + 1 - if child >= hi { - break - } - if child+1 < hi && (cmp(data[first+child], data[first+child+1]) < 0) { - child++ - } - if !(cmp(data[first+root], data[first+child]) < 0) { - return - } - data[first+root], data[first+child] = data[first+child], data[first+root] - root = child - } -} - -func heapSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { - first := a - lo := 0 - hi := b - a - - // Build heap with greatest element at top. - for i := (hi - 1) / 2; i >= 0; i-- { - siftDownCmpFunc(data, i, hi, first, cmp) - } - - // Pop elements, largest first, into end of data. - for i := hi - 1; i >= 0; i-- { - data[first], data[first+i] = data[first+i], data[first] - siftDownCmpFunc(data, lo, i, first, cmp) - } -} - -// pdqsortCmpFunc sorts data[a:b]. -// The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. -// pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf -// C++ implementation: https://github.com/orlp/pdqsort -// Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ -// limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. -func pdqsortCmpFunc[E any](data []E, a, b, limit int, cmp func(a, b E) int) { - const maxInsertion = 12 - - var ( - wasBalanced = true // whether the last partitioning was reasonably balanced - wasPartitioned = true // whether the slice was already partitioned - ) - - for { - length := b - a - - if length <= maxInsertion { - insertionSortCmpFunc(data, a, b, cmp) - return - } - - // Fall back to heapsort if too many bad choices were made. - if limit == 0 { - heapSortCmpFunc(data, a, b, cmp) - return - } - - // If the last partitioning was imbalanced, we need to breaking patterns. - if !wasBalanced { - breakPatternsCmpFunc(data, a, b, cmp) - limit-- - } - - pivot, hint := choosePivotCmpFunc(data, a, b, cmp) - if hint == decreasingHint { - reverseRangeCmpFunc(data, a, b, cmp) - // The chosen pivot was pivot-a elements after the start of the array. - // After reversing it is pivot-a elements before the end of the array. - // The idea came from Rust's implementation. - pivot = (b - 1) - (pivot - a) - hint = increasingHint - } - - // The slice is likely already sorted. - if wasBalanced && wasPartitioned && hint == increasingHint { - if partialInsertionSortCmpFunc(data, a, b, cmp) { - return - } - } - - // Probably the slice contains many duplicate elements, partition the slice into - // elements equal to and elements greater than the pivot. - if a > 0 && !(cmp(data[a-1], data[pivot]) < 0) { - mid := partitionEqualCmpFunc(data, a, b, pivot, cmp) - a = mid - continue - } - - mid, alreadyPartitioned := partitionCmpFunc(data, a, b, pivot, cmp) - wasPartitioned = alreadyPartitioned - - leftLen, rightLen := mid-a, b-mid - balanceThreshold := length / 8 - if leftLen < rightLen { - wasBalanced = leftLen >= balanceThreshold - pdqsortCmpFunc(data, a, mid, limit, cmp) - a = mid + 1 - } else { - wasBalanced = rightLen >= balanceThreshold - pdqsortCmpFunc(data, mid+1, b, limit, cmp) - b = mid - } - } -} - -// partitionCmpFunc does one quicksort partition. -// Let p = data[pivot] -// Moves elements in data[a:b] around, so that data[i]

=p for inewpivot. -// On return, data[newpivot] = p -func partitionCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int, alreadyPartitioned bool) { - data[a], data[pivot] = data[pivot], data[a] - i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned - - for i <= j && (cmp(data[i], data[a]) < 0) { - i++ - } - for i <= j && !(cmp(data[j], data[a]) < 0) { - j-- - } - if i > j { - data[j], data[a] = data[a], data[j] - return j, true - } - data[i], data[j] = data[j], data[i] - i++ - j-- - - for { - for i <= j && (cmp(data[i], data[a]) < 0) { - i++ - } - for i <= j && !(cmp(data[j], data[a]) < 0) { - j-- - } - if i > j { - break - } - data[i], data[j] = data[j], data[i] - i++ - j-- - } - data[j], data[a] = data[a], data[j] - return j, false -} - -// partitionEqualCmpFunc partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. -// It assumed that data[a:b] does not contain elements smaller than the data[pivot]. -func partitionEqualCmpFunc[E any](data []E, a, b, pivot int, cmp func(a, b E) int) (newpivot int) { - data[a], data[pivot] = data[pivot], data[a] - i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned - - for { - for i <= j && !(cmp(data[a], data[i]) < 0) { - i++ - } - for i <= j && (cmp(data[a], data[j]) < 0) { - j-- - } - if i > j { - break - } - data[i], data[j] = data[j], data[i] - i++ - j-- - } - return i -} - -// partialInsertionSortCmpFunc partially sorts a slice, returns true if the slice is sorted at the end. -func partialInsertionSortCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) bool { - const ( - maxSteps = 5 // maximum number of adjacent out-of-order pairs that will get shifted - shortestShifting = 50 // don't shift any elements on short arrays - ) - i := a + 1 - for j := 0; j < maxSteps; j++ { - for i < b && !(cmp(data[i], data[i-1]) < 0) { - i++ - } - - if i == b { - return true - } - - if b-a < shortestShifting { - return false - } - - data[i], data[i-1] = data[i-1], data[i] - - // Shift the smaller one to the left. - if i-a >= 2 { - for j := i - 1; j >= 1; j-- { - if !(cmp(data[j], data[j-1]) < 0) { - break - } - data[j], data[j-1] = data[j-1], data[j] - } - } - // Shift the greater one to the right. - if b-i >= 2 { - for j := i + 1; j < b; j++ { - if !(cmp(data[j], data[j-1]) < 0) { - break - } - data[j], data[j-1] = data[j-1], data[j] - } - } - } - return false -} - -// breakPatternsCmpFunc scatters some elements around in an attempt to break some patterns -// that might cause imbalanced partitions in quicksort. -func breakPatternsCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { - length := b - a - if length >= 8 { - random := xorshift(length) - modulus := nextPowerOfTwo(length) - - for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { - other := int(uint(random.Next()) & (modulus - 1)) - if other >= length { - other -= length - } - data[idx], data[a+other] = data[a+other], data[idx] - } - } -} - -// choosePivotCmpFunc chooses a pivot in data[a:b]. -// -// [0,8): chooses a static pivot. -// [8,shortestNinther): uses the simple median-of-three method. -// [shortestNinther,∞): uses the Tukey ninther method. -func choosePivotCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) (pivot int, hint sortedHint) { - const ( - shortestNinther = 50 - maxSwaps = 4 * 3 - ) - - l := b - a - - var ( - swaps int - i = a + l/4*1 - j = a + l/4*2 - k = a + l/4*3 - ) - - if l >= 8 { - if l >= shortestNinther { - // Tukey ninther method, the idea came from Rust's implementation. - i = medianAdjacentCmpFunc(data, i, &swaps, cmp) - j = medianAdjacentCmpFunc(data, j, &swaps, cmp) - k = medianAdjacentCmpFunc(data, k, &swaps, cmp) - } - // Find the median among i, j, k and stores it into j. - j = medianCmpFunc(data, i, j, k, &swaps, cmp) - } - - switch swaps { - case 0: - return j, increasingHint - case maxSwaps: - return j, decreasingHint - default: - return j, unknownHint - } -} - -// order2CmpFunc returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. -func order2CmpFunc[E any](data []E, a, b int, swaps *int, cmp func(a, b E) int) (int, int) { - if cmp(data[b], data[a]) < 0 { - *swaps++ - return b, a - } - return a, b -} - -// medianCmpFunc returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. -func medianCmpFunc[E any](data []E, a, b, c int, swaps *int, cmp func(a, b E) int) int { - a, b = order2CmpFunc(data, a, b, swaps, cmp) - b, c = order2CmpFunc(data, b, c, swaps, cmp) - a, b = order2CmpFunc(data, a, b, swaps, cmp) - return b -} - -// medianAdjacentCmpFunc finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. -func medianAdjacentCmpFunc[E any](data []E, a int, swaps *int, cmp func(a, b E) int) int { - return medianCmpFunc(data, a-1, a, a+1, swaps, cmp) -} - -func reverseRangeCmpFunc[E any](data []E, a, b int, cmp func(a, b E) int) { - i := a - j := b - 1 - for i < j { - data[i], data[j] = data[j], data[i] - i++ - j-- - } -} \ No newline at end of file diff --git a/ansi/sixel/palette_test.go b/ansi/sixel/palette_test.go deleted file mode 100644 index e3b2caab..00000000 --- a/ansi/sixel/palette_test.go +++ /dev/null @@ -1,124 +0,0 @@ -package sixel - -import ( - "image" - "image/color" - "testing" -) - -type testCase struct { - maxColors int - expectedPalette []sixelColor -} - -func TestPaletteCreationRedGreen(t *testing.T) { - redGreen := image.NewRGBA(image.Rect(0, 0, 2, 2)) - redGreen.Set(0, 0, color.RGBA{255, 0, 0, 255}) - redGreen.Set(0, 1, color.RGBA{128, 0, 0, 255}) - redGreen.Set(1, 0, color.RGBA{0, 255, 0, 255}) - redGreen.Set(1, 1, color.RGBA{0, 128, 0, 255}) - - testCases := map[string]testCase{ - "way too many colors": { - maxColors: 16, - expectedPalette: []sixelColor{ - {100, 0, 0, 100}, - {50, 0, 0, 100}, - {0, 100, 0, 100}, - {0, 50, 0, 100}, - }, - }, - "just the right number of colors": { - maxColors: 4, - expectedPalette: []sixelColor{ - {100, 0, 0, 100}, - {50, 0, 0, 100}, - {0, 100, 0, 100}, - {0, 50, 0, 100}, - }, - }, - "color reduction": { - maxColors: 2, - expectedPalette: []sixelColor{ - {75, 0, 0, 100}, - {0, 75, 0, 100}, - }, - }, - } - - runTests(t, redGreen, testCases) -} - -func TestPaletteWithSemiTransparency(t *testing.T) { - blueAlpha := image.NewRGBA(image.Rect(0, 0, 2, 2)) - blueAlpha.Set(0, 0, color.RGBA{0, 0, 255, 255}) - blueAlpha.Set(0, 1, color.RGBA{0, 0, 128, 255}) - blueAlpha.Set(1, 0, color.RGBA{0, 0, 255, 128}) - blueAlpha.Set(1, 1, color.RGBA{0, 0, 255, 0}) - - testCases := map[string]testCase{ - "just the right number of colors": { - maxColors: 4, - expectedPalette: []sixelColor{ - {0, 0, 100, 100}, - {0, 0, 50, 100}, - {0, 0, 100, 50}, - {0, 0, 100, 0}, - }, - }, - "color reduction": { - maxColors: 2, - expectedPalette: []sixelColor{ - {0, 0, 75, 100}, - {0, 0, 100, 25}, - }, - }, - } - runTests(t, blueAlpha, testCases) -} - -func runTests(t *testing.T, img image.Image, testCases map[string]testCase) { - for testName, test := range testCases { - t.Run(testName, func(t *testing.T) { - palette := newSixelPalette(img, test.maxColors) - if len(palette.PaletteColors) != len(test.expectedPalette) { - t.Errorf("Expected colors %+v in palette, but got %+v", test.expectedPalette, palette.PaletteColors) - return - } - - for _, c := range test.expectedPalette { - var foundColor bool - for _, paletteColor := range palette.PaletteColors { - if paletteColor == c { - foundColor = true - break - } - } - - if !foundColor { - t.Errorf("Expected colors %+v in palette, but got %+v", test.expectedPalette, palette.PaletteColors) - return - } - } - - for lookupRawColor, lookupPaletteColor := range palette.colorConvert { - paletteIndex, inReverseLookup := palette.paletteIndexes[lookupRawColor] - if !inReverseLookup { - t.Errorf("Color %+v maps to color %+v in the colorConvert map, but %+v is does not have a corresponding palette index.", lookupRawColor, lookupPaletteColor, lookupPaletteColor) - return - } - - if paletteIndex >= len(palette.PaletteColors) { - t.Errorf("Image color %+v maps to palette index %d, but there are only %d palette colors.", lookupRawColor, paletteIndex, len(palette.PaletteColors)) - return - } - - colorFromPalette := palette.PaletteColors[paletteIndex] - if colorFromPalette != lookupPaletteColor { - t.Errorf("Image color %+v maps to palette color %+v and palette index %d, but palette index %d is actually palette color %+v", lookupRawColor, lookupPaletteColor, paletteIndex, paletteIndex, colorFromPalette) - return - } - } - }) - } -} From 92f58dcb95f8ed2215ded13a9a4d9462b26ec14c Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 17:45:10 -0500 Subject: [PATCH 28/36] feat: use aymanbagabas/quant instead of soniakeys/quant for sort optimization --- ansi/go.mod | 6 ++++-- ansi/go.sum | 4 ++++ ansi/sixel/encoder.go | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ansi/go.mod b/ansi/go.mod index 155ae5d5..96c4af5e 100644 --- a/ansi/go.mod +++ b/ansi/go.mod @@ -6,7 +6,9 @@ require ( github.com/bits-and-blooms/bitset v1.20.0 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/mattn/go-runewidth v0.0.16 - github.com/rivo/uniseg v0.4.7 github.com/mattn/go-sixel v0.0.5 //go:build benchthis - github.com/soniakeys/quant v1.0.0 //go:build benchthis + github.com/rivo/uniseg v0.4.7 + github.com/soniakeys/quant v1.0.0 // indirect; go:build benchthis ) + +require github.com/aymanbagabas/quant v0.0.0-20250220224823-9dea6ec382b5 diff --git a/ansi/go.sum b/ansi/go.sum index c65a4659..a51164f1 100644 --- a/ansi/go.sum +++ b/ansi/go.sum @@ -1,3 +1,7 @@ +github.com/aymanbagabas/quant v0.0.0-20250220211315-dbeb2d26bb3a h1:6ZhOQa8FgHVtSmBW20Nbn6uNA9y1EJjUTtCmL2pJoGI= +github.com/aymanbagabas/quant v0.0.0-20250220211315-dbeb2d26bb3a/go.mod h1:LZcbdMgqlAs77pcs8WZnQxNflVHNtzWWDDUJoBFC24A= +github.com/aymanbagabas/quant v0.0.0-20250220224823-9dea6ec382b5 h1:BQwkJD8W8jgJpvJgA3klNG5W4pyrU4wJ7LynWik+uYc= +github.com/aymanbagabas/quant v0.0.0-20250220224823-9dea6ec382b5/go.mod h1:LZcbdMgqlAs77pcs8WZnQxNflVHNtzWWDDUJoBFC24A= github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index 6f18f2a5..c3ce0e58 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -7,9 +7,9 @@ import ( "io" "strconv" + "github.com/aymanbagabas/quant" + "github.com/aymanbagabas/quant/median" "github.com/bits-and-blooms/bitset" - "github.com/soniakeys/quant" - "github.com/soniakeys/quant/median" ) // Sixels are a protocol for writing images to the terminal by writing a large blob of ANSI-escaped data. From eec3c2cc18ab466b742378d5d6ae19d1b656d095 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 18:40:24 -0500 Subject: [PATCH 29/36] feat(ansi): sixel: support transparent color in encoder --- ansi/go.sum | 2 -- ansi/sixel/color.go | 6 ++--- ansi/sixel/encoder.go | 52 ++++++++++++++++++++++++++++++------------- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/ansi/go.sum b/ansi/go.sum index a51164f1..95977e4e 100644 --- a/ansi/go.sum +++ b/ansi/go.sum @@ -1,5 +1,3 @@ -github.com/aymanbagabas/quant v0.0.0-20250220211315-dbeb2d26bb3a h1:6ZhOQa8FgHVtSmBW20Nbn6uNA9y1EJjUTtCmL2pJoGI= -github.com/aymanbagabas/quant v0.0.0-20250220211315-dbeb2d26bb3a/go.mod h1:LZcbdMgqlAs77pcs8WZnQxNflVHNtzWWDDUJoBFC24A= github.com/aymanbagabas/quant v0.0.0-20250220224823-9dea6ec382b5 h1:BQwkJD8W8jgJpvJgA3klNG5W4pyrU4wJ7LynWik+uYc= github.com/aymanbagabas/quant v0.0.0-20250220224823-9dea6ec382b5/go.mod h1:LZcbdMgqlAs77pcs8WZnQxNflVHNtzWWDDUJoBFC24A= github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= diff --git a/ansi/sixel/color.go b/ansi/sixel/color.go index a5ecec23..d9a1bf13 100644 --- a/ansi/sixel/color.go +++ b/ansi/sixel/color.go @@ -32,10 +32,10 @@ func ConvertChannel(c uint32) uint32 { // FromColor returns a Sixel color from a color.Color. It converts the color // channels to the 0-100 range. func FromColor(c color.Color) Color { - r, g, b, a := c.RGBA() - if a == 0 { - return Color{Pu: 3} // Transparent color + if c == nil { + return Color{} } + r, g, b, _ := c.RGBA() return Color{ Pu: 2, // Always use RGB format "2" Px: int(ConvertChannel(r)), diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index c3ce0e58..b8ddf24c 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -4,10 +4,11 @@ import ( "bytes" "fmt" "image" + "image/color" + "image/draw" "io" "strconv" - "github.com/aymanbagabas/quant" "github.com/aymanbagabas/quant/median" "github.com/bits-and-blooms/bitset" ) @@ -37,12 +38,21 @@ const ( // Encoder is a Sixel encoder. It encodes an image to Sixel data format. type Encoder struct { - // Colors is the number of colors to use in the palette. The default is - // 256. - Colors int + // NumColors is the number of colors to use in the palette. It ranges from + // 1 to 256. Zero or less means to use the default value of 256. + NumColors int // Quantizer is the color quantizer to use. The default is median cut. - Quantizer quant.Quantizer + Quantizer draw.Quantizer + + // AddTransparent is a flag that indicates whether to add a transparent + // color to the palette. The default is false. + AddTransparent bool + + // TransparentColor is the color to use for the transparent color in the + // palette. If nil, [color.Transparent] will be used. + // This field is ignored if [Encoder.AddTransparent] is false. + TransparentColor color.Color } // Encode will accept an Image and write sixel data to a Writer. The sixel data @@ -54,9 +64,9 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { return nil } - nc := MaxColors - if e.Colors >= 2 { - nc = e.Colors + nc := e.NumColors + if nc <= 0 || nc > MaxColors { + nc = MaxColors } var paletted *image.Paletted @@ -68,7 +78,19 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { if q == nil { q = median.Quantizer(nc) } - paletted = q.Paletted(img) + + // Make sure we have a transparent color in the palette. + palette := color.Palette(make([]color.Color, 0, nc)) // preallocate one space for transparency + if e.AddTransparent { + c := e.TransparentColor + if c == nil { + c = color.Transparent + } + palette = append(palette, c) + } + palette = q.Quantize(palette, img) // quantizer.Quantize will only use the remaining space (255 colors) + paletted = image.NewPaletted(img.Bounds(), palette) + draw.Draw(paletted, img.Bounds(), img, image.Pt(0, 0), draw.Over) } imageBounds := img.Bounds() @@ -87,7 +109,6 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { if _, err := WriteColor(w, i, c.Pu, c.Px, c.Py, c.Pz); err != nil { return fmt.Errorf("error encoding color: %w", err) } - paletted.Palette[i] = c } var pixelBands bitset.BitSet @@ -96,11 +117,12 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { // Write pixel data to bitset. for y := 0; y < imageHeight; y++ { for x := 0; x < imageWidth; x++ { - setColor(&pixelBands, x, y, imageWidth, bandHeight, int(paletted.ColorIndexAt(x, y))) + index := paletted.ColorIndexAt(x, y) + setColor(&pixelBands, x, y, imageWidth, bandHeight, int(index)) } } - return newEncoder(w, &pixelBands).writePixelData(img, paletted) + return newEncoder(w, &pixelBands).writePixelData(img, paletted.Palette) } // setColor will write a single pixel to the bitset data to be used by @@ -138,7 +160,7 @@ func newEncoder(w io.Writer, bands *bitset.BitSet) *encoder { } // writePixelData will write the image pixel data to the writer. -func (s *encoder) writePixelData(img image.Image, paletted *image.Paletted) error { +func (s *encoder) writePixelData(img image.Image, palette color.Palette) error { imageWidth := img.Bounds().Dx() bandHeight := bandHeight(img) for bandY := 0; bandY < bandHeight; bandY++ { @@ -148,8 +170,8 @@ func (s *encoder) writePixelData(img image.Image, paletted *image.Paletted) erro hasWrittenAColor := false - for paletteIndex := 0; paletteIndex < len(paletted.Palette); paletteIndex++ { - c := paletted.Palette[paletteIndex] + for paletteIndex := 0; paletteIndex < len(palette); paletteIndex++ { + c := palette[paletteIndex] _, _, _, a := c.RGBA() if a == 0 { // Don't draw anything for purely transparent pixels From bd0387e4e597609b9809d6d6a536975c7616bb04 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 18:43:08 -0500 Subject: [PATCH 30/36] feat(ansi): sixel: add dithering support --- ansi/sixel/encoder.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index b8ddf24c..61d1cd56 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -53,6 +53,10 @@ type Encoder struct { // palette. If nil, [color.Transparent] will be used. // This field is ignored if [Encoder.AddTransparent] is false. TransparentColor color.Color + + // Ditherer is the ditherer to use. A nil value means no dithering. + // A dither example is [draw.FloydSteinberg]. + Ditherer draw.Drawer } // Encode will accept an Image and write sixel data to a Writer. The sixel data @@ -90,7 +94,12 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { } palette = q.Quantize(palette, img) // quantizer.Quantize will only use the remaining space (255 colors) paletted = image.NewPaletted(img.Bounds(), palette) - draw.Draw(paletted, img.Bounds(), img, image.Pt(0, 0), draw.Over) + + if e.Ditherer != nil { + e.Ditherer.Draw(paletted, img.Bounds(), img, image.Point{}) + } else { + draw.Draw(paletted, img.Bounds(), img, image.Point{}, draw.Over) + } } imageBounds := img.Bounds() From 1271e57346f18440a67a21ec95c9d1e4b62bafbf Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 18:50:24 -0500 Subject: [PATCH 31/36] chore(ansi): sixel: use unix line endings --- ansi/sixel/decoder.go | 1044 +++++++++++++++++++------------------- ansi/sixel/encoder.go | 558 ++++++++++---------- ansi/sixel/sixel_test.go | 414 +++++++-------- 3 files changed, 1008 insertions(+), 1008 deletions(-) diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index 8fa4e9a1..738cb349 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -1,522 +1,522 @@ -package sixel - -import ( - "bufio" - "errors" - "fmt" - "image" - "image/color" - "io" -) - -// buildDefaultDecodePalette will build a map that we'll use as the palette during -// the decoding process- it's pre-loaded with the default colors for sixels, in case -// we are decoding a legacy sixel image that doesn't define its own colors (technically -// permitted). -func buildDefaultDecodePalette() map[int]color.Color { - // Undefined colors in sixel images use a set of default colors: 0-15 - // are sixel-specific, 16-255 are the same as the xterm 256-color values - return map[int]color.Color{ - // Sixel-specific default colors - 0: color.RGBA{0, 0, 0, 255}, - 1: color.RGBA{51, 51, 204, 255}, - 2: color.RGBA{204, 36, 36, 255}, - 3: color.RGBA{51, 204, 51, 255}, - 4: color.RGBA{204, 51, 204, 255}, - 5: color.RGBA{51, 204, 204, 255}, - 6: color.RGBA{204, 204, 51, 255}, - 7: color.RGBA{120, 120, 120, 255}, - 8: color.RGBA{69, 69, 69, 255}, - 9: color.RGBA{87, 87, 153, 255}, - 10: color.RGBA{153, 69, 69, 255}, - 11: color.RGBA{87, 153, 87, 255}, - 12: color.RGBA{153, 87, 153, 255}, - 13: color.RGBA{87, 153, 153, 255}, - 14: color.RGBA{153, 153, 87, 255}, - 15: color.RGBA{204, 204, 204, 255}, - - // xterm colors - 16: color.RGBA{0, 0, 0, 255}, // Black1 - 17: color.RGBA{0, 0, 95, 255}, // DarkBlue2 - 18: color.RGBA{0, 0, 135, 255}, // DarkBlue1 - 19: color.RGBA{0, 0, 175, 255}, // DarkBlue - 20: color.RGBA{0, 0, 215, 255}, // Blue3 - 21: color.RGBA{0, 0, 255, 255}, // Blue2 - 22: color.RGBA{0, 95, 0, 255}, // DarkGreen4 - 23: color.RGBA{0, 95, 95, 255}, // DarkGreenBlue5 - 24: color.RGBA{0, 95, 135, 255}, // DarkGreenBlue4 - 25: color.RGBA{0, 95, 175, 255}, // DarkGreenBlue3 - 26: color.RGBA{0, 95, 215, 255}, // GreenBlue8 - 27: color.RGBA{0, 95, 255, 255}, // GreenBlue7 - 28: color.RGBA{0, 135, 0, 255}, // DarkGreen3 - 29: color.RGBA{0, 135, 95, 255}, // DarkGreen2 - 30: color.RGBA{0, 135, 0, 255}, // DarkGreenBlue2 - 31: color.RGBA{0, 135, 175, 255}, // DarkGreenBlue1 - 32: color.RGBA{0, 125, 215, 255}, // GreenBlue6 - 33: color.RGBA{0, 135, 255, 255}, // GreenBlue5 - 34: color.RGBA{0, 175, 0, 255}, // DarkGreen1 - 35: color.RGBA{0, 175, 95, 255}, // DarkGreen - 36: color.RGBA{0, 175, 135, 255}, // DarkBlueGreen - 37: color.RGBA{0, 175, 175, 255}, // DarkGreenBlue - 38: color.RGBA{0, 175, 215, 255}, // GreenBlue4 - 39: color.RGBA{0, 175, 255, 255}, // GreenBlue3 - 40: color.RGBA{0, 215, 0, 255}, // Green7 - 41: color.RGBA{0, 215, 95, 255}, // Green6 - 42: color.RGBA{0, 215, 135, 255}, // Green5 - 43: color.RGBA{0, 215, 175, 255}, // BlueGreen1 - 44: color.RGBA{0, 215, 215, 255}, // GreenBlue2 - 45: color.RGBA{0, 215, 255, 255}, // GreenBlue1 - 46: color.RGBA{0, 255, 0, 255}, // Green4 - 47: color.RGBA{0, 255, 95, 255}, // Green3 - 48: color.RGBA{0, 255, 135, 255}, // Green2 - 49: color.RGBA{0, 255, 175, 255}, // Green1 - 50: color.RGBA{0, 255, 215, 255}, // BlueGreen - 51: color.RGBA{0, 255, 255, 255}, // GreenBlue - 52: color.RGBA{95, 0, 0, 255}, // DarkRed2 - 53: color.RGBA{95, 0, 95, 255}, // DarkPurple4 - 54: color.RGBA{95, 0, 135, 255}, // DarkBluePurple2 - 55: color.RGBA{95, 0, 175, 255}, // DarkBluePurple1 - 56: color.RGBA{95, 0, 215, 255}, // PurpleBlue - 57: color.RGBA{95, 0, 255, 255}, // Blue1 - 58: color.RGBA{95, 95, 0, 255}, // DarkYellow4 - 59: color.RGBA{95, 95, 95, 255}, // Gray3 - 60: color.RGBA{95, 95, 135, 255}, // PlueBlue8 - 61: color.RGBA{95, 95, 175, 255}, // PaleBlue7 - 62: color.RGBA{95, 95, 215, 255}, // PaleBlue6 - 63: color.RGBA{95, 95, 255, 255}, // PaleBlue5 - 64: color.RGBA{95, 135, 0, 255}, // DarkYellow3 - 65: color.RGBA{95, 135, 95, 255}, // PaleGreen12 - 66: color.RGBA{95, 135, 135, 255}, // PaleGreen11 - 67: color.RGBA{95, 135, 175, 255}, // PaleGreenBlue10 - 68: color.RGBA{95, 135, 215, 255}, // PaleGreenBlue9 - 69: color.RGBA{95, 135, 255, 255}, // PaleBlue4 - 70: color.RGBA{95, 175, 0, 255}, // DarkGreenYellow - 71: color.RGBA{95, 175, 95, 255}, // PaleGreen11 - 72: color.RGBA{95, 175, 135, 255}, // PaleGreen10 - 73: color.RGBA{95, 175, 175, 255}, // PaleGreenBlue8 - 74: color.RGBA{95, 175, 215, 255}, // PaleGreenBlue7 - 75: color.RGBA{95, 175, 255, 255}, // PaleGreenBlue6 - 76: color.RGBA{95, 215, 0, 255}, // YellowGreen1 - 77: color.RGBA{95, 215, 95, 255}, // PaleGreen9 - 78: color.RGBA{95, 215, 135, 255}, // PaleGreen8 - 79: color.RGBA{95, 215, 175, 255}, // PaleGreen7 - 80: color.RGBA{95, 215, 215, 255}, // PaleGreenBlue5 - 81: color.RGBA{95, 215, 255, 255}, // PaleGreenBlue4 - 82: color.RGBA{95, 255, 0, 255}, // YellowGreen - 83: color.RGBA{95, 255, 95, 255}, // PaleGreen6 - 84: color.RGBA{95, 255, 135, 255}, // PaleGreen5 - 85: color.RGBA{95, 255, 175, 255}, // PaleGreen4 - 86: color.RGBA{95, 255, 215, 255}, // PaleGreen3 - 87: color.RGBA{95, 255, 255, 255}, // PaleGreenBlue3 - 88: color.RGBA{135, 0, 0, 255}, // DarkRed1 - 89: color.RGBA{135, 0, 95, 255}, // DarkPurple3 - 90: color.RGBA{135, 0, 135, 255}, // DarkPurple2 - 91: color.RGBA{135, 0, 175, 255}, // DarkBluePurple - 92: color.RGBA{135, 0, 215, 255}, // BluePurple4 - 93: color.RGBA{135, 0, 255, 255}, // BluePurple3 - 94: color.RGBA{135, 95, 0, 255}, // DarkOrange1 - 95: color.RGBA{135, 95, 95, 255}, // PaleRed5 - 96: color.RGBA{135, 95, 135, 255}, // PalePurple7 - 97: color.RGBA{135, 95, 175, 255}, // PalePurpleBlue - 98: color.RGBA{135, 95, 215, 255}, // PaleBlue3 - 99: color.RGBA{135, 95, 255, 255}, // PaleBlue2 - 100: color.RGBA{135, 135, 0, 255}, // DarkYellow2 - 101: color.RGBA{135, 135, 95, 255}, // PaleYellow7 - 102: color.RGBA{135, 135, 135, 255}, // Gray2 - 103: color.RGBA{135, 135, 175, 255}, // PaleBlue1 - 104: color.RGBA{135, 135, 215, 255}, // PaleBlue - 105: color.RGBA{135, 135, 255, 255}, // LightPaleBlue4 - 106: color.RGBA{135, 175, 0, 255}, // DarkYellow1 - 107: color.RGBA{135, 175, 95, 255}, // PaleYellowGreen3 - 108: color.RGBA{135, 175, 135, 255}, // PaleGreen2 - 109: color.RGBA{135, 175, 175, 255}, // PaleGreenBlue2 - 110: color.RGBA{135, 175, 215, 255}, // PaleGreenBlue1 - 111: color.RGBA{135, 175, 255, 255}, // LightPaleGreenBlue6 - 112: color.RGBA{135, 215, 0, 255}, // Yellow6 - 113: color.RGBA{135, 215, 95, 255}, // PaleYellowGreen2 - 114: color.RGBA{135, 215, 135, 255}, // PaleGreen1 - 115: color.RGBA{135, 215, 175, 255}, // PaleGreen - 116: color.RGBA{135, 215, 215, 255}, // PaleGreenBlue - 117: color.RGBA{135, 215, 255, 255}, // LightPaleGreenBlue5 - 118: color.RGBA{135, 255, 0, 255}, // GreenYellow - 119: color.RGBA{135, 255, 95, 255}, // PaleYellowGreen1 - 120: color.RGBA{135, 255, 135, 255}, // LightPaleGreen6 - 121: color.RGBA{135, 255, 175, 255}, // LightPaleGreen5 - 122: color.RGBA{135, 255, 215, 255}, // LightPaleGreen4 - 123: color.RGBA{135, 255, 255, 255}, // LightPaleGreenBlue4 - 124: color.RGBA{175, 0, 0, 255}, // DarkRed - 125: color.RGBA{175, 0, 95, 255}, // DarkRedPurple - 126: color.RGBA{175, 0, 135, 255}, // DarkPurple1 - 127: color.RGBA{175, 0, 175, 255}, // DarkPurple - 128: color.RGBA{175, 0, 215, 255}, // BluePurple2 - 129: color.RGBA{175, 0, 255, 255}, // BluePurple1 - 130: color.RGBA{175, 95, 0, 255}, // DarkOrange - 131: color.RGBA{175, 95, 95, 255}, // PaleRed4 - 132: color.RGBA{175, 95, 135, 255}, // PalePurpleRed3 - 133: color.RGBA{175, 95, 175, 255}, // PalePurple6 - 134: color.RGBA{175, 95, 215, 255}, // PaleBluePurple3 - 135: color.RGBA{175, 95, 255, 255}, // PaleBluePurple2 - 136: color.RGBA{175, 135, 0, 255}, // DarkYellowOrange - 137: color.RGBA{175, 135, 95, 255}, // PaleRedOrange3 - 138: color.RGBA{175, 135, 135, 255}, // PaleRed3 - 139: color.RGBA{175, 135, 175, 255}, // PalePurple5 - 140: color.RGBA{175, 135, 215, 255}, // PaleBluePurple1 - 141: color.RGBA{175, 135, 255, 255}, // LightPaleBlue3 - 142: color.RGBA{175, 175, 0, 255}, // DarkYellow - 143: color.RGBA{175, 175, 95, 255}, // PaleYellow6 - 144: color.RGBA{175, 175, 135, 255}, // PaleYellow5 - 145: color.RGBA{175, 175, 175, 255}, // Gray1 - 146: color.RGBA{175, 175, 215, 255}, // LightPaleBlue2 - 147: color.RGBA{175, 175, 255, 255}, // LightPaleBlue1 - 148: color.RGBA{175, 215, 0, 255}, // Yellow5 - 149: color.RGBA{175, 215, 95, 255}, // PaleYellow4 - 150: color.RGBA{175, 215, 135, 255}, // PaleGreenYellow - 151: color.RGBA{175, 215, 175, 255}, // LightPaleGreen3 - 152: color.RGBA{175, 215, 215, 255}, // LightPaleGreenBlue3 - 153: color.RGBA{175, 215, 255, 255}, // LightPaleGreenBlue2 - 154: color.RGBA{175, 255, 0, 255}, // Yellow4 - 155: color.RGBA{175, 255, 95, 255}, // PaleYellowGreen - 156: color.RGBA{175, 255, 135, 255}, // LightPaleYellowGreen1 - 157: color.RGBA{175, 255, 215, 255}, // LightPaleGreen2 - 158: color.RGBA{175, 255, 215, 255}, // LightPaleGreen1 - 159: color.RGBA{175, 255, 255, 255}, // LightPaleGreenBlue1 - 160: color.RGBA{215, 0, 0, 255}, // Red2 - 161: color.RGBA{215, 0, 95, 255}, // PurpleRed1 - 162: color.RGBA{215, 0, 135, 255}, // Purple6 - 163: color.RGBA{215, 0, 175, 255}, // Purple5 - 164: color.RGBA{215, 0, 215, 255}, // Purple4 - 165: color.RGBA{215, 0, 255, 255}, // BluePurple - 166: color.RGBA{215, 95, 0, 255}, // RedOrange1 - 167: color.RGBA{215, 95, 95, 255}, // PaleRed2 - 168: color.RGBA{215, 95, 135, 255}, // PalePurpleRed2 - 169: color.RGBA{215, 95, 175, 255}, // PalePurple4 - 170: color.RGBA{215, 95, 215, 255}, // PalePurple3 - 171: color.RGBA{215, 95, 255, 255}, // PaleBluePurple - 172: color.RGBA{215, 135, 0, 255}, // Orange2 - 173: color.RGBA{215, 135, 95, 255}, // PaleRedOrange2 - 174: color.RGBA{215, 135, 135, 255}, // PaleRed1 - 175: color.RGBA{215, 135, 175, 255}, // PaleRedPurple - 176: color.RGBA{215, 135, 215, 255}, // PalePurple2 - 177: color.RGBA{215, 135, 255, 255}, // LightPaleBluePurple - 178: color.RGBA{215, 175, 0, 255}, // OrangeYellow1 - 179: color.RGBA{215, 175, 95, 255}, // PaleOrange1 - 180: color.RGBA{215, 175, 135, 255}, // PaleRedOrange1 - 181: color.RGBA{215, 175, 175, 255}, // LightPaleRed3 - 182: color.RGBA{215, 175, 215, 255}, // LightPalePurple4 - 183: color.RGBA{215, 175, 255, 255}, // LightPalePurpleBlue - 184: color.RGBA{215, 215, 0, 255}, // Yellow3 - 185: color.RGBA{215, 215, 95, 255}, // PaleYellow3 - 186: color.RGBA{215, 215, 135, 255}, // PaleYellow2 - 187: color.RGBA{215, 215, 175, 255}, // LightPaleYellow4 - 188: color.RGBA{215, 215, 215, 255}, // LightGray - 189: color.RGBA{215, 215, 255, 255}, // LightPaleBlue - 190: color.RGBA{215, 255, 0, 255}, // Yellow2 - 191: color.RGBA{215, 255, 95, 255}, // PaleYellow1 - 192: color.RGBA{215, 255, 135, 255}, // LightPaleYellow3 - 193: color.RGBA{215, 255, 175, 255}, // LightPaleYellowGreen - 194: color.RGBA{215, 255, 215, 255}, // LightPaleGreen - 195: color.RGBA{215, 255, 255, 255}, // LightPaleGreenBlue - 196: color.RGBA{255, 0, 0, 255}, // Red1 - 197: color.RGBA{255, 0, 95, 255}, // PurpleRed - 198: color.RGBA{255, 0, 135, 255}, // RedPurple - 199: color.RGBA{255, 0, 175, 255}, // Purple3 - 200: color.RGBA{255, 0, 215, 255}, // Purple2 - 201: color.RGBA{255, 0, 255, 255}, // Purple1 - 202: color.RGBA{255, 95, 0, 255}, // RedOrange - 203: color.RGBA{255, 95, 95, 255}, // PaleRed - 204: color.RGBA{255, 95, 135, 255}, // PalePurpleRed1 - 205: color.RGBA{255, 95, 175, 255}, // PalePurpleRed - 206: color.RGBA{255, 95, 215, 255}, // PalePurple1 - 207: color.RGBA{255, 95, 255, 255}, // PalePurple - 208: color.RGBA{255, 135, 0, 255}, // Orange1 - 209: color.RGBA{255, 135, 95, 255}, // PaleOrangeRed - 210: color.RGBA{255, 135, 135, 255}, // LightPaleRed2 - 211: color.RGBA{255, 135, 175, 255}, // LightPalePurpleRed1 - 212: color.RGBA{255, 135, 215, 255}, // LightPalePurple3 - 213: color.RGBA{255, 135, 255, 255}, // LightPalePurple2 - 214: color.RGBA{255, 175, 0, 255}, // Orange - 215: color.RGBA{255, 175, 95, 255}, // PaleRedOrange - 216: color.RGBA{255, 175, 135, 255}, // LightPaleRedOrange1 - 217: color.RGBA{255, 175, 175, 255}, // LightPaleRed1 - 218: color.RGBA{255, 175, 215, 255}, // LightPalePurpleRed - 219: color.RGBA{255, 175, 255, 255}, // LightPalePurple1 - 220: color.RGBA{255, 215, 0, 255}, // OrangeYellow - 221: color.RGBA{255, 215, 95, 255}, // PaleOrange - 222: color.RGBA{255, 215, 135, 255}, // LightPaleOrange - 223: color.RGBA{255, 215, 175, 255}, // LightPaleRedOrange - 224: color.RGBA{255, 215, 215, 255}, // LightPaleRed - 225: color.RGBA{255, 215, 255, 255}, // LightPalePurple - 226: color.RGBA{255, 255, 0, 255}, // Yellow1 - 227: color.RGBA{255, 255, 95, 255}, // PaleYellow - 228: color.RGBA{255, 255, 135, 255}, // LightPaleYellow2 - 229: color.RGBA{255, 255, 175, 255}, // LightPaleYellow1 - 230: color.RGBA{255, 255, 215, 255}, // LightPaleYellow - 231: color.RGBA{255, 255, 255, 255}, // White1 - 232: color.RGBA{8, 8, 8, 255}, // Gray4 - 233: color.RGBA{18, 18, 18, 255}, // Gray8 - 234: color.RGBA{28, 28, 28, 255}, // Gray11 - 235: color.RGBA{38, 38, 38, 255}, // Gray15 - 236: color.RGBA{48, 48, 48, 255}, // Gray19 - 237: color.RGBA{58, 58, 58, 255}, // Gray23 - 238: color.RGBA{68, 68, 68, 255}, // Gray27 - 239: color.RGBA{78, 78, 78, 255}, // Gray31 - 240: color.RGBA{88, 88, 88, 255}, // Gray35 - 241: color.RGBA{98, 98, 98, 255}, // Gray39 - 242: color.RGBA{108, 108, 108, 255}, // Gray43 - 243: color.RGBA{118, 118, 118, 255}, // Gray47 - 244: color.RGBA{128, 128, 128, 255}, // Gray51 - 245: color.RGBA{138, 138, 138, 255}, // Gray55 - 246: color.RGBA{148, 148, 148, 255}, // Gray59 - 247: color.RGBA{158, 158, 158, 255}, // Gray62 - 248: color.RGBA{168, 168, 168, 255}, // Gray66 - 249: color.RGBA{178, 178, 178, 255}, // Gray70 - 250: color.RGBA{188, 188, 188, 255}, // Gray74 - 251: color.RGBA{198, 198, 198, 255}, // Gray78 - 252: color.RGBA{208, 208, 208, 255}, // Gray82 - 253: color.RGBA{218, 218, 218, 255}, // Gray86 - 254: color.RGBA{228, 228, 228, 255}, // Gray90 - 255: color.RGBA{238, 238, 238, 255}, // Gray94 - } -} - -// Decoder is a Sixel image decoder. It reads Sixel image data from an -// io.Reader and decodes it into an image.Image. -type Decoder struct{} - -// Decode will parse sixel image data into an image or return an error. Because -// the sixel image format does not have a predictable size, the end of the sixel -// image data can only be identified when ST, ESC, or BEL has been read from a reader. -// In order to avoid reading bytes from a reader one at a time to avoid missing -// the end, this method simply accepts a byte slice instead of a reader. Callers -// should read the entire escape sequence and pass the Ps..Ps portion of the sequence -// to this method. -func (d *Decoder) Decode(r io.Reader) (image.Image, error) { - rd := bufio.NewReader(r) - peeked, err := rd.Peek(1) - if err != nil { - return nil, err - } - - var bounds image.Rectangle - var raster Raster - if peeked[0] == RasterAttribute { - var read int - n := 16 - for { - peeked, err = rd.Peek(n) // random number, just need to read a few bytes - if err != nil { - return nil, err - } - - raster, read = DecodeRaster(peeked) - if read == 0 { - return nil, ErrInvalidRaster - } - if read >= n { - // We need to read more bytes to get the full raster - n *= 2 - continue - } - - rd.Discard(read) //nolint:errcheck - break - } - - bounds = image.Rect(0, 0, raster.Ph, raster.Pv) - } - - if bounds.Max.X == 0 || bounds.Max.Y == 0 { - // We're parsing the image with no pixel metrics so unread the byte for the - // main read loop - // Peek the whole buffer to get the size of the image before we start - // decoding it. - var data []byte - toPeak := 64 // arbitrary number of bytes to peak - for { - data, err = rd.Peek(toPeak) - if err != nil || len(data) < toPeak { - break - } - toPeak *= 2 - } - - width, height := d.scanSize(data) - bounds = image.Rect(0, 0, width, height) - } - - img := image.NewRGBA(bounds) - palette := buildDefaultDecodePalette() - var currentX, currentBandY, currentPaletteIndex int - - // data buffer used to decode Sixel commands - data := make([]byte, 0, 6) // arbitrary number of bytes to read - // i := 0 // keeps track of the data buffer index - for { - b, err := rd.ReadByte() - if err != nil { - return img, d.readError(err) - } - - count := 1 // default count for Sixel commands - switch { - case b == LineBreak: // LF - currentBandY++ - currentX = 0 - case b == CarriageReturn: // CR - currentX = 0 - case b == ColorIntroducer: // # - data = data[:0] - data = append(data, b) - for { - b, err = rd.ReadByte() - if err != nil { - return img, d.readError(err) - } - // Read bytes until we hit a non-color byte i.e. non-numeric - // and non-; - if (b < '0' || b > '9') && b != ';' { - rd.UnreadByte() //nolint:errcheck - break - } - - data = append(data, b) - } - - // Palette operation - c, n := DecodeColor(data) - if n == 0 { - return img, ErrInvalidColor - } - - currentPaletteIndex = c.Pc - if c.Pu > 0 { - // Non-zero Pu means we have a color definition to set. - palette[currentPaletteIndex] = c - } - - case b == RepeatIntroducer: // ! - data = data[:0] - data = append(data, b) - for { - b, err = rd.ReadByte() - if err != nil { - return img, d.readError(err) - } - // Read bytes until we hit a non-numeric and non-repeat byte. - if (b < '0' || b > '9') && (b < '?' || b > '~') { - rd.UnreadByte() //nolint:errcheck - break - } - - data = append(data, b) - } - - // RLE operation - r, n := DecodeRepeat(data) - if n == 0 { - return img, ErrInvalidRepeat - } - - count = r.Count - b = r.Char - fallthrough - case b >= '?' && b <= '~': - color := palette[currentPaletteIndex] - for i := 0; i < count; i++ { - d.writePixel(currentX, currentBandY, b, color, img) - currentX++ - } - } - } -} - -// writePixel will accept a sixel byte (from ? to ~) that defines 6 vertical pixels -// and write any filled pixels to the image -func (d *Decoder) writePixel(x int, bandY int, sixel byte, color color.Color, img *image.RGBA) { - maskedSixel := (sixel - '?') & 63 - yOffset := 0 - for maskedSixel != 0 { - if maskedSixel&1 != 0 { - img.Set(x, bandY*6+yOffset, color) - } - - yOffset++ - maskedSixel >>= 1 - } -} - -// scanSize is only used for legacy sixel images that do not define pixel metrics -// near the header (technically permitted). In this case, we need to quickly scan -// the image to figure out what the height and width are. Different terminals -// treat unfilled pixels around the border of the image diffently, but in our case -// we will treat all pixels, even empty ones, as part of the image. However, -// we will allow the image to end with an LF code without increasing the size -// of the image. -// -// In the interest of speed, this method doesn't really parse the image in any -// meaningful way: pixel codes (? to ~), and the RLE, CR, and LF indicators -// (!, $, -) cannot appear within a sixel image except as themselves, so we -// just ignore everything else. The only thing we actually take the time to parse -// is the number after the RLE indicator to know how much width to add to the current -// line. -func (d *Decoder) scanSize(data []byte) (int, int) { - var maxWidth, bandCount int - - // Pixel values are ? to ~. Each one of these encountered increases the max width. - // a - is a LF and increases the max band count by one. a $ is a CR and resets - // current width. (char - '?') will get a 6-bit number and the highest bit is - // the lowest y value, which we should use to increment maxBandPixels. - // - // a ! is a RLE indicator, and we should add the numeral to the current width - var currentWidth int - newBand := true - for i := 0; i < len(data); i++ { - b := data[i] - switch { - case b == LineBreak: - // LF - currentWidth = 0 - // The image may end with an LF, so we shouldn't increment the band - // count until we encounter a pixel - newBand = true - case b == CarriageReturn: - // CR - currentWidth = 0 - case b == RepeatIntroducer || (b <= '~' && b >= '?'): - count := 1 - if b == RepeatIntroducer { - // Get the run length for the RLE operation - r, n := DecodeRepeat(data[i:]) - if n == 0 { - return maxWidth, bandCount * 6 - } - - // 1 is added in the loop - i += n - 1 - count = r.Count - } - - currentWidth += count - if newBand { - newBand = false - bandCount++ - } - - maxWidth = max(maxWidth, currentWidth) - } - } - - return maxWidth, bandCount * 6 -} - -// readError will take any error returned from a read method (ReadByte, -// FScanF, etc.) and either wrap or ignore the error. An encountered EOF -// indicates that it's time to return the completed image so we just -// return it. -func (d *Decoder) readError(err error) error { - if errors.Is(err, io.EOF) { - return nil - } - - return fmt.Errorf("failed to read sixel data: %w", err) -} +package sixel + +import ( + "bufio" + "errors" + "fmt" + "image" + "image/color" + "io" +) + +// buildDefaultDecodePalette will build a map that we'll use as the palette during +// the decoding process- it's pre-loaded with the default colors for sixels, in case +// we are decoding a legacy sixel image that doesn't define its own colors (technically +// permitted). +func buildDefaultDecodePalette() map[int]color.Color { + // Undefined colors in sixel images use a set of default colors: 0-15 + // are sixel-specific, 16-255 are the same as the xterm 256-color values + return map[int]color.Color{ + // Sixel-specific default colors + 0: color.RGBA{0, 0, 0, 255}, + 1: color.RGBA{51, 51, 204, 255}, + 2: color.RGBA{204, 36, 36, 255}, + 3: color.RGBA{51, 204, 51, 255}, + 4: color.RGBA{204, 51, 204, 255}, + 5: color.RGBA{51, 204, 204, 255}, + 6: color.RGBA{204, 204, 51, 255}, + 7: color.RGBA{120, 120, 120, 255}, + 8: color.RGBA{69, 69, 69, 255}, + 9: color.RGBA{87, 87, 153, 255}, + 10: color.RGBA{153, 69, 69, 255}, + 11: color.RGBA{87, 153, 87, 255}, + 12: color.RGBA{153, 87, 153, 255}, + 13: color.RGBA{87, 153, 153, 255}, + 14: color.RGBA{153, 153, 87, 255}, + 15: color.RGBA{204, 204, 204, 255}, + + // xterm colors + 16: color.RGBA{0, 0, 0, 255}, // Black1 + 17: color.RGBA{0, 0, 95, 255}, // DarkBlue2 + 18: color.RGBA{0, 0, 135, 255}, // DarkBlue1 + 19: color.RGBA{0, 0, 175, 255}, // DarkBlue + 20: color.RGBA{0, 0, 215, 255}, // Blue3 + 21: color.RGBA{0, 0, 255, 255}, // Blue2 + 22: color.RGBA{0, 95, 0, 255}, // DarkGreen4 + 23: color.RGBA{0, 95, 95, 255}, // DarkGreenBlue5 + 24: color.RGBA{0, 95, 135, 255}, // DarkGreenBlue4 + 25: color.RGBA{0, 95, 175, 255}, // DarkGreenBlue3 + 26: color.RGBA{0, 95, 215, 255}, // GreenBlue8 + 27: color.RGBA{0, 95, 255, 255}, // GreenBlue7 + 28: color.RGBA{0, 135, 0, 255}, // DarkGreen3 + 29: color.RGBA{0, 135, 95, 255}, // DarkGreen2 + 30: color.RGBA{0, 135, 0, 255}, // DarkGreenBlue2 + 31: color.RGBA{0, 135, 175, 255}, // DarkGreenBlue1 + 32: color.RGBA{0, 125, 215, 255}, // GreenBlue6 + 33: color.RGBA{0, 135, 255, 255}, // GreenBlue5 + 34: color.RGBA{0, 175, 0, 255}, // DarkGreen1 + 35: color.RGBA{0, 175, 95, 255}, // DarkGreen + 36: color.RGBA{0, 175, 135, 255}, // DarkBlueGreen + 37: color.RGBA{0, 175, 175, 255}, // DarkGreenBlue + 38: color.RGBA{0, 175, 215, 255}, // GreenBlue4 + 39: color.RGBA{0, 175, 255, 255}, // GreenBlue3 + 40: color.RGBA{0, 215, 0, 255}, // Green7 + 41: color.RGBA{0, 215, 95, 255}, // Green6 + 42: color.RGBA{0, 215, 135, 255}, // Green5 + 43: color.RGBA{0, 215, 175, 255}, // BlueGreen1 + 44: color.RGBA{0, 215, 215, 255}, // GreenBlue2 + 45: color.RGBA{0, 215, 255, 255}, // GreenBlue1 + 46: color.RGBA{0, 255, 0, 255}, // Green4 + 47: color.RGBA{0, 255, 95, 255}, // Green3 + 48: color.RGBA{0, 255, 135, 255}, // Green2 + 49: color.RGBA{0, 255, 175, 255}, // Green1 + 50: color.RGBA{0, 255, 215, 255}, // BlueGreen + 51: color.RGBA{0, 255, 255, 255}, // GreenBlue + 52: color.RGBA{95, 0, 0, 255}, // DarkRed2 + 53: color.RGBA{95, 0, 95, 255}, // DarkPurple4 + 54: color.RGBA{95, 0, 135, 255}, // DarkBluePurple2 + 55: color.RGBA{95, 0, 175, 255}, // DarkBluePurple1 + 56: color.RGBA{95, 0, 215, 255}, // PurpleBlue + 57: color.RGBA{95, 0, 255, 255}, // Blue1 + 58: color.RGBA{95, 95, 0, 255}, // DarkYellow4 + 59: color.RGBA{95, 95, 95, 255}, // Gray3 + 60: color.RGBA{95, 95, 135, 255}, // PlueBlue8 + 61: color.RGBA{95, 95, 175, 255}, // PaleBlue7 + 62: color.RGBA{95, 95, 215, 255}, // PaleBlue6 + 63: color.RGBA{95, 95, 255, 255}, // PaleBlue5 + 64: color.RGBA{95, 135, 0, 255}, // DarkYellow3 + 65: color.RGBA{95, 135, 95, 255}, // PaleGreen12 + 66: color.RGBA{95, 135, 135, 255}, // PaleGreen11 + 67: color.RGBA{95, 135, 175, 255}, // PaleGreenBlue10 + 68: color.RGBA{95, 135, 215, 255}, // PaleGreenBlue9 + 69: color.RGBA{95, 135, 255, 255}, // PaleBlue4 + 70: color.RGBA{95, 175, 0, 255}, // DarkGreenYellow + 71: color.RGBA{95, 175, 95, 255}, // PaleGreen11 + 72: color.RGBA{95, 175, 135, 255}, // PaleGreen10 + 73: color.RGBA{95, 175, 175, 255}, // PaleGreenBlue8 + 74: color.RGBA{95, 175, 215, 255}, // PaleGreenBlue7 + 75: color.RGBA{95, 175, 255, 255}, // PaleGreenBlue6 + 76: color.RGBA{95, 215, 0, 255}, // YellowGreen1 + 77: color.RGBA{95, 215, 95, 255}, // PaleGreen9 + 78: color.RGBA{95, 215, 135, 255}, // PaleGreen8 + 79: color.RGBA{95, 215, 175, 255}, // PaleGreen7 + 80: color.RGBA{95, 215, 215, 255}, // PaleGreenBlue5 + 81: color.RGBA{95, 215, 255, 255}, // PaleGreenBlue4 + 82: color.RGBA{95, 255, 0, 255}, // YellowGreen + 83: color.RGBA{95, 255, 95, 255}, // PaleGreen6 + 84: color.RGBA{95, 255, 135, 255}, // PaleGreen5 + 85: color.RGBA{95, 255, 175, 255}, // PaleGreen4 + 86: color.RGBA{95, 255, 215, 255}, // PaleGreen3 + 87: color.RGBA{95, 255, 255, 255}, // PaleGreenBlue3 + 88: color.RGBA{135, 0, 0, 255}, // DarkRed1 + 89: color.RGBA{135, 0, 95, 255}, // DarkPurple3 + 90: color.RGBA{135, 0, 135, 255}, // DarkPurple2 + 91: color.RGBA{135, 0, 175, 255}, // DarkBluePurple + 92: color.RGBA{135, 0, 215, 255}, // BluePurple4 + 93: color.RGBA{135, 0, 255, 255}, // BluePurple3 + 94: color.RGBA{135, 95, 0, 255}, // DarkOrange1 + 95: color.RGBA{135, 95, 95, 255}, // PaleRed5 + 96: color.RGBA{135, 95, 135, 255}, // PalePurple7 + 97: color.RGBA{135, 95, 175, 255}, // PalePurpleBlue + 98: color.RGBA{135, 95, 215, 255}, // PaleBlue3 + 99: color.RGBA{135, 95, 255, 255}, // PaleBlue2 + 100: color.RGBA{135, 135, 0, 255}, // DarkYellow2 + 101: color.RGBA{135, 135, 95, 255}, // PaleYellow7 + 102: color.RGBA{135, 135, 135, 255}, // Gray2 + 103: color.RGBA{135, 135, 175, 255}, // PaleBlue1 + 104: color.RGBA{135, 135, 215, 255}, // PaleBlue + 105: color.RGBA{135, 135, 255, 255}, // LightPaleBlue4 + 106: color.RGBA{135, 175, 0, 255}, // DarkYellow1 + 107: color.RGBA{135, 175, 95, 255}, // PaleYellowGreen3 + 108: color.RGBA{135, 175, 135, 255}, // PaleGreen2 + 109: color.RGBA{135, 175, 175, 255}, // PaleGreenBlue2 + 110: color.RGBA{135, 175, 215, 255}, // PaleGreenBlue1 + 111: color.RGBA{135, 175, 255, 255}, // LightPaleGreenBlue6 + 112: color.RGBA{135, 215, 0, 255}, // Yellow6 + 113: color.RGBA{135, 215, 95, 255}, // PaleYellowGreen2 + 114: color.RGBA{135, 215, 135, 255}, // PaleGreen1 + 115: color.RGBA{135, 215, 175, 255}, // PaleGreen + 116: color.RGBA{135, 215, 215, 255}, // PaleGreenBlue + 117: color.RGBA{135, 215, 255, 255}, // LightPaleGreenBlue5 + 118: color.RGBA{135, 255, 0, 255}, // GreenYellow + 119: color.RGBA{135, 255, 95, 255}, // PaleYellowGreen1 + 120: color.RGBA{135, 255, 135, 255}, // LightPaleGreen6 + 121: color.RGBA{135, 255, 175, 255}, // LightPaleGreen5 + 122: color.RGBA{135, 255, 215, 255}, // LightPaleGreen4 + 123: color.RGBA{135, 255, 255, 255}, // LightPaleGreenBlue4 + 124: color.RGBA{175, 0, 0, 255}, // DarkRed + 125: color.RGBA{175, 0, 95, 255}, // DarkRedPurple + 126: color.RGBA{175, 0, 135, 255}, // DarkPurple1 + 127: color.RGBA{175, 0, 175, 255}, // DarkPurple + 128: color.RGBA{175, 0, 215, 255}, // BluePurple2 + 129: color.RGBA{175, 0, 255, 255}, // BluePurple1 + 130: color.RGBA{175, 95, 0, 255}, // DarkOrange + 131: color.RGBA{175, 95, 95, 255}, // PaleRed4 + 132: color.RGBA{175, 95, 135, 255}, // PalePurpleRed3 + 133: color.RGBA{175, 95, 175, 255}, // PalePurple6 + 134: color.RGBA{175, 95, 215, 255}, // PaleBluePurple3 + 135: color.RGBA{175, 95, 255, 255}, // PaleBluePurple2 + 136: color.RGBA{175, 135, 0, 255}, // DarkYellowOrange + 137: color.RGBA{175, 135, 95, 255}, // PaleRedOrange3 + 138: color.RGBA{175, 135, 135, 255}, // PaleRed3 + 139: color.RGBA{175, 135, 175, 255}, // PalePurple5 + 140: color.RGBA{175, 135, 215, 255}, // PaleBluePurple1 + 141: color.RGBA{175, 135, 255, 255}, // LightPaleBlue3 + 142: color.RGBA{175, 175, 0, 255}, // DarkYellow + 143: color.RGBA{175, 175, 95, 255}, // PaleYellow6 + 144: color.RGBA{175, 175, 135, 255}, // PaleYellow5 + 145: color.RGBA{175, 175, 175, 255}, // Gray1 + 146: color.RGBA{175, 175, 215, 255}, // LightPaleBlue2 + 147: color.RGBA{175, 175, 255, 255}, // LightPaleBlue1 + 148: color.RGBA{175, 215, 0, 255}, // Yellow5 + 149: color.RGBA{175, 215, 95, 255}, // PaleYellow4 + 150: color.RGBA{175, 215, 135, 255}, // PaleGreenYellow + 151: color.RGBA{175, 215, 175, 255}, // LightPaleGreen3 + 152: color.RGBA{175, 215, 215, 255}, // LightPaleGreenBlue3 + 153: color.RGBA{175, 215, 255, 255}, // LightPaleGreenBlue2 + 154: color.RGBA{175, 255, 0, 255}, // Yellow4 + 155: color.RGBA{175, 255, 95, 255}, // PaleYellowGreen + 156: color.RGBA{175, 255, 135, 255}, // LightPaleYellowGreen1 + 157: color.RGBA{175, 255, 215, 255}, // LightPaleGreen2 + 158: color.RGBA{175, 255, 215, 255}, // LightPaleGreen1 + 159: color.RGBA{175, 255, 255, 255}, // LightPaleGreenBlue1 + 160: color.RGBA{215, 0, 0, 255}, // Red2 + 161: color.RGBA{215, 0, 95, 255}, // PurpleRed1 + 162: color.RGBA{215, 0, 135, 255}, // Purple6 + 163: color.RGBA{215, 0, 175, 255}, // Purple5 + 164: color.RGBA{215, 0, 215, 255}, // Purple4 + 165: color.RGBA{215, 0, 255, 255}, // BluePurple + 166: color.RGBA{215, 95, 0, 255}, // RedOrange1 + 167: color.RGBA{215, 95, 95, 255}, // PaleRed2 + 168: color.RGBA{215, 95, 135, 255}, // PalePurpleRed2 + 169: color.RGBA{215, 95, 175, 255}, // PalePurple4 + 170: color.RGBA{215, 95, 215, 255}, // PalePurple3 + 171: color.RGBA{215, 95, 255, 255}, // PaleBluePurple + 172: color.RGBA{215, 135, 0, 255}, // Orange2 + 173: color.RGBA{215, 135, 95, 255}, // PaleRedOrange2 + 174: color.RGBA{215, 135, 135, 255}, // PaleRed1 + 175: color.RGBA{215, 135, 175, 255}, // PaleRedPurple + 176: color.RGBA{215, 135, 215, 255}, // PalePurple2 + 177: color.RGBA{215, 135, 255, 255}, // LightPaleBluePurple + 178: color.RGBA{215, 175, 0, 255}, // OrangeYellow1 + 179: color.RGBA{215, 175, 95, 255}, // PaleOrange1 + 180: color.RGBA{215, 175, 135, 255}, // PaleRedOrange1 + 181: color.RGBA{215, 175, 175, 255}, // LightPaleRed3 + 182: color.RGBA{215, 175, 215, 255}, // LightPalePurple4 + 183: color.RGBA{215, 175, 255, 255}, // LightPalePurpleBlue + 184: color.RGBA{215, 215, 0, 255}, // Yellow3 + 185: color.RGBA{215, 215, 95, 255}, // PaleYellow3 + 186: color.RGBA{215, 215, 135, 255}, // PaleYellow2 + 187: color.RGBA{215, 215, 175, 255}, // LightPaleYellow4 + 188: color.RGBA{215, 215, 215, 255}, // LightGray + 189: color.RGBA{215, 215, 255, 255}, // LightPaleBlue + 190: color.RGBA{215, 255, 0, 255}, // Yellow2 + 191: color.RGBA{215, 255, 95, 255}, // PaleYellow1 + 192: color.RGBA{215, 255, 135, 255}, // LightPaleYellow3 + 193: color.RGBA{215, 255, 175, 255}, // LightPaleYellowGreen + 194: color.RGBA{215, 255, 215, 255}, // LightPaleGreen + 195: color.RGBA{215, 255, 255, 255}, // LightPaleGreenBlue + 196: color.RGBA{255, 0, 0, 255}, // Red1 + 197: color.RGBA{255, 0, 95, 255}, // PurpleRed + 198: color.RGBA{255, 0, 135, 255}, // RedPurple + 199: color.RGBA{255, 0, 175, 255}, // Purple3 + 200: color.RGBA{255, 0, 215, 255}, // Purple2 + 201: color.RGBA{255, 0, 255, 255}, // Purple1 + 202: color.RGBA{255, 95, 0, 255}, // RedOrange + 203: color.RGBA{255, 95, 95, 255}, // PaleRed + 204: color.RGBA{255, 95, 135, 255}, // PalePurpleRed1 + 205: color.RGBA{255, 95, 175, 255}, // PalePurpleRed + 206: color.RGBA{255, 95, 215, 255}, // PalePurple1 + 207: color.RGBA{255, 95, 255, 255}, // PalePurple + 208: color.RGBA{255, 135, 0, 255}, // Orange1 + 209: color.RGBA{255, 135, 95, 255}, // PaleOrangeRed + 210: color.RGBA{255, 135, 135, 255}, // LightPaleRed2 + 211: color.RGBA{255, 135, 175, 255}, // LightPalePurpleRed1 + 212: color.RGBA{255, 135, 215, 255}, // LightPalePurple3 + 213: color.RGBA{255, 135, 255, 255}, // LightPalePurple2 + 214: color.RGBA{255, 175, 0, 255}, // Orange + 215: color.RGBA{255, 175, 95, 255}, // PaleRedOrange + 216: color.RGBA{255, 175, 135, 255}, // LightPaleRedOrange1 + 217: color.RGBA{255, 175, 175, 255}, // LightPaleRed1 + 218: color.RGBA{255, 175, 215, 255}, // LightPalePurpleRed + 219: color.RGBA{255, 175, 255, 255}, // LightPalePurple1 + 220: color.RGBA{255, 215, 0, 255}, // OrangeYellow + 221: color.RGBA{255, 215, 95, 255}, // PaleOrange + 222: color.RGBA{255, 215, 135, 255}, // LightPaleOrange + 223: color.RGBA{255, 215, 175, 255}, // LightPaleRedOrange + 224: color.RGBA{255, 215, 215, 255}, // LightPaleRed + 225: color.RGBA{255, 215, 255, 255}, // LightPalePurple + 226: color.RGBA{255, 255, 0, 255}, // Yellow1 + 227: color.RGBA{255, 255, 95, 255}, // PaleYellow + 228: color.RGBA{255, 255, 135, 255}, // LightPaleYellow2 + 229: color.RGBA{255, 255, 175, 255}, // LightPaleYellow1 + 230: color.RGBA{255, 255, 215, 255}, // LightPaleYellow + 231: color.RGBA{255, 255, 255, 255}, // White1 + 232: color.RGBA{8, 8, 8, 255}, // Gray4 + 233: color.RGBA{18, 18, 18, 255}, // Gray8 + 234: color.RGBA{28, 28, 28, 255}, // Gray11 + 235: color.RGBA{38, 38, 38, 255}, // Gray15 + 236: color.RGBA{48, 48, 48, 255}, // Gray19 + 237: color.RGBA{58, 58, 58, 255}, // Gray23 + 238: color.RGBA{68, 68, 68, 255}, // Gray27 + 239: color.RGBA{78, 78, 78, 255}, // Gray31 + 240: color.RGBA{88, 88, 88, 255}, // Gray35 + 241: color.RGBA{98, 98, 98, 255}, // Gray39 + 242: color.RGBA{108, 108, 108, 255}, // Gray43 + 243: color.RGBA{118, 118, 118, 255}, // Gray47 + 244: color.RGBA{128, 128, 128, 255}, // Gray51 + 245: color.RGBA{138, 138, 138, 255}, // Gray55 + 246: color.RGBA{148, 148, 148, 255}, // Gray59 + 247: color.RGBA{158, 158, 158, 255}, // Gray62 + 248: color.RGBA{168, 168, 168, 255}, // Gray66 + 249: color.RGBA{178, 178, 178, 255}, // Gray70 + 250: color.RGBA{188, 188, 188, 255}, // Gray74 + 251: color.RGBA{198, 198, 198, 255}, // Gray78 + 252: color.RGBA{208, 208, 208, 255}, // Gray82 + 253: color.RGBA{218, 218, 218, 255}, // Gray86 + 254: color.RGBA{228, 228, 228, 255}, // Gray90 + 255: color.RGBA{238, 238, 238, 255}, // Gray94 + } +} + +// Decoder is a Sixel image decoder. It reads Sixel image data from an +// io.Reader and decodes it into an image.Image. +type Decoder struct{} + +// Decode will parse sixel image data into an image or return an error. Because +// the sixel image format does not have a predictable size, the end of the sixel +// image data can only be identified when ST, ESC, or BEL has been read from a reader. +// In order to avoid reading bytes from a reader one at a time to avoid missing +// the end, this method simply accepts a byte slice instead of a reader. Callers +// should read the entire escape sequence and pass the Ps..Ps portion of the sequence +// to this method. +func (d *Decoder) Decode(r io.Reader) (image.Image, error) { + rd := bufio.NewReader(r) + peeked, err := rd.Peek(1) + if err != nil { + return nil, err + } + + var bounds image.Rectangle + var raster Raster + if peeked[0] == RasterAttribute { + var read int + n := 16 + for { + peeked, err = rd.Peek(n) // random number, just need to read a few bytes + if err != nil { + return nil, err + } + + raster, read = DecodeRaster(peeked) + if read == 0 { + return nil, ErrInvalidRaster + } + if read >= n { + // We need to read more bytes to get the full raster + n *= 2 + continue + } + + rd.Discard(read) //nolint:errcheck + break + } + + bounds = image.Rect(0, 0, raster.Ph, raster.Pv) + } + + if bounds.Max.X == 0 || bounds.Max.Y == 0 { + // We're parsing the image with no pixel metrics so unread the byte for the + // main read loop + // Peek the whole buffer to get the size of the image before we start + // decoding it. + var data []byte + toPeak := 64 // arbitrary number of bytes to peak + for { + data, err = rd.Peek(toPeak) + if err != nil || len(data) < toPeak { + break + } + toPeak *= 2 + } + + width, height := d.scanSize(data) + bounds = image.Rect(0, 0, width, height) + } + + img := image.NewRGBA(bounds) + palette := buildDefaultDecodePalette() + var currentX, currentBandY, currentPaletteIndex int + + // data buffer used to decode Sixel commands + data := make([]byte, 0, 6) // arbitrary number of bytes to read + // i := 0 // keeps track of the data buffer index + for { + b, err := rd.ReadByte() + if err != nil { + return img, d.readError(err) + } + + count := 1 // default count for Sixel commands + switch { + case b == LineBreak: // LF + currentBandY++ + currentX = 0 + case b == CarriageReturn: // CR + currentX = 0 + case b == ColorIntroducer: // # + data = data[:0] + data = append(data, b) + for { + b, err = rd.ReadByte() + if err != nil { + return img, d.readError(err) + } + // Read bytes until we hit a non-color byte i.e. non-numeric + // and non-; + if (b < '0' || b > '9') && b != ';' { + rd.UnreadByte() //nolint:errcheck + break + } + + data = append(data, b) + } + + // Palette operation + c, n := DecodeColor(data) + if n == 0 { + return img, ErrInvalidColor + } + + currentPaletteIndex = c.Pc + if c.Pu > 0 { + // Non-zero Pu means we have a color definition to set. + palette[currentPaletteIndex] = c + } + + case b == RepeatIntroducer: // ! + data = data[:0] + data = append(data, b) + for { + b, err = rd.ReadByte() + if err != nil { + return img, d.readError(err) + } + // Read bytes until we hit a non-numeric and non-repeat byte. + if (b < '0' || b > '9') && (b < '?' || b > '~') { + rd.UnreadByte() //nolint:errcheck + break + } + + data = append(data, b) + } + + // RLE operation + r, n := DecodeRepeat(data) + if n == 0 { + return img, ErrInvalidRepeat + } + + count = r.Count + b = r.Char + fallthrough + case b >= '?' && b <= '~': + color := palette[currentPaletteIndex] + for i := 0; i < count; i++ { + d.writePixel(currentX, currentBandY, b, color, img) + currentX++ + } + } + } +} + +// writePixel will accept a sixel byte (from ? to ~) that defines 6 vertical pixels +// and write any filled pixels to the image +func (d *Decoder) writePixel(x int, bandY int, sixel byte, color color.Color, img *image.RGBA) { + maskedSixel := (sixel - '?') & 63 + yOffset := 0 + for maskedSixel != 0 { + if maskedSixel&1 != 0 { + img.Set(x, bandY*6+yOffset, color) + } + + yOffset++ + maskedSixel >>= 1 + } +} + +// scanSize is only used for legacy sixel images that do not define pixel metrics +// near the header (technically permitted). In this case, we need to quickly scan +// the image to figure out what the height and width are. Different terminals +// treat unfilled pixels around the border of the image diffently, but in our case +// we will treat all pixels, even empty ones, as part of the image. However, +// we will allow the image to end with an LF code without increasing the size +// of the image. +// +// In the interest of speed, this method doesn't really parse the image in any +// meaningful way: pixel codes (? to ~), and the RLE, CR, and LF indicators +// (!, $, -) cannot appear within a sixel image except as themselves, so we +// just ignore everything else. The only thing we actually take the time to parse +// is the number after the RLE indicator to know how much width to add to the current +// line. +func (d *Decoder) scanSize(data []byte) (int, int) { + var maxWidth, bandCount int + + // Pixel values are ? to ~. Each one of these encountered increases the max width. + // a - is a LF and increases the max band count by one. a $ is a CR and resets + // current width. (char - '?') will get a 6-bit number and the highest bit is + // the lowest y value, which we should use to increment maxBandPixels. + // + // a ! is a RLE indicator, and we should add the numeral to the current width + var currentWidth int + newBand := true + for i := 0; i < len(data); i++ { + b := data[i] + switch { + case b == LineBreak: + // LF + currentWidth = 0 + // The image may end with an LF, so we shouldn't increment the band + // count until we encounter a pixel + newBand = true + case b == CarriageReturn: + // CR + currentWidth = 0 + case b == RepeatIntroducer || (b <= '~' && b >= '?'): + count := 1 + if b == RepeatIntroducer { + // Get the run length for the RLE operation + r, n := DecodeRepeat(data[i:]) + if n == 0 { + return maxWidth, bandCount * 6 + } + + // 1 is added in the loop + i += n - 1 + count = r.Count + } + + currentWidth += count + if newBand { + newBand = false + bandCount++ + } + + maxWidth = max(maxWidth, currentWidth) + } + } + + return maxWidth, bandCount * 6 +} + +// readError will take any error returned from a read method (ReadByte, +// FScanF, etc.) and either wrap or ignore the error. An encountered EOF +// indicates that it's time to return the completed image so we just +// return it. +func (d *Decoder) readError(err error) error { + if errors.Is(err, io.EOF) { + return nil + } + + return fmt.Errorf("failed to read sixel data: %w", err) +} diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index 61d1cd56..e69ee36e 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -1,279 +1,279 @@ -package sixel - -import ( - "bytes" - "fmt" - "image" - "image/color" - "image/draw" - "io" - "strconv" - - "github.com/aymanbagabas/quant/median" - "github.com/bits-and-blooms/bitset" -) - -// Sixels are a protocol for writing images to the terminal by writing a large blob of ANSI-escaped data. -// They function by encoding columns of 6 pixels into a single character (in much the same way base64 -// encodes data 6 bits at a time). Sixel images are paletted, with a palette established at the beginning -// of the image blob and pixels identifying palette entires by index while writing the pixel data. -// -// Sixels are written one 6-pixel-tall band at a time, one color at a time. For each band, a single -// color's pixels are written, then a carriage return is written to bring the "cursor" back to the -// beginning of a band where a new color is selected and pixels written. This continues until the entire -// band has been drawn, at which time a line break is written to begin the next band. - -// Sixel control functions. -const ( - LineBreak byte = '-' - CarriageReturn byte = '$' - RepeatIntroducer byte = '!' - ColorIntroducer byte = '#' - RasterAttribute byte = '"' - - // MaxColors is the maximum number of colors that can be used in a Sixel - // image. - MaxColors = 256 -) - -// Encoder is a Sixel encoder. It encodes an image to Sixel data format. -type Encoder struct { - // NumColors is the number of colors to use in the palette. It ranges from - // 1 to 256. Zero or less means to use the default value of 256. - NumColors int - - // Quantizer is the color quantizer to use. The default is median cut. - Quantizer draw.Quantizer - - // AddTransparent is a flag that indicates whether to add a transparent - // color to the palette. The default is false. - AddTransparent bool - - // TransparentColor is the color to use for the transparent color in the - // palette. If nil, [color.Transparent] will be used. - // This field is ignored if [Encoder.AddTransparent] is false. - TransparentColor color.Color - - // Ditherer is the ditherer to use. A nil value means no dithering. - // A dither example is [draw.FloydSteinberg]. - Ditherer draw.Drawer -} - -// Encode will accept an Image and write sixel data to a Writer. The sixel data -// will be everything after the 'q' that ends the DCS parameters and before the ST -// that ends the sequence. That means it includes the pixel metrics and color -// palette. -func (e *Encoder) Encode(w io.Writer, img image.Image) error { - if img == nil { - return nil - } - - nc := e.NumColors - if nc <= 0 || nc > MaxColors { - nc = MaxColors - } - - var paletted *image.Paletted - if p, ok := img.(*image.Paletted); ok && len(p.Palette) < nc { - paletted = p - } else { - // make adaptive palette using median cut alogrithm - q := e.Quantizer - if q == nil { - q = median.Quantizer(nc) - } - - // Make sure we have a transparent color in the palette. - palette := color.Palette(make([]color.Color, 0, nc)) // preallocate one space for transparency - if e.AddTransparent { - c := e.TransparentColor - if c == nil { - c = color.Transparent - } - palette = append(palette, c) - } - palette = q.Quantize(palette, img) // quantizer.Quantize will only use the remaining space (255 colors) - paletted = image.NewPaletted(img.Bounds(), palette) - - if e.Ditherer != nil { - e.Ditherer.Draw(paletted, img.Bounds(), img, image.Point{}) - } else { - draw.Draw(paletted, img.Bounds(), img, image.Point{}, draw.Over) - } - } - - imageBounds := img.Bounds() - imageWidth := imageBounds.Dx() - imageHeight := imageBounds.Dy() - - // Set the default raster 1:1 aspect ratio if it's not set - if _, err := WriteRaster(w, 1, 1, imageWidth, imageHeight); err != nil { - return fmt.Errorf("error encoding raster: %w", err) - } - - // Write palette colors - for i, c := range paletted.Palette { - c := FromColor(c) - // Always use RGB format "2" - if _, err := WriteColor(w, i, c.Pu, c.Px, c.Py, c.Pz); err != nil { - return fmt.Errorf("error encoding color: %w", err) - } - } - - var pixelBands bitset.BitSet - bandHeight := bandHeight(img) - - // Write pixel data to bitset. - for y := 0; y < imageHeight; y++ { - for x := 0; x < imageWidth; x++ { - index := paletted.ColorIndexAt(x, y) - setColor(&pixelBands, x, y, imageWidth, bandHeight, int(index)) - } - } - - return newEncoder(w, &pixelBands).writePixelData(img, paletted.Palette) -} - -// setColor will write a single pixel to the bitset data to be used by -// [encoder.writePixelData]. -func setColor(bands *bitset.BitSet, x int, y int, imageWidth int, bandHeight int, paletteIndex int) { - bandY := y / 6 - bit := bandHeight*imageWidth*6*paletteIndex + bandY*imageWidth*6 + (x * 6) + (y % 6) - bands.Set(uint(bit)) //nolint:gosec -} - -func bandHeight(img image.Image) int { - imageHeight := img.Bounds().Dy() - bandHeight := imageHeight / 6 - if imageHeight%6 != 0 { - bandHeight++ - } - return bandHeight -} - -// encoder is the internal encoder used to write sixel pixel data to a writer. -type encoder struct { - w io.Writer - - bands *bitset.BitSet - - repeatCount int - repeatChar byte -} - -func newEncoder(w io.Writer, bands *bitset.BitSet) *encoder { - return &encoder{ - w: w, - bands: bands, - } -} - -// writePixelData will write the image pixel data to the writer. -func (s *encoder) writePixelData(img image.Image, palette color.Palette) error { - imageWidth := img.Bounds().Dx() - bandHeight := bandHeight(img) - for bandY := 0; bandY < bandHeight; bandY++ { - if bandY > 0 { - s.writeControlRune(LineBreak) - } - - hasWrittenAColor := false - - for paletteIndex := 0; paletteIndex < len(palette); paletteIndex++ { - c := palette[paletteIndex] - _, _, _, a := c.RGBA() - if a == 0 { - // Don't draw anything for purely transparent pixels - continue - } - - firstColorBit := uint(bandHeight*imageWidth*6*paletteIndex + bandY*imageWidth*6) //nolint:gosec - nextColorBit := firstColorBit + uint(imageWidth*6) //nolint:gosec - - firstSetBitInBand, anySet := s.bands.NextSet(firstColorBit) - if !anySet || firstSetBitInBand >= nextColorBit { - // Color not appearing in this row - continue - } - - if hasWrittenAColor { - s.writeControlRune(CarriageReturn) - } - hasWrittenAColor = true - - s.writeControlRune(ColorIntroducer) - io.WriteString(s.w, strconv.Itoa(paletteIndex)) //nolint:errcheck - - for x := 0; x < imageWidth; x += 4 { - bit := firstColorBit + uint(x*6) //nolint:gosec - word := s.bands.GetWord64AtBit(bit) - - pixel1 := byte((word & 63) + '?') - pixel2 := byte(((word >> 6) & 63) + '?') - pixel3 := byte(((word >> 12) & 63) + '?') - pixel4 := byte(((word >> 18) & 63) + '?') - - s.writeImageRune(pixel1) - - if x+1 >= imageWidth { - continue - } - s.writeImageRune(pixel2) - - if x+2 >= imageWidth { - continue - } - s.writeImageRune(pixel3) - - if x+3 >= imageWidth { - continue - } - s.writeImageRune(pixel4) - } - } - } - - s.writeControlRune('-') - return nil -} - -// writeImageRune will write a single line of six pixels to pixel data. The data -// doesn't get written to the imageData, it gets buffered for the purposes of RLE -func (e *encoder) writeImageRune(r byte) { //nolint:revive - if r == e.repeatChar { - e.repeatCount++ - return - } - - e.flushRepeats() - e.repeatChar = r - e.repeatCount = 1 -} - -// writeControlRune will write a special rune such as a new line or carriage return -// rune. It will call flushRepeats first, if necessary. -func (e *encoder) writeControlRune(r byte) { - if e.repeatCount > 0 { - e.flushRepeats() - e.repeatCount = 0 - e.repeatChar = 0 - } - - e.w.Write([]byte{r}) //nolint:errcheck -} - -// flushRepeats is used to actually write the current repeatByte to the imageData when -// it is about to change. This buffering is used to manage RLE in the sixelBuilder -func (e *encoder) flushRepeats() { - if e.repeatCount == 0 { - return - } - - // Only write using the RLE form if it's actually providing space savings - if e.repeatCount > 3 { - WriteRepeat(e.w, e.repeatCount, e.repeatChar) //nolint:errcheck - return - } - - e.w.Write(bytes.Repeat([]byte{e.repeatChar}, e.repeatCount)) //nolint:errcheck -} +package sixel + +import ( + "bytes" + "fmt" + "image" + "image/color" + "image/draw" + "io" + "strconv" + + "github.com/aymanbagabas/quant/median" + "github.com/bits-and-blooms/bitset" +) + +// Sixels are a protocol for writing images to the terminal by writing a large blob of ANSI-escaped data. +// They function by encoding columns of 6 pixels into a single character (in much the same way base64 +// encodes data 6 bits at a time). Sixel images are paletted, with a palette established at the beginning +// of the image blob and pixels identifying palette entires by index while writing the pixel data. +// +// Sixels are written one 6-pixel-tall band at a time, one color at a time. For each band, a single +// color's pixels are written, then a carriage return is written to bring the "cursor" back to the +// beginning of a band where a new color is selected and pixels written. This continues until the entire +// band has been drawn, at which time a line break is written to begin the next band. + +// Sixel control functions. +const ( + LineBreak byte = '-' + CarriageReturn byte = '$' + RepeatIntroducer byte = '!' + ColorIntroducer byte = '#' + RasterAttribute byte = '"' + + // MaxColors is the maximum number of colors that can be used in a Sixel + // image. + MaxColors = 256 +) + +// Encoder is a Sixel encoder. It encodes an image to Sixel data format. +type Encoder struct { + // NumColors is the number of colors to use in the palette. It ranges from + // 1 to 256. Zero or less means to use the default value of 256. + NumColors int + + // Quantizer is the color quantizer to use. The default is median cut. + Quantizer draw.Quantizer + + // AddTransparent is a flag that indicates whether to add a transparent + // color to the palette. The default is false. + AddTransparent bool + + // TransparentColor is the color to use for the transparent color in the + // palette. If nil, [color.Transparent] will be used. + // This field is ignored if [Encoder.AddTransparent] is false. + TransparentColor color.Color + + // Ditherer is the ditherer to use. A nil value means no dithering. + // A dither example is [draw.FloydSteinberg]. + Ditherer draw.Drawer +} + +// Encode will accept an Image and write sixel data to a Writer. The sixel data +// will be everything after the 'q' that ends the DCS parameters and before the ST +// that ends the sequence. That means it includes the pixel metrics and color +// palette. +func (e *Encoder) Encode(w io.Writer, img image.Image) error { + if img == nil { + return nil + } + + nc := e.NumColors + if nc <= 0 || nc > MaxColors { + nc = MaxColors + } + + var paletted *image.Paletted + if p, ok := img.(*image.Paletted); ok && len(p.Palette) < nc { + paletted = p + } else { + // make adaptive palette using median cut alogrithm + q := e.Quantizer + if q == nil { + q = median.Quantizer(nc) + } + + // Make sure we have a transparent color in the palette. + palette := color.Palette(make([]color.Color, 0, nc)) // preallocate one space for transparency + if !e.AddTransparent { + c := e.TransparentColor + if c == nil { + c = color.Transparent + } + palette = append(palette, c) + } + palette = q.Quantize(palette, img) // quantizer.Quantize will only use the remaining space (255 colors) + paletted = image.NewPaletted(img.Bounds(), palette) + + if e.Ditherer != nil { + e.Ditherer.Draw(paletted, img.Bounds(), img, image.Point{}) + } else { + draw.Draw(paletted, img.Bounds(), img, image.Point{}, draw.Over) + } + } + + imageBounds := img.Bounds() + imageWidth := imageBounds.Dx() + imageHeight := imageBounds.Dy() + + // Set the default raster 1:1 aspect ratio if it's not set + if _, err := WriteRaster(w, 1, 1, imageWidth, imageHeight); err != nil { + return fmt.Errorf("error encoding raster: %w", err) + } + + // Write palette colors + for i, c := range paletted.Palette { + c := FromColor(c) + // Always use RGB format "2" + if _, err := WriteColor(w, i, c.Pu, c.Px, c.Py, c.Pz); err != nil { + return fmt.Errorf("error encoding color: %w", err) + } + } + + var pixelBands bitset.BitSet + bandHeight := bandHeight(img) + + // Write pixel data to bitset. + for y := 0; y < imageHeight; y++ { + for x := 0; x < imageWidth; x++ { + index := paletted.ColorIndexAt(x, y) + setColor(&pixelBands, x, y, imageWidth, bandHeight, int(index)) + } + } + + return newEncoder(w, &pixelBands).writePixelData(img, paletted.Palette) +} + +// setColor will write a single pixel to the bitset data to be used by +// [encoder.writePixelData]. +func setColor(bands *bitset.BitSet, x int, y int, imageWidth int, bandHeight int, paletteIndex int) { + bandY := y / 6 + bit := bandHeight*imageWidth*6*paletteIndex + bandY*imageWidth*6 + (x * 6) + (y % 6) + bands.Set(uint(bit)) //nolint:gosec +} + +func bandHeight(img image.Image) int { + imageHeight := img.Bounds().Dy() + bandHeight := imageHeight / 6 + if imageHeight%6 != 0 { + bandHeight++ + } + return bandHeight +} + +// encoder is the internal encoder used to write sixel pixel data to a writer. +type encoder struct { + w io.Writer + + bands *bitset.BitSet + + repeatCount int + repeatChar byte +} + +func newEncoder(w io.Writer, bands *bitset.BitSet) *encoder { + return &encoder{ + w: w, + bands: bands, + } +} + +// writePixelData will write the image pixel data to the writer. +func (s *encoder) writePixelData(img image.Image, palette color.Palette) error { + imageWidth := img.Bounds().Dx() + bandHeight := bandHeight(img) + for bandY := 0; bandY < bandHeight; bandY++ { + if bandY > 0 { + s.writeControlRune(LineBreak) + } + + hasWrittenAColor := false + + for paletteIndex := 0; paletteIndex < len(palette); paletteIndex++ { + c := palette[paletteIndex] + _, _, _, a := c.RGBA() + if a == 0 { + // Don't draw anything for purely transparent pixels + continue + } + + firstColorBit := uint(bandHeight*imageWidth*6*paletteIndex + bandY*imageWidth*6) //nolint:gosec + nextColorBit := firstColorBit + uint(imageWidth*6) //nolint:gosec + + firstSetBitInBand, anySet := s.bands.NextSet(firstColorBit) + if !anySet || firstSetBitInBand >= nextColorBit { + // Color not appearing in this row + continue + } + + if hasWrittenAColor { + s.writeControlRune(CarriageReturn) + } + hasWrittenAColor = true + + s.writeControlRune(ColorIntroducer) + io.WriteString(s.w, strconv.Itoa(paletteIndex)) //nolint:errcheck + + for x := 0; x < imageWidth; x += 4 { + bit := firstColorBit + uint(x*6) //nolint:gosec + word := s.bands.GetWord64AtBit(bit) + + pixel1 := byte((word & 63) + '?') + pixel2 := byte(((word >> 6) & 63) + '?') + pixel3 := byte(((word >> 12) & 63) + '?') + pixel4 := byte(((word >> 18) & 63) + '?') + + s.writeImageRune(pixel1) + + if x+1 >= imageWidth { + continue + } + s.writeImageRune(pixel2) + + if x+2 >= imageWidth { + continue + } + s.writeImageRune(pixel3) + + if x+3 >= imageWidth { + continue + } + s.writeImageRune(pixel4) + } + } + } + + s.writeControlRune('-') + return nil +} + +// writeImageRune will write a single line of six pixels to pixel data. The data +// doesn't get written to the imageData, it gets buffered for the purposes of RLE +func (e *encoder) writeImageRune(r byte) { //nolint:revive + if r == e.repeatChar { + e.repeatCount++ + return + } + + e.flushRepeats() + e.repeatChar = r + e.repeatCount = 1 +} + +// writeControlRune will write a special rune such as a new line or carriage return +// rune. It will call flushRepeats first, if necessary. +func (e *encoder) writeControlRune(r byte) { + if e.repeatCount > 0 { + e.flushRepeats() + e.repeatCount = 0 + e.repeatChar = 0 + } + + e.w.Write([]byte{r}) //nolint:errcheck +} + +// flushRepeats is used to actually write the current repeatByte to the imageData when +// it is about to change. This buffering is used to manage RLE in the sixelBuilder +func (e *encoder) flushRepeats() { + if e.repeatCount == 0 { + return + } + + // Only write using the RLE form if it's actually providing space savings + if e.repeatCount > 3 { + WriteRepeat(e.w, e.repeatCount, e.repeatChar) //nolint:errcheck + return + } + + e.w.Write(bytes.Repeat([]byte{e.repeatChar}, e.repeatCount)) //nolint:errcheck +} diff --git a/ansi/sixel/sixel_test.go b/ansi/sixel/sixel_test.go index 5aff710f..466be09b 100644 --- a/ansi/sixel/sixel_test.go +++ b/ansi/sixel/sixel_test.go @@ -1,207 +1,207 @@ -package sixel - -import ( - "bytes" - "image" - "image/color" - "testing" -) - -func TestScanSize(t *testing.T) { - testCases := map[string]struct { - data string - expectedWidth int - expectedHeight int - }{ - "two lines": { - "~~~~~~-~~~~~~-", 6, 12, - }, - "two lines no newline at end": { - "~~~~~~-~~~~~~", 6, 12, - }, - "no pixels": { - "", 0, 0, - }, - "smaller carriage returns": { - "~$~~$~~~$~~~~$~~~~~$~~~~~~", 6, 6, - }, - "transparent": { - "??????", 6, 6, - }, - "RLE": { - "??!20?", 22, 6, - }, - "Colors": { - "#0;2;0;0;0~~~~~$#1;2;100;100;100;~~~~~~-#0~~~~~~-#1~~~~~~", 6, 18, - }, - } - - for testName, testCase := range testCases { - t.Run(testName, func(t *testing.T) { - decoder := &Decoder{} - width, height := decoder.scanSize([]byte(testCase.data)) - if width != testCase.expectedWidth { - t.Errorf("expected width of %d, but received width of %d", testCase.expectedWidth, width) - return - } - - if height != testCase.expectedHeight { - t.Errorf("expected height of %d, but received height of %d", testCase.expectedHeight, height) - return - } - }) - } -} - -func TestFullImage(t *testing.T) { - testCases := map[string]struct { - imageWidth int - imageHeight int - bandCount int - // When filling the image, we'll use a map of indices to colors and change colors every - // time the current index is in the map- this will prevent dozens of lines with the same color - // in a row and make this slightly more legible - colors map[int]color.RGBA - }{ - "3x12 single color filled": { - 3, 12, 2, - map[int]color.RGBA{ - 0: {255, 0, 0, 255}, - }, - }, - "3x12 two color filled": { - 3, 12, 2, - map[int]color.RGBA{ - // 3-pixel high alternating bands - 0: {0, 0, 255, 255}, - 9: {0, 255, 0, 255}, - 18: {0, 0, 255, 255}, - 27: {0, 255, 0, 255}, - }, - }, - "3x12 8 color with right gutter": { - 3, 12, 2, - map[int]color.RGBA{ - 0: {255, 0, 0, 255}, - 2: {0, 255, 0, 255}, - 3: {255, 0, 0, 255}, - 5: {0, 255, 0, 255}, - 6: {255, 0, 0, 255}, - 8: {0, 255, 0, 255}, - 9: {0, 0, 255, 255}, - 11: {128, 128, 0, 255}, - 12: {0, 0, 255, 255}, - 14: {128, 128, 0, 255}, - 15: {0, 0, 255, 255}, - 17: {128, 128, 0, 255}, - 18: {0, 128, 128, 255}, - 20: {128, 0, 128, 255}, - 21: {0, 128, 128, 255}, - 23: {128, 0, 128, 255}, - 24: {0, 128, 128, 255}, - 26: {128, 0, 128, 255}, - 27: {64, 0, 0, 255}, - 29: {0, 64, 0, 255}, - 30: {64, 0, 0, 255}, - 32: {0, 64, 0, 255}, - 33: {64, 0, 0, 255}, - 35: {0, 64, 0, 255}, - }, - }, - "3x12 single color with transparent band in the middle": { - 3, 12, 2, - map[int]color.RGBA{ - 0: {255, 0, 0, 255}, - 15: {0, 0, 0, 0}, - 21: {255, 0, 0, 255}, - }, - }, - "3x5 single color": { - 3, 5, 1, - map[int]color.RGBA{ - 0: {255, 0, 0, 255}, - }, - }, - "12x4 single color use RLE": { - 12, 4, 1, - map[int]color.RGBA{ - 0: {255, 0, 0, 255}, - }, - }, - "12x1 two color use RLE": { - 12, 1, 1, - map[int]color.RGBA{ - 0: {255, 0, 0, 255}, - 6: {0, 255, 0, 255}, - }, - }, - "12x12 single color use RLE": { - 12, 12, 2, - map[int]color.RGBA{ - 0: {255, 0, 0, 255}, - }, - }, - } - - for testName, testCase := range testCases { - t.Run(testName, func(t *testing.T) { - img := image.NewRGBA(image.Rect(0, 0, testCase.imageWidth, testCase.imageHeight)) - - currentColor := color.RGBA{0, 0, 0, 0} - for y := 0; y < testCase.imageHeight; y++ { - for x := 0; x < testCase.imageWidth; x++ { - index := y*testCase.imageWidth + x - newColor, changingColor := testCase.colors[index] - if changingColor { - currentColor = newColor - } - - img.Set(x, y, currentColor) - } - } - - buffer := bytes.NewBuffer(nil) - encoder := Encoder{} - decoder := Decoder{} - - err := encoder.Encode(buffer, img) - if err != nil { - t.Errorf("Unexpected error: %+v", err) - return - } - - compareImg, err := decoder.Decode(buffer) - if err != nil { - t.Errorf("Unexpected error: %+v", err) - return - } - - expectedWidth := img.Bounds().Dx() - expectedHeight := img.Bounds().Dy() - actualWidth := compareImg.Bounds().Dx() - actualHeight := compareImg.Bounds().Dy() - - if actualHeight != expectedHeight { - t.Errorf("SixelImage had a height of %d, but a height of %d was expected", actualHeight, expectedHeight) - return - } - if actualWidth != expectedWidth { - t.Errorf("SixelImage had a width of %d, but a width of %d was expected", actualWidth, expectedWidth) - return - } - - for y := 0; y < expectedHeight; y++ { - for x := 0; x < expectedWidth; x++ { - r, g, b, a := compareImg.At(x, y).RGBA() - expectedR, expectedG, expectedB, expectedA := img.At(x, y).RGBA() - - if r != expectedR || g != expectedG || b != expectedB || a != expectedA { - t.Errorf("SixelImage had color (%d,%d,%d,%d) at coordinates (%d,%d), but color (%d,%d,%d,%d) was expected", - r, g, b, a, x, y, expectedR, expectedG, expectedB, expectedA) - return - } - } - } - }) - } -} +package sixel + +import ( + "bytes" + "image" + "image/color" + "testing" +) + +func TestScanSize(t *testing.T) { + testCases := map[string]struct { + data string + expectedWidth int + expectedHeight int + }{ + "two lines": { + "~~~~~~-~~~~~~-", 6, 12, + }, + "two lines no newline at end": { + "~~~~~~-~~~~~~", 6, 12, + }, + "no pixels": { + "", 0, 0, + }, + "smaller carriage returns": { + "~$~~$~~~$~~~~$~~~~~$~~~~~~", 6, 6, + }, + "transparent": { + "??????", 6, 6, + }, + "RLE": { + "??!20?", 22, 6, + }, + "Colors": { + "#0;2;0;0;0~~~~~$#1;2;100;100;100;~~~~~~-#0~~~~~~-#1~~~~~~", 6, 18, + }, + } + + for testName, testCase := range testCases { + t.Run(testName, func(t *testing.T) { + decoder := &Decoder{} + width, height := decoder.scanSize([]byte(testCase.data)) + if width != testCase.expectedWidth { + t.Errorf("expected width of %d, but received width of %d", testCase.expectedWidth, width) + return + } + + if height != testCase.expectedHeight { + t.Errorf("expected height of %d, but received height of %d", testCase.expectedHeight, height) + return + } + }) + } +} + +func TestFullImage(t *testing.T) { + testCases := map[string]struct { + imageWidth int + imageHeight int + bandCount int + // When filling the image, we'll use a map of indices to colors and change colors every + // time the current index is in the map- this will prevent dozens of lines with the same color + // in a row and make this slightly more legible + colors map[int]color.RGBA + }{ + "3x12 single color filled": { + 3, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + "3x12 two color filled": { + 3, 12, 2, + map[int]color.RGBA{ + // 3-pixel high alternating bands + 0: {0, 0, 255, 255}, + 9: {0, 255, 0, 255}, + 18: {0, 0, 255, 255}, + 27: {0, 255, 0, 255}, + }, + }, + "3x12 8 color with right gutter": { + 3, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + 2: {0, 255, 0, 255}, + 3: {255, 0, 0, 255}, + 5: {0, 255, 0, 255}, + 6: {255, 0, 0, 255}, + 8: {0, 255, 0, 255}, + 9: {0, 0, 255, 255}, + 11: {128, 128, 0, 255}, + 12: {0, 0, 255, 255}, + 14: {128, 128, 0, 255}, + 15: {0, 0, 255, 255}, + 17: {128, 128, 0, 255}, + 18: {0, 128, 128, 255}, + 20: {128, 0, 128, 255}, + 21: {0, 128, 128, 255}, + 23: {128, 0, 128, 255}, + 24: {0, 128, 128, 255}, + 26: {128, 0, 128, 255}, + 27: {64, 0, 0, 255}, + 29: {0, 64, 0, 255}, + 30: {64, 0, 0, 255}, + 32: {0, 64, 0, 255}, + 33: {64, 0, 0, 255}, + 35: {0, 64, 0, 255}, + }, + }, + "3x12 single color with transparent band in the middle": { + 3, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + 15: {0, 0, 0, 0}, + 21: {255, 0, 0, 255}, + }, + }, + "3x5 single color": { + 3, 5, 1, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + "12x4 single color use RLE": { + 12, 4, 1, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + "12x1 two color use RLE": { + 12, 1, 1, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + 6: {0, 255, 0, 255}, + }, + }, + "12x12 single color use RLE": { + 12, 12, 2, + map[int]color.RGBA{ + 0: {255, 0, 0, 255}, + }, + }, + } + + for testName, testCase := range testCases { + t.Run(testName, func(t *testing.T) { + img := image.NewRGBA(image.Rect(0, 0, testCase.imageWidth, testCase.imageHeight)) + + currentColor := color.RGBA{0, 0, 0, 0} + for y := 0; y < testCase.imageHeight; y++ { + for x := 0; x < testCase.imageWidth; x++ { + index := y*testCase.imageWidth + x + newColor, changingColor := testCase.colors[index] + if changingColor { + currentColor = newColor + } + + img.Set(x, y, currentColor) + } + } + + buffer := bytes.NewBuffer(nil) + encoder := Encoder{} + decoder := Decoder{} + + err := encoder.Encode(buffer, img) + if err != nil { + t.Errorf("Unexpected error: %+v", err) + return + } + + compareImg, err := decoder.Decode(buffer) + if err != nil { + t.Errorf("Unexpected error: %+v", err) + return + } + + expectedWidth := img.Bounds().Dx() + expectedHeight := img.Bounds().Dy() + actualWidth := compareImg.Bounds().Dx() + actualHeight := compareImg.Bounds().Dy() + + if actualHeight != expectedHeight { + t.Errorf("SixelImage had a height of %d, but a height of %d was expected", actualHeight, expectedHeight) + return + } + if actualWidth != expectedWidth { + t.Errorf("SixelImage had a width of %d, but a width of %d was expected", actualWidth, expectedWidth) + return + } + + for y := 0; y < expectedHeight; y++ { + for x := 0; x < expectedWidth; x++ { + r, g, b, a := compareImg.At(x, y).RGBA() + expectedR, expectedG, expectedB, expectedA := img.At(x, y).RGBA() + + if r != expectedR || g != expectedG || b != expectedB || a != expectedA { + t.Errorf("SixelImage had color (%d,%d,%d,%d) at coordinates (%d,%d), but color (%d,%d,%d,%d) was expected", + r, g, b, a, x, y, expectedR, expectedG, expectedB, expectedA) + return + } + } + } + }) + } +} From db2c57962556950d43ea82a2e1fd2f71ab6c7fcd Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 18:51:35 -0500 Subject: [PATCH 32/36] fix(ansi): sixel: rename AddTransparent to NoTransparency Should be enabled by default and name should reflect that. --- ansi/sixel/encoder.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index e69ee36e..c961fac1 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -45,9 +45,9 @@ type Encoder struct { // Quantizer is the color quantizer to use. The default is median cut. Quantizer draw.Quantizer - // AddTransparent is a flag that indicates whether to add a transparent - // color to the palette. The default is false. - AddTransparent bool + // NoTransparency is a flag that indicates whether to not add a transparent + // color to the palette. + NoTransparency bool // TransparentColor is the color to use for the transparent color in the // palette. If nil, [color.Transparent] will be used. @@ -85,7 +85,7 @@ func (e *Encoder) Encode(w io.Writer, img image.Image) error { // Make sure we have a transparent color in the palette. palette := color.Palette(make([]color.Color, 0, nc)) // preallocate one space for transparency - if !e.AddTransparent { + if !e.NoTransparency { c := e.TransparentColor if c == nil { c = color.Transparent From d226daaccb7e053318605a086fc6f51a787be38b Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 19:02:29 -0500 Subject: [PATCH 33/36] chore(ansi): sixel: remove unused and expose default color palette --- ansi/sixel/color.go | 22 +- ansi/sixel/decoder.go | 545 +++++++++++++++++++++--------------------- 2 files changed, 275 insertions(+), 292 deletions(-) diff --git a/ansi/sixel/color.go b/ansi/sixel/color.go index d9a1bf13..8e3c03db 100644 --- a/ansi/sixel/color.go +++ b/ansi/sixel/color.go @@ -117,30 +117,10 @@ func (c Color) RGBA() (r, g, b, a uint32) { case 2: return sixelRGB(c.Px, c.Py, c.Pz).RGBA() default: - return colors[c.Pc].RGBA() + return colorPalette[c.Pc].RGBA() } } -var colors = map[int]color.Color{ - // 16 predefined color registers of VT340 - 0: sixelRGB(0, 0, 0), - 1: sixelRGB(20, 20, 80), - 2: sixelRGB(80, 13, 13), - 3: sixelRGB(20, 80, 20), - 4: sixelRGB(80, 20, 80), - 5: sixelRGB(20, 80, 80), - 6: sixelRGB(80, 80, 20), - 7: sixelRGB(53, 53, 53), - 8: sixelRGB(26, 26, 26), - 9: sixelRGB(33, 33, 60), - 10: sixelRGB(60, 26, 26), - 11: sixelRGB(33, 60, 33), - 12: sixelRGB(60, 33, 60), - 13: sixelRGB(33, 60, 60), - 14: sixelRGB(60, 60, 33), - 15: sixelRGB(80, 80, 80), -} - // #define PALVAL(n,a,m) (((n) * (a) + ((m) / 2)) / (m)) func palval(n, a, m int) int { return (n*a + m/2) / m diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index 738cb349..b9494b3d 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -9,276 +9,6 @@ import ( "io" ) -// buildDefaultDecodePalette will build a map that we'll use as the palette during -// the decoding process- it's pre-loaded with the default colors for sixels, in case -// we are decoding a legacy sixel image that doesn't define its own colors (technically -// permitted). -func buildDefaultDecodePalette() map[int]color.Color { - // Undefined colors in sixel images use a set of default colors: 0-15 - // are sixel-specific, 16-255 are the same as the xterm 256-color values - return map[int]color.Color{ - // Sixel-specific default colors - 0: color.RGBA{0, 0, 0, 255}, - 1: color.RGBA{51, 51, 204, 255}, - 2: color.RGBA{204, 36, 36, 255}, - 3: color.RGBA{51, 204, 51, 255}, - 4: color.RGBA{204, 51, 204, 255}, - 5: color.RGBA{51, 204, 204, 255}, - 6: color.RGBA{204, 204, 51, 255}, - 7: color.RGBA{120, 120, 120, 255}, - 8: color.RGBA{69, 69, 69, 255}, - 9: color.RGBA{87, 87, 153, 255}, - 10: color.RGBA{153, 69, 69, 255}, - 11: color.RGBA{87, 153, 87, 255}, - 12: color.RGBA{153, 87, 153, 255}, - 13: color.RGBA{87, 153, 153, 255}, - 14: color.RGBA{153, 153, 87, 255}, - 15: color.RGBA{204, 204, 204, 255}, - - // xterm colors - 16: color.RGBA{0, 0, 0, 255}, // Black1 - 17: color.RGBA{0, 0, 95, 255}, // DarkBlue2 - 18: color.RGBA{0, 0, 135, 255}, // DarkBlue1 - 19: color.RGBA{0, 0, 175, 255}, // DarkBlue - 20: color.RGBA{0, 0, 215, 255}, // Blue3 - 21: color.RGBA{0, 0, 255, 255}, // Blue2 - 22: color.RGBA{0, 95, 0, 255}, // DarkGreen4 - 23: color.RGBA{0, 95, 95, 255}, // DarkGreenBlue5 - 24: color.RGBA{0, 95, 135, 255}, // DarkGreenBlue4 - 25: color.RGBA{0, 95, 175, 255}, // DarkGreenBlue3 - 26: color.RGBA{0, 95, 215, 255}, // GreenBlue8 - 27: color.RGBA{0, 95, 255, 255}, // GreenBlue7 - 28: color.RGBA{0, 135, 0, 255}, // DarkGreen3 - 29: color.RGBA{0, 135, 95, 255}, // DarkGreen2 - 30: color.RGBA{0, 135, 0, 255}, // DarkGreenBlue2 - 31: color.RGBA{0, 135, 175, 255}, // DarkGreenBlue1 - 32: color.RGBA{0, 125, 215, 255}, // GreenBlue6 - 33: color.RGBA{0, 135, 255, 255}, // GreenBlue5 - 34: color.RGBA{0, 175, 0, 255}, // DarkGreen1 - 35: color.RGBA{0, 175, 95, 255}, // DarkGreen - 36: color.RGBA{0, 175, 135, 255}, // DarkBlueGreen - 37: color.RGBA{0, 175, 175, 255}, // DarkGreenBlue - 38: color.RGBA{0, 175, 215, 255}, // GreenBlue4 - 39: color.RGBA{0, 175, 255, 255}, // GreenBlue3 - 40: color.RGBA{0, 215, 0, 255}, // Green7 - 41: color.RGBA{0, 215, 95, 255}, // Green6 - 42: color.RGBA{0, 215, 135, 255}, // Green5 - 43: color.RGBA{0, 215, 175, 255}, // BlueGreen1 - 44: color.RGBA{0, 215, 215, 255}, // GreenBlue2 - 45: color.RGBA{0, 215, 255, 255}, // GreenBlue1 - 46: color.RGBA{0, 255, 0, 255}, // Green4 - 47: color.RGBA{0, 255, 95, 255}, // Green3 - 48: color.RGBA{0, 255, 135, 255}, // Green2 - 49: color.RGBA{0, 255, 175, 255}, // Green1 - 50: color.RGBA{0, 255, 215, 255}, // BlueGreen - 51: color.RGBA{0, 255, 255, 255}, // GreenBlue - 52: color.RGBA{95, 0, 0, 255}, // DarkRed2 - 53: color.RGBA{95, 0, 95, 255}, // DarkPurple4 - 54: color.RGBA{95, 0, 135, 255}, // DarkBluePurple2 - 55: color.RGBA{95, 0, 175, 255}, // DarkBluePurple1 - 56: color.RGBA{95, 0, 215, 255}, // PurpleBlue - 57: color.RGBA{95, 0, 255, 255}, // Blue1 - 58: color.RGBA{95, 95, 0, 255}, // DarkYellow4 - 59: color.RGBA{95, 95, 95, 255}, // Gray3 - 60: color.RGBA{95, 95, 135, 255}, // PlueBlue8 - 61: color.RGBA{95, 95, 175, 255}, // PaleBlue7 - 62: color.RGBA{95, 95, 215, 255}, // PaleBlue6 - 63: color.RGBA{95, 95, 255, 255}, // PaleBlue5 - 64: color.RGBA{95, 135, 0, 255}, // DarkYellow3 - 65: color.RGBA{95, 135, 95, 255}, // PaleGreen12 - 66: color.RGBA{95, 135, 135, 255}, // PaleGreen11 - 67: color.RGBA{95, 135, 175, 255}, // PaleGreenBlue10 - 68: color.RGBA{95, 135, 215, 255}, // PaleGreenBlue9 - 69: color.RGBA{95, 135, 255, 255}, // PaleBlue4 - 70: color.RGBA{95, 175, 0, 255}, // DarkGreenYellow - 71: color.RGBA{95, 175, 95, 255}, // PaleGreen11 - 72: color.RGBA{95, 175, 135, 255}, // PaleGreen10 - 73: color.RGBA{95, 175, 175, 255}, // PaleGreenBlue8 - 74: color.RGBA{95, 175, 215, 255}, // PaleGreenBlue7 - 75: color.RGBA{95, 175, 255, 255}, // PaleGreenBlue6 - 76: color.RGBA{95, 215, 0, 255}, // YellowGreen1 - 77: color.RGBA{95, 215, 95, 255}, // PaleGreen9 - 78: color.RGBA{95, 215, 135, 255}, // PaleGreen8 - 79: color.RGBA{95, 215, 175, 255}, // PaleGreen7 - 80: color.RGBA{95, 215, 215, 255}, // PaleGreenBlue5 - 81: color.RGBA{95, 215, 255, 255}, // PaleGreenBlue4 - 82: color.RGBA{95, 255, 0, 255}, // YellowGreen - 83: color.RGBA{95, 255, 95, 255}, // PaleGreen6 - 84: color.RGBA{95, 255, 135, 255}, // PaleGreen5 - 85: color.RGBA{95, 255, 175, 255}, // PaleGreen4 - 86: color.RGBA{95, 255, 215, 255}, // PaleGreen3 - 87: color.RGBA{95, 255, 255, 255}, // PaleGreenBlue3 - 88: color.RGBA{135, 0, 0, 255}, // DarkRed1 - 89: color.RGBA{135, 0, 95, 255}, // DarkPurple3 - 90: color.RGBA{135, 0, 135, 255}, // DarkPurple2 - 91: color.RGBA{135, 0, 175, 255}, // DarkBluePurple - 92: color.RGBA{135, 0, 215, 255}, // BluePurple4 - 93: color.RGBA{135, 0, 255, 255}, // BluePurple3 - 94: color.RGBA{135, 95, 0, 255}, // DarkOrange1 - 95: color.RGBA{135, 95, 95, 255}, // PaleRed5 - 96: color.RGBA{135, 95, 135, 255}, // PalePurple7 - 97: color.RGBA{135, 95, 175, 255}, // PalePurpleBlue - 98: color.RGBA{135, 95, 215, 255}, // PaleBlue3 - 99: color.RGBA{135, 95, 255, 255}, // PaleBlue2 - 100: color.RGBA{135, 135, 0, 255}, // DarkYellow2 - 101: color.RGBA{135, 135, 95, 255}, // PaleYellow7 - 102: color.RGBA{135, 135, 135, 255}, // Gray2 - 103: color.RGBA{135, 135, 175, 255}, // PaleBlue1 - 104: color.RGBA{135, 135, 215, 255}, // PaleBlue - 105: color.RGBA{135, 135, 255, 255}, // LightPaleBlue4 - 106: color.RGBA{135, 175, 0, 255}, // DarkYellow1 - 107: color.RGBA{135, 175, 95, 255}, // PaleYellowGreen3 - 108: color.RGBA{135, 175, 135, 255}, // PaleGreen2 - 109: color.RGBA{135, 175, 175, 255}, // PaleGreenBlue2 - 110: color.RGBA{135, 175, 215, 255}, // PaleGreenBlue1 - 111: color.RGBA{135, 175, 255, 255}, // LightPaleGreenBlue6 - 112: color.RGBA{135, 215, 0, 255}, // Yellow6 - 113: color.RGBA{135, 215, 95, 255}, // PaleYellowGreen2 - 114: color.RGBA{135, 215, 135, 255}, // PaleGreen1 - 115: color.RGBA{135, 215, 175, 255}, // PaleGreen - 116: color.RGBA{135, 215, 215, 255}, // PaleGreenBlue - 117: color.RGBA{135, 215, 255, 255}, // LightPaleGreenBlue5 - 118: color.RGBA{135, 255, 0, 255}, // GreenYellow - 119: color.RGBA{135, 255, 95, 255}, // PaleYellowGreen1 - 120: color.RGBA{135, 255, 135, 255}, // LightPaleGreen6 - 121: color.RGBA{135, 255, 175, 255}, // LightPaleGreen5 - 122: color.RGBA{135, 255, 215, 255}, // LightPaleGreen4 - 123: color.RGBA{135, 255, 255, 255}, // LightPaleGreenBlue4 - 124: color.RGBA{175, 0, 0, 255}, // DarkRed - 125: color.RGBA{175, 0, 95, 255}, // DarkRedPurple - 126: color.RGBA{175, 0, 135, 255}, // DarkPurple1 - 127: color.RGBA{175, 0, 175, 255}, // DarkPurple - 128: color.RGBA{175, 0, 215, 255}, // BluePurple2 - 129: color.RGBA{175, 0, 255, 255}, // BluePurple1 - 130: color.RGBA{175, 95, 0, 255}, // DarkOrange - 131: color.RGBA{175, 95, 95, 255}, // PaleRed4 - 132: color.RGBA{175, 95, 135, 255}, // PalePurpleRed3 - 133: color.RGBA{175, 95, 175, 255}, // PalePurple6 - 134: color.RGBA{175, 95, 215, 255}, // PaleBluePurple3 - 135: color.RGBA{175, 95, 255, 255}, // PaleBluePurple2 - 136: color.RGBA{175, 135, 0, 255}, // DarkYellowOrange - 137: color.RGBA{175, 135, 95, 255}, // PaleRedOrange3 - 138: color.RGBA{175, 135, 135, 255}, // PaleRed3 - 139: color.RGBA{175, 135, 175, 255}, // PalePurple5 - 140: color.RGBA{175, 135, 215, 255}, // PaleBluePurple1 - 141: color.RGBA{175, 135, 255, 255}, // LightPaleBlue3 - 142: color.RGBA{175, 175, 0, 255}, // DarkYellow - 143: color.RGBA{175, 175, 95, 255}, // PaleYellow6 - 144: color.RGBA{175, 175, 135, 255}, // PaleYellow5 - 145: color.RGBA{175, 175, 175, 255}, // Gray1 - 146: color.RGBA{175, 175, 215, 255}, // LightPaleBlue2 - 147: color.RGBA{175, 175, 255, 255}, // LightPaleBlue1 - 148: color.RGBA{175, 215, 0, 255}, // Yellow5 - 149: color.RGBA{175, 215, 95, 255}, // PaleYellow4 - 150: color.RGBA{175, 215, 135, 255}, // PaleGreenYellow - 151: color.RGBA{175, 215, 175, 255}, // LightPaleGreen3 - 152: color.RGBA{175, 215, 215, 255}, // LightPaleGreenBlue3 - 153: color.RGBA{175, 215, 255, 255}, // LightPaleGreenBlue2 - 154: color.RGBA{175, 255, 0, 255}, // Yellow4 - 155: color.RGBA{175, 255, 95, 255}, // PaleYellowGreen - 156: color.RGBA{175, 255, 135, 255}, // LightPaleYellowGreen1 - 157: color.RGBA{175, 255, 215, 255}, // LightPaleGreen2 - 158: color.RGBA{175, 255, 215, 255}, // LightPaleGreen1 - 159: color.RGBA{175, 255, 255, 255}, // LightPaleGreenBlue1 - 160: color.RGBA{215, 0, 0, 255}, // Red2 - 161: color.RGBA{215, 0, 95, 255}, // PurpleRed1 - 162: color.RGBA{215, 0, 135, 255}, // Purple6 - 163: color.RGBA{215, 0, 175, 255}, // Purple5 - 164: color.RGBA{215, 0, 215, 255}, // Purple4 - 165: color.RGBA{215, 0, 255, 255}, // BluePurple - 166: color.RGBA{215, 95, 0, 255}, // RedOrange1 - 167: color.RGBA{215, 95, 95, 255}, // PaleRed2 - 168: color.RGBA{215, 95, 135, 255}, // PalePurpleRed2 - 169: color.RGBA{215, 95, 175, 255}, // PalePurple4 - 170: color.RGBA{215, 95, 215, 255}, // PalePurple3 - 171: color.RGBA{215, 95, 255, 255}, // PaleBluePurple - 172: color.RGBA{215, 135, 0, 255}, // Orange2 - 173: color.RGBA{215, 135, 95, 255}, // PaleRedOrange2 - 174: color.RGBA{215, 135, 135, 255}, // PaleRed1 - 175: color.RGBA{215, 135, 175, 255}, // PaleRedPurple - 176: color.RGBA{215, 135, 215, 255}, // PalePurple2 - 177: color.RGBA{215, 135, 255, 255}, // LightPaleBluePurple - 178: color.RGBA{215, 175, 0, 255}, // OrangeYellow1 - 179: color.RGBA{215, 175, 95, 255}, // PaleOrange1 - 180: color.RGBA{215, 175, 135, 255}, // PaleRedOrange1 - 181: color.RGBA{215, 175, 175, 255}, // LightPaleRed3 - 182: color.RGBA{215, 175, 215, 255}, // LightPalePurple4 - 183: color.RGBA{215, 175, 255, 255}, // LightPalePurpleBlue - 184: color.RGBA{215, 215, 0, 255}, // Yellow3 - 185: color.RGBA{215, 215, 95, 255}, // PaleYellow3 - 186: color.RGBA{215, 215, 135, 255}, // PaleYellow2 - 187: color.RGBA{215, 215, 175, 255}, // LightPaleYellow4 - 188: color.RGBA{215, 215, 215, 255}, // LightGray - 189: color.RGBA{215, 215, 255, 255}, // LightPaleBlue - 190: color.RGBA{215, 255, 0, 255}, // Yellow2 - 191: color.RGBA{215, 255, 95, 255}, // PaleYellow1 - 192: color.RGBA{215, 255, 135, 255}, // LightPaleYellow3 - 193: color.RGBA{215, 255, 175, 255}, // LightPaleYellowGreen - 194: color.RGBA{215, 255, 215, 255}, // LightPaleGreen - 195: color.RGBA{215, 255, 255, 255}, // LightPaleGreenBlue - 196: color.RGBA{255, 0, 0, 255}, // Red1 - 197: color.RGBA{255, 0, 95, 255}, // PurpleRed - 198: color.RGBA{255, 0, 135, 255}, // RedPurple - 199: color.RGBA{255, 0, 175, 255}, // Purple3 - 200: color.RGBA{255, 0, 215, 255}, // Purple2 - 201: color.RGBA{255, 0, 255, 255}, // Purple1 - 202: color.RGBA{255, 95, 0, 255}, // RedOrange - 203: color.RGBA{255, 95, 95, 255}, // PaleRed - 204: color.RGBA{255, 95, 135, 255}, // PalePurpleRed1 - 205: color.RGBA{255, 95, 175, 255}, // PalePurpleRed - 206: color.RGBA{255, 95, 215, 255}, // PalePurple1 - 207: color.RGBA{255, 95, 255, 255}, // PalePurple - 208: color.RGBA{255, 135, 0, 255}, // Orange1 - 209: color.RGBA{255, 135, 95, 255}, // PaleOrangeRed - 210: color.RGBA{255, 135, 135, 255}, // LightPaleRed2 - 211: color.RGBA{255, 135, 175, 255}, // LightPalePurpleRed1 - 212: color.RGBA{255, 135, 215, 255}, // LightPalePurple3 - 213: color.RGBA{255, 135, 255, 255}, // LightPalePurple2 - 214: color.RGBA{255, 175, 0, 255}, // Orange - 215: color.RGBA{255, 175, 95, 255}, // PaleRedOrange - 216: color.RGBA{255, 175, 135, 255}, // LightPaleRedOrange1 - 217: color.RGBA{255, 175, 175, 255}, // LightPaleRed1 - 218: color.RGBA{255, 175, 215, 255}, // LightPalePurpleRed - 219: color.RGBA{255, 175, 255, 255}, // LightPalePurple1 - 220: color.RGBA{255, 215, 0, 255}, // OrangeYellow - 221: color.RGBA{255, 215, 95, 255}, // PaleOrange - 222: color.RGBA{255, 215, 135, 255}, // LightPaleOrange - 223: color.RGBA{255, 215, 175, 255}, // LightPaleRedOrange - 224: color.RGBA{255, 215, 215, 255}, // LightPaleRed - 225: color.RGBA{255, 215, 255, 255}, // LightPalePurple - 226: color.RGBA{255, 255, 0, 255}, // Yellow1 - 227: color.RGBA{255, 255, 95, 255}, // PaleYellow - 228: color.RGBA{255, 255, 135, 255}, // LightPaleYellow2 - 229: color.RGBA{255, 255, 175, 255}, // LightPaleYellow1 - 230: color.RGBA{255, 255, 215, 255}, // LightPaleYellow - 231: color.RGBA{255, 255, 255, 255}, // White1 - 232: color.RGBA{8, 8, 8, 255}, // Gray4 - 233: color.RGBA{18, 18, 18, 255}, // Gray8 - 234: color.RGBA{28, 28, 28, 255}, // Gray11 - 235: color.RGBA{38, 38, 38, 255}, // Gray15 - 236: color.RGBA{48, 48, 48, 255}, // Gray19 - 237: color.RGBA{58, 58, 58, 255}, // Gray23 - 238: color.RGBA{68, 68, 68, 255}, // Gray27 - 239: color.RGBA{78, 78, 78, 255}, // Gray31 - 240: color.RGBA{88, 88, 88, 255}, // Gray35 - 241: color.RGBA{98, 98, 98, 255}, // Gray39 - 242: color.RGBA{108, 108, 108, 255}, // Gray43 - 243: color.RGBA{118, 118, 118, 255}, // Gray47 - 244: color.RGBA{128, 128, 128, 255}, // Gray51 - 245: color.RGBA{138, 138, 138, 255}, // Gray55 - 246: color.RGBA{148, 148, 148, 255}, // Gray59 - 247: color.RGBA{158, 158, 158, 255}, // Gray62 - 248: color.RGBA{168, 168, 168, 255}, // Gray66 - 249: color.RGBA{178, 178, 178, 255}, // Gray70 - 250: color.RGBA{188, 188, 188, 255}, // Gray74 - 251: color.RGBA{198, 198, 198, 255}, // Gray78 - 252: color.RGBA{208, 208, 208, 255}, // Gray82 - 253: color.RGBA{218, 218, 218, 255}, // Gray86 - 254: color.RGBA{228, 228, 228, 255}, // Gray90 - 255: color.RGBA{238, 238, 238, 255}, // Gray94 - } -} - // Decoder is a Sixel image decoder. It reads Sixel image data from an // io.Reader and decodes it into an image.Image. type Decoder struct{} @@ -345,7 +75,7 @@ func (d *Decoder) Decode(r io.Reader) (image.Image, error) { } img := image.NewRGBA(bounds) - palette := buildDefaultDecodePalette() + palette := DefaultPalette() var currentX, currentBandY, currentPaletteIndex int // data buffer used to decode Sixel commands @@ -520,3 +250,276 @@ func (d *Decoder) readError(err error) error { return fmt.Errorf("failed to read sixel data: %w", err) } + +// The default palette for Sixel images. This is a combination of the Sixel +// default colors and the xterm colors. +var colorPalette = [256]color.Color{ + // Sixel-specific default colors + 0: color.RGBA{0, 0, 0, 255}, + 1: color.RGBA{51, 51, 204, 255}, + 2: color.RGBA{204, 36, 36, 255}, + 3: color.RGBA{51, 204, 51, 255}, + 4: color.RGBA{204, 51, 204, 255}, + 5: color.RGBA{51, 204, 204, 255}, + 6: color.RGBA{204, 204, 51, 255}, + 7: color.RGBA{120, 120, 120, 255}, + 8: color.RGBA{69, 69, 69, 255}, + 9: color.RGBA{87, 87, 153, 255}, + 10: color.RGBA{153, 69, 69, 255}, + 11: color.RGBA{87, 153, 87, 255}, + 12: color.RGBA{153, 87, 153, 255}, + 13: color.RGBA{87, 153, 153, 255}, + 14: color.RGBA{153, 153, 87, 255}, + 15: color.RGBA{204, 204, 204, 255}, + + // xterm colors + 16: color.RGBA{0, 0, 0, 255}, // Black1 + 17: color.RGBA{0, 0, 95, 255}, // DarkBlue2 + 18: color.RGBA{0, 0, 135, 255}, // DarkBlue1 + 19: color.RGBA{0, 0, 175, 255}, // DarkBlue + 20: color.RGBA{0, 0, 215, 255}, // Blue3 + 21: color.RGBA{0, 0, 255, 255}, // Blue2 + 22: color.RGBA{0, 95, 0, 255}, // DarkGreen4 + 23: color.RGBA{0, 95, 95, 255}, // DarkGreenBlue5 + 24: color.RGBA{0, 95, 135, 255}, // DarkGreenBlue4 + 25: color.RGBA{0, 95, 175, 255}, // DarkGreenBlue3 + 26: color.RGBA{0, 95, 215, 255}, // GreenBlue8 + 27: color.RGBA{0, 95, 255, 255}, // GreenBlue7 + 28: color.RGBA{0, 135, 0, 255}, // DarkGreen3 + 29: color.RGBA{0, 135, 95, 255}, // DarkGreen2 + 30: color.RGBA{0, 135, 0, 255}, // DarkGreenBlue2 + 31: color.RGBA{0, 135, 175, 255}, // DarkGreenBlue1 + 32: color.RGBA{0, 125, 215, 255}, // GreenBlue6 + 33: color.RGBA{0, 135, 255, 255}, // GreenBlue5 + 34: color.RGBA{0, 175, 0, 255}, // DarkGreen1 + 35: color.RGBA{0, 175, 95, 255}, // DarkGreen + 36: color.RGBA{0, 175, 135, 255}, // DarkBlueGreen + 37: color.RGBA{0, 175, 175, 255}, // DarkGreenBlue + 38: color.RGBA{0, 175, 215, 255}, // GreenBlue4 + 39: color.RGBA{0, 175, 255, 255}, // GreenBlue3 + 40: color.RGBA{0, 215, 0, 255}, // Green7 + 41: color.RGBA{0, 215, 95, 255}, // Green6 + 42: color.RGBA{0, 215, 135, 255}, // Green5 + 43: color.RGBA{0, 215, 175, 255}, // BlueGreen1 + 44: color.RGBA{0, 215, 215, 255}, // GreenBlue2 + 45: color.RGBA{0, 215, 255, 255}, // GreenBlue1 + 46: color.RGBA{0, 255, 0, 255}, // Green4 + 47: color.RGBA{0, 255, 95, 255}, // Green3 + 48: color.RGBA{0, 255, 135, 255}, // Green2 + 49: color.RGBA{0, 255, 175, 255}, // Green1 + 50: color.RGBA{0, 255, 215, 255}, // BlueGreen + 51: color.RGBA{0, 255, 255, 255}, // GreenBlue + 52: color.RGBA{95, 0, 0, 255}, // DarkRed2 + 53: color.RGBA{95, 0, 95, 255}, // DarkPurple4 + 54: color.RGBA{95, 0, 135, 255}, // DarkBluePurple2 + 55: color.RGBA{95, 0, 175, 255}, // DarkBluePurple1 + 56: color.RGBA{95, 0, 215, 255}, // PurpleBlue + 57: color.RGBA{95, 0, 255, 255}, // Blue1 + 58: color.RGBA{95, 95, 0, 255}, // DarkYellow4 + 59: color.RGBA{95, 95, 95, 255}, // Gray3 + 60: color.RGBA{95, 95, 135, 255}, // PlueBlue8 + 61: color.RGBA{95, 95, 175, 255}, // PaleBlue7 + 62: color.RGBA{95, 95, 215, 255}, // PaleBlue6 + 63: color.RGBA{95, 95, 255, 255}, // PaleBlue5 + 64: color.RGBA{95, 135, 0, 255}, // DarkYellow3 + 65: color.RGBA{95, 135, 95, 255}, // PaleGreen12 + 66: color.RGBA{95, 135, 135, 255}, // PaleGreen11 + 67: color.RGBA{95, 135, 175, 255}, // PaleGreenBlue10 + 68: color.RGBA{95, 135, 215, 255}, // PaleGreenBlue9 + 69: color.RGBA{95, 135, 255, 255}, // PaleBlue4 + 70: color.RGBA{95, 175, 0, 255}, // DarkGreenYellow + 71: color.RGBA{95, 175, 95, 255}, // PaleGreen11 + 72: color.RGBA{95, 175, 135, 255}, // PaleGreen10 + 73: color.RGBA{95, 175, 175, 255}, // PaleGreenBlue8 + 74: color.RGBA{95, 175, 215, 255}, // PaleGreenBlue7 + 75: color.RGBA{95, 175, 255, 255}, // PaleGreenBlue6 + 76: color.RGBA{95, 215, 0, 255}, // YellowGreen1 + 77: color.RGBA{95, 215, 95, 255}, // PaleGreen9 + 78: color.RGBA{95, 215, 135, 255}, // PaleGreen8 + 79: color.RGBA{95, 215, 175, 255}, // PaleGreen7 + 80: color.RGBA{95, 215, 215, 255}, // PaleGreenBlue5 + 81: color.RGBA{95, 215, 255, 255}, // PaleGreenBlue4 + 82: color.RGBA{95, 255, 0, 255}, // YellowGreen + 83: color.RGBA{95, 255, 95, 255}, // PaleGreen6 + 84: color.RGBA{95, 255, 135, 255}, // PaleGreen5 + 85: color.RGBA{95, 255, 175, 255}, // PaleGreen4 + 86: color.RGBA{95, 255, 215, 255}, // PaleGreen3 + 87: color.RGBA{95, 255, 255, 255}, // PaleGreenBlue3 + 88: color.RGBA{135, 0, 0, 255}, // DarkRed1 + 89: color.RGBA{135, 0, 95, 255}, // DarkPurple3 + 90: color.RGBA{135, 0, 135, 255}, // DarkPurple2 + 91: color.RGBA{135, 0, 175, 255}, // DarkBluePurple + 92: color.RGBA{135, 0, 215, 255}, // BluePurple4 + 93: color.RGBA{135, 0, 255, 255}, // BluePurple3 + 94: color.RGBA{135, 95, 0, 255}, // DarkOrange1 + 95: color.RGBA{135, 95, 95, 255}, // PaleRed5 + 96: color.RGBA{135, 95, 135, 255}, // PalePurple7 + 97: color.RGBA{135, 95, 175, 255}, // PalePurpleBlue + 98: color.RGBA{135, 95, 215, 255}, // PaleBlue3 + 99: color.RGBA{135, 95, 255, 255}, // PaleBlue2 + 100: color.RGBA{135, 135, 0, 255}, // DarkYellow2 + 101: color.RGBA{135, 135, 95, 255}, // PaleYellow7 + 102: color.RGBA{135, 135, 135, 255}, // Gray2 + 103: color.RGBA{135, 135, 175, 255}, // PaleBlue1 + 104: color.RGBA{135, 135, 215, 255}, // PaleBlue + 105: color.RGBA{135, 135, 255, 255}, // LightPaleBlue4 + 106: color.RGBA{135, 175, 0, 255}, // DarkYellow1 + 107: color.RGBA{135, 175, 95, 255}, // PaleYellowGreen3 + 108: color.RGBA{135, 175, 135, 255}, // PaleGreen2 + 109: color.RGBA{135, 175, 175, 255}, // PaleGreenBlue2 + 110: color.RGBA{135, 175, 215, 255}, // PaleGreenBlue1 + 111: color.RGBA{135, 175, 255, 255}, // LightPaleGreenBlue6 + 112: color.RGBA{135, 215, 0, 255}, // Yellow6 + 113: color.RGBA{135, 215, 95, 255}, // PaleYellowGreen2 + 114: color.RGBA{135, 215, 135, 255}, // PaleGreen1 + 115: color.RGBA{135, 215, 175, 255}, // PaleGreen + 116: color.RGBA{135, 215, 215, 255}, // PaleGreenBlue + 117: color.RGBA{135, 215, 255, 255}, // LightPaleGreenBlue5 + 118: color.RGBA{135, 255, 0, 255}, // GreenYellow + 119: color.RGBA{135, 255, 95, 255}, // PaleYellowGreen1 + 120: color.RGBA{135, 255, 135, 255}, // LightPaleGreen6 + 121: color.RGBA{135, 255, 175, 255}, // LightPaleGreen5 + 122: color.RGBA{135, 255, 215, 255}, // LightPaleGreen4 + 123: color.RGBA{135, 255, 255, 255}, // LightPaleGreenBlue4 + 124: color.RGBA{175, 0, 0, 255}, // DarkRed + 125: color.RGBA{175, 0, 95, 255}, // DarkRedPurple + 126: color.RGBA{175, 0, 135, 255}, // DarkPurple1 + 127: color.RGBA{175, 0, 175, 255}, // DarkPurple + 128: color.RGBA{175, 0, 215, 255}, // BluePurple2 + 129: color.RGBA{175, 0, 255, 255}, // BluePurple1 + 130: color.RGBA{175, 95, 0, 255}, // DarkOrange + 131: color.RGBA{175, 95, 95, 255}, // PaleRed4 + 132: color.RGBA{175, 95, 135, 255}, // PalePurpleRed3 + 133: color.RGBA{175, 95, 175, 255}, // PalePurple6 + 134: color.RGBA{175, 95, 215, 255}, // PaleBluePurple3 + 135: color.RGBA{175, 95, 255, 255}, // PaleBluePurple2 + 136: color.RGBA{175, 135, 0, 255}, // DarkYellowOrange + 137: color.RGBA{175, 135, 95, 255}, // PaleRedOrange3 + 138: color.RGBA{175, 135, 135, 255}, // PaleRed3 + 139: color.RGBA{175, 135, 175, 255}, // PalePurple5 + 140: color.RGBA{175, 135, 215, 255}, // PaleBluePurple1 + 141: color.RGBA{175, 135, 255, 255}, // LightPaleBlue3 + 142: color.RGBA{175, 175, 0, 255}, // DarkYellow + 143: color.RGBA{175, 175, 95, 255}, // PaleYellow6 + 144: color.RGBA{175, 175, 135, 255}, // PaleYellow5 + 145: color.RGBA{175, 175, 175, 255}, // Gray1 + 146: color.RGBA{175, 175, 215, 255}, // LightPaleBlue2 + 147: color.RGBA{175, 175, 255, 255}, // LightPaleBlue1 + 148: color.RGBA{175, 215, 0, 255}, // Yellow5 + 149: color.RGBA{175, 215, 95, 255}, // PaleYellow4 + 150: color.RGBA{175, 215, 135, 255}, // PaleGreenYellow + 151: color.RGBA{175, 215, 175, 255}, // LightPaleGreen3 + 152: color.RGBA{175, 215, 215, 255}, // LightPaleGreenBlue3 + 153: color.RGBA{175, 215, 255, 255}, // LightPaleGreenBlue2 + 154: color.RGBA{175, 255, 0, 255}, // Yellow4 + 155: color.RGBA{175, 255, 95, 255}, // PaleYellowGreen + 156: color.RGBA{175, 255, 135, 255}, // LightPaleYellowGreen1 + 157: color.RGBA{175, 255, 215, 255}, // LightPaleGreen2 + 158: color.RGBA{175, 255, 215, 255}, // LightPaleGreen1 + 159: color.RGBA{175, 255, 255, 255}, // LightPaleGreenBlue1 + 160: color.RGBA{215, 0, 0, 255}, // Red2 + 161: color.RGBA{215, 0, 95, 255}, // PurpleRed1 + 162: color.RGBA{215, 0, 135, 255}, // Purple6 + 163: color.RGBA{215, 0, 175, 255}, // Purple5 + 164: color.RGBA{215, 0, 215, 255}, // Purple4 + 165: color.RGBA{215, 0, 255, 255}, // BluePurple + 166: color.RGBA{215, 95, 0, 255}, // RedOrange1 + 167: color.RGBA{215, 95, 95, 255}, // PaleRed2 + 168: color.RGBA{215, 95, 135, 255}, // PalePurpleRed2 + 169: color.RGBA{215, 95, 175, 255}, // PalePurple4 + 170: color.RGBA{215, 95, 215, 255}, // PalePurple3 + 171: color.RGBA{215, 95, 255, 255}, // PaleBluePurple + 172: color.RGBA{215, 135, 0, 255}, // Orange2 + 173: color.RGBA{215, 135, 95, 255}, // PaleRedOrange2 + 174: color.RGBA{215, 135, 135, 255}, // PaleRed1 + 175: color.RGBA{215, 135, 175, 255}, // PaleRedPurple + 176: color.RGBA{215, 135, 215, 255}, // PalePurple2 + 177: color.RGBA{215, 135, 255, 255}, // LightPaleBluePurple + 178: color.RGBA{215, 175, 0, 255}, // OrangeYellow1 + 179: color.RGBA{215, 175, 95, 255}, // PaleOrange1 + 180: color.RGBA{215, 175, 135, 255}, // PaleRedOrange1 + 181: color.RGBA{215, 175, 175, 255}, // LightPaleRed3 + 182: color.RGBA{215, 175, 215, 255}, // LightPalePurple4 + 183: color.RGBA{215, 175, 255, 255}, // LightPalePurpleBlue + 184: color.RGBA{215, 215, 0, 255}, // Yellow3 + 185: color.RGBA{215, 215, 95, 255}, // PaleYellow3 + 186: color.RGBA{215, 215, 135, 255}, // PaleYellow2 + 187: color.RGBA{215, 215, 175, 255}, // LightPaleYellow4 + 188: color.RGBA{215, 215, 215, 255}, // LightGray + 189: color.RGBA{215, 215, 255, 255}, // LightPaleBlue + 190: color.RGBA{215, 255, 0, 255}, // Yellow2 + 191: color.RGBA{215, 255, 95, 255}, // PaleYellow1 + 192: color.RGBA{215, 255, 135, 255}, // LightPaleYellow3 + 193: color.RGBA{215, 255, 175, 255}, // LightPaleYellowGreen + 194: color.RGBA{215, 255, 215, 255}, // LightPaleGreen + 195: color.RGBA{215, 255, 255, 255}, // LightPaleGreenBlue + 196: color.RGBA{255, 0, 0, 255}, // Red1 + 197: color.RGBA{255, 0, 95, 255}, // PurpleRed + 198: color.RGBA{255, 0, 135, 255}, // RedPurple + 199: color.RGBA{255, 0, 175, 255}, // Purple3 + 200: color.RGBA{255, 0, 215, 255}, // Purple2 + 201: color.RGBA{255, 0, 255, 255}, // Purple1 + 202: color.RGBA{255, 95, 0, 255}, // RedOrange + 203: color.RGBA{255, 95, 95, 255}, // PaleRed + 204: color.RGBA{255, 95, 135, 255}, // PalePurpleRed1 + 205: color.RGBA{255, 95, 175, 255}, // PalePurpleRed + 206: color.RGBA{255, 95, 215, 255}, // PalePurple1 + 207: color.RGBA{255, 95, 255, 255}, // PalePurple + 208: color.RGBA{255, 135, 0, 255}, // Orange1 + 209: color.RGBA{255, 135, 95, 255}, // PaleOrangeRed + 210: color.RGBA{255, 135, 135, 255}, // LightPaleRed2 + 211: color.RGBA{255, 135, 175, 255}, // LightPalePurpleRed1 + 212: color.RGBA{255, 135, 215, 255}, // LightPalePurple3 + 213: color.RGBA{255, 135, 255, 255}, // LightPalePurple2 + 214: color.RGBA{255, 175, 0, 255}, // Orange + 215: color.RGBA{255, 175, 95, 255}, // PaleRedOrange + 216: color.RGBA{255, 175, 135, 255}, // LightPaleRedOrange1 + 217: color.RGBA{255, 175, 175, 255}, // LightPaleRed1 + 218: color.RGBA{255, 175, 215, 255}, // LightPalePurpleRed + 219: color.RGBA{255, 175, 255, 255}, // LightPalePurple1 + 220: color.RGBA{255, 215, 0, 255}, // OrangeYellow + 221: color.RGBA{255, 215, 95, 255}, // PaleOrange + 222: color.RGBA{255, 215, 135, 255}, // LightPaleOrange + 223: color.RGBA{255, 215, 175, 255}, // LightPaleRedOrange + 224: color.RGBA{255, 215, 215, 255}, // LightPaleRed + 225: color.RGBA{255, 215, 255, 255}, // LightPalePurple + 226: color.RGBA{255, 255, 0, 255}, // Yellow1 + 227: color.RGBA{255, 255, 95, 255}, // PaleYellow + 228: color.RGBA{255, 255, 135, 255}, // LightPaleYellow2 + 229: color.RGBA{255, 255, 175, 255}, // LightPaleYellow1 + 230: color.RGBA{255, 255, 215, 255}, // LightPaleYellow + 231: color.RGBA{255, 255, 255, 255}, // White1 + 232: color.RGBA{8, 8, 8, 255}, // Gray4 + 233: color.RGBA{18, 18, 18, 255}, // Gray8 + 234: color.RGBA{28, 28, 28, 255}, // Gray11 + 235: color.RGBA{38, 38, 38, 255}, // Gray15 + 236: color.RGBA{48, 48, 48, 255}, // Gray19 + 237: color.RGBA{58, 58, 58, 255}, // Gray23 + 238: color.RGBA{68, 68, 68, 255}, // Gray27 + 239: color.RGBA{78, 78, 78, 255}, // Gray31 + 240: color.RGBA{88, 88, 88, 255}, // Gray35 + 241: color.RGBA{98, 98, 98, 255}, // Gray39 + 242: color.RGBA{108, 108, 108, 255}, // Gray43 + 243: color.RGBA{118, 118, 118, 255}, // Gray47 + 244: color.RGBA{128, 128, 128, 255}, // Gray51 + 245: color.RGBA{138, 138, 138, 255}, // Gray55 + 246: color.RGBA{148, 148, 148, 255}, // Gray59 + 247: color.RGBA{158, 158, 158, 255}, // Gray62 + 248: color.RGBA{168, 168, 168, 255}, // Gray66 + 249: color.RGBA{178, 178, 178, 255}, // Gray70 + 250: color.RGBA{188, 188, 188, 255}, // Gray74 + 251: color.RGBA{198, 198, 198, 255}, // Gray78 + 252: color.RGBA{208, 208, 208, 255}, // Gray82 + 253: color.RGBA{218, 218, 218, 255}, // Gray86 + 254: color.RGBA{228, 228, 228, 255}, // Gray90 + 255: color.RGBA{238, 238, 238, 255}, // Gray94 +} + +// DefaultPalette is the default palette used when decoding a Sixel image. +// It contains the 256 colors defined by the xterm 256-color palette. +func DefaultPalette() color.Palette { + // Undefined colors in sixel images use a set of default colors: 0-15 + // are sixel-specific, 16-255 are the same as the xterm 256-color values + palette := append(color.Palette(nil), colorPalette[:]...) + return palette[:] +} From 73138de7ff8ff91785ec219d299cf77c116ea9ad Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 19:02:56 -0500 Subject: [PATCH 34/36] fix(ansi): sixel: lint errors --- ansi/sixel/encoder.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ansi/sixel/encoder.go b/ansi/sixel/encoder.go index c961fac1..8cb06ca2 100644 --- a/ansi/sixel/encoder.go +++ b/ansi/sixel/encoder.go @@ -169,12 +169,12 @@ func newEncoder(w io.Writer, bands *bitset.BitSet) *encoder { } // writePixelData will write the image pixel data to the writer. -func (s *encoder) writePixelData(img image.Image, palette color.Palette) error { +func (e *encoder) writePixelData(img image.Image, palette color.Palette) error { imageWidth := img.Bounds().Dx() bandHeight := bandHeight(img) for bandY := 0; bandY < bandHeight; bandY++ { if bandY > 0 { - s.writeControlRune(LineBreak) + e.writeControlRune(LineBreak) } hasWrittenAColor := false @@ -190,50 +190,50 @@ func (s *encoder) writePixelData(img image.Image, palette color.Palette) error { firstColorBit := uint(bandHeight*imageWidth*6*paletteIndex + bandY*imageWidth*6) //nolint:gosec nextColorBit := firstColorBit + uint(imageWidth*6) //nolint:gosec - firstSetBitInBand, anySet := s.bands.NextSet(firstColorBit) + firstSetBitInBand, anySet := e.bands.NextSet(firstColorBit) if !anySet || firstSetBitInBand >= nextColorBit { // Color not appearing in this row continue } if hasWrittenAColor { - s.writeControlRune(CarriageReturn) + e.writeControlRune(CarriageReturn) } hasWrittenAColor = true - s.writeControlRune(ColorIntroducer) - io.WriteString(s.w, strconv.Itoa(paletteIndex)) //nolint:errcheck + e.writeControlRune(ColorIntroducer) + io.WriteString(e.w, strconv.Itoa(paletteIndex)) //nolint:errcheck for x := 0; x < imageWidth; x += 4 { bit := firstColorBit + uint(x*6) //nolint:gosec - word := s.bands.GetWord64AtBit(bit) + word := e.bands.GetWord64AtBit(bit) pixel1 := byte((word & 63) + '?') pixel2 := byte(((word >> 6) & 63) + '?') pixel3 := byte(((word >> 12) & 63) + '?') pixel4 := byte(((word >> 18) & 63) + '?') - s.writeImageRune(pixel1) + e.writeImageRune(pixel1) if x+1 >= imageWidth { continue } - s.writeImageRune(pixel2) + e.writeImageRune(pixel2) if x+2 >= imageWidth { continue } - s.writeImageRune(pixel3) + e.writeImageRune(pixel3) if x+3 >= imageWidth { continue } - s.writeImageRune(pixel4) + e.writeImageRune(pixel4) } } } - s.writeControlRune('-') + e.writeControlRune('-') return nil } From e46a2b7c36d3365c0446d9618cb58a0beba180a0 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 19:04:50 -0500 Subject: [PATCH 35/36] feat(ansi): sixel: add Palette field to Decoder --- ansi/sixel/decoder.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ansi/sixel/decoder.go b/ansi/sixel/decoder.go index b9494b3d..503d354b 100644 --- a/ansi/sixel/decoder.go +++ b/ansi/sixel/decoder.go @@ -11,7 +11,11 @@ import ( // Decoder is a Sixel image decoder. It reads Sixel image data from an // io.Reader and decodes it into an image.Image. -type Decoder struct{} +type Decoder struct { + // Palette is the color palette used to decode the Sixel image. If the + // palette is nil, the default palette is used from [DefaultPalette]. + Palette color.Palette +} // Decode will parse sixel image data into an image or return an error. Because // the sixel image format does not have a predictable size, the end of the sixel @@ -75,7 +79,10 @@ func (d *Decoder) Decode(r io.Reader) (image.Image, error) { } img := image.NewRGBA(bounds) - palette := DefaultPalette() + palette := d.Palette + if palette == nil { + palette = colorPalette[:] + } var currentX, currentBandY, currentPaletteIndex int // data buffer used to decode Sixel commands @@ -520,6 +527,7 @@ var colorPalette = [256]color.Color{ func DefaultPalette() color.Palette { // Undefined colors in sixel images use a set of default colors: 0-15 // are sixel-specific, 16-255 are the same as the xterm 256-color values - palette := append(color.Palette(nil), colorPalette[:]...) + palette := make([]color.Color, len(colorPalette)) + palette = append(palette, colorPalette[:]...) return palette[:] } From fdb1448872d6a02259c5c80cf9565fcf41bb10a8 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Thu, 20 Feb 2025 19:07:18 -0500 Subject: [PATCH 36/36] feat(examples): add img2term example Only writes Sixel images for now --- examples/img2term/main.go | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 examples/img2term/main.go diff --git a/examples/img2term/main.go b/examples/img2term/main.go new file mode 100644 index 00000000..1210e97a --- /dev/null +++ b/examples/img2term/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "bytes" + "flag" + "image" + "io" + "log" + "os" + + _ "image/jpeg" + _ "image/png" + + "github.com/charmbracelet/x/ansi" + "github.com/charmbracelet/x/ansi/sixel" +) + +func main() { + flag.Parse() + args := flag.Args() + if len(args) == 0 { + flag.Usage() + os.Exit(1) + } + + f, err := os.Open(args[0]) + if err != nil { + log.Fatal(err) + } + + defer f.Close() //nolint:errcheck + img, _, err := image.Decode(f) + if err != nil { + log.Fatal(err) + } + + if _, err := writeSixel(os.Stdout, img); err != nil { + log.Fatal(err) + } +} + +func writeSixel(w io.Writer, img image.Image) (int, error) { + var buf bytes.Buffer + var e sixel.Encoder + if err := e.Encode(&buf, img); err != nil { + return 0, err + } + + return io.WriteString(w, ansi.SixelGraphics(0, 1, 0, buf.Bytes())) +}