From: Tim Vaughan Date: Mon, 13 May 2019 21:09:40 +0000 (+0200) Subject: Initial commit. X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=commitdiff_plain;h=d248b8db1153ba5b0139fb52812d0487c7f196c2;p=sixel.git Initial commit. --- d248b8db1153ba5b0139fb52812d0487c7f196c2 diff --git a/sixel.el b/sixel.el new file mode 100644 index 0000000..6bcef4e --- /dev/null +++ b/sixel.el @@ -0,0 +1,92 @@ +(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)) + ())))