-(defvar sixel-colour-map nil
- "Map of two-character names to RGB colour triples.")
-
-(defvar sixel-current-colour nil
- "Current colour.")
-
-(defun sixel-compute-row-length (string)
- (apply 'max
- (mapcar
- (lambda (substr)
- (apply 'max (mapcar
- (lambda (subsubstr)
- (length (subsubstr)))
- (split-string substr "$"))))
- (split-string string -))))
-
-(defun sixel-tag-bits (n tag bit-count)
- "Create a list of length BIT-COUNT with the elements corresponding to the
-true bits of N set to TAG."
- (if (= bit-count 0)
- nil
- (cons (if (= (% n 2) 1)
- tag
- nil)
- (sixel-tag-bits (/ n 2) tag (1- bit-count)))))
-
-(defun sixel-make-sixel-from-char (char tag)
- "Retrieve sequence of bits to be set."
- (sixel-tag-bits (- char 63) tag 6))
-
-(defun sixel-union (sixel1 sixel2)
- "Returns a union of the two sixels, SIXEL1 and SIXEL2.
-When both sixels specify a tag for the same pixel, the tag
-from SIXEL2 wins."
- (seq-mapn (lambda (tag1 tag2)
- (or tag2 tag1))
- sixel1 sixel2))
-
-(defun sixel-process-row (string)
- (let ((idx-in 0)
- (idx-out 0)
- result)
- (while (< idx-in (length string))
- (let (trunc-string (substring string index-in))
+(defun sixel-tag-bits (sixel n tag)
+ "Set bits of SIXEL corresponding to N with to the value TAG."
+ (dotimes (i 6)
+ (if (= (% n 2) 1)
+ (aset sixel i tag))
+ (setq n (/ n 2))))
+
+(defun sixel-tag-sixel-in-row (row index char tag)
+ "Tag the bits of the sixel at INDEX in the list identified by
+the variable ROW-VARIABLE corresponding to input character CHAR
+with TAG."
+ (while (not (< index (length row)))
+ (push (make-vector 6 nil) row))
+ (let ((sixel (elt row (- (length row) 1 index))))
+ (sixel-tag-bits sixel (- char 63) tag))
+ row)
+
+(defun sixel-process-data (string)
+ "Convert STRING into a list of lists representing individual sixels.
+Returns a sixel image object."
+ (with-temp-buffer
+ (insert string)
+ (goto-char (point-min))
+ (let ((idx-out 0)
+ this-row rows
+ current-colour colour-map
+ finished)
+ (while (not finished)