(defvar test-string (concat "q" "#0;2;0;0;0#1;2;100;100;0#2;2;0;100;0" "#1~~@@vv@@~~@@~~$" "#2??GG????-" "#1!14@")) (defun sixel-get-params (string) "Retrieve the sixel parameters." (car (split-string string "q"))) (defun sixel-get-data (string) "Retrieve data string." (substring string (1+ (string-match "q" string)))) (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)) (cond ((string-match "^#\\([0-9]+\\);\\([0-9]+\\);\\([0-9]+\\);\\([0-9]+\\);\\([0-9]+\\)" trunc-string) (let ((tag (intern (string-to (match-string 1 trunc-string)))) (mode (match-string 2 trunc-string)) (r (string-to-number (match-string 3 trunc-string))) (g (string-to-number (match-string 4 trunc-string))) (b (string-to-number (match-string 5 trunc-string)))) (add-to-list 'sixel-colour-map (list (tag r g b))) (setq idx-in (match-end 0)))) ((string-match "^#\\([0-9]+\\)" trunc-string) (let ((tag (intern (match-string 1 trunc-string)))) (setq current-colour tag) (setq idx-in (match-end 0)))) ((string-match "^!\\([0-9]+\\)\\([?-~]\\)" trunc-string) (let ((repeat-count (string-to-number (match-string 1 trunc-string))) (char (elt (match-string 2 trunc-string) 0))) (dotimes (i repeat-count) (unless (< idx-out (length result)) (add-to-list result (make-vector 6 nil))) (let ((sixel (elt result idx-out)))))))))))) (sixel-get-rows test-string) (defun sixel-to-xpm (string) "Converts the given sixel string into an XPM image." (let* ((sp (split-string string "q")) (control-string (car sp)) ())))