Initial commit.
authorTim Vaughan <tgvaughan@gmail.com>
Mon, 13 May 2019 21:09:40 +0000 (23:09 +0200)
committerTim Vaughan <tgvaughan@gmail.com>
Mon, 13 May 2019 21:09:40 +0000 (23:09 +0200)
sixel.el [new file with mode: 0644]

diff --git a/sixel.el b/sixel.el
new file mode 100644 (file)
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))
+         ())))