X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=sixel.el;h=775bb58c7aa4e3e4162b8b28c04b6b1809bd9fae;hb=bf267f54c848e444efacb63e5fe0152822242467;hp=8147c8fa91de955b94a52fd63869109e18d84b59;hpb=819366690f61cab4ef197ad1cfac92dac4130848;p=sixel.git diff --git a/sixel.el b/sixel.el index 8147c8f..775bb58 100644 --- a/sixel.el +++ b/sixel.el @@ -5,7 +5,7 @@ ;; Author: Tim Vaughan ;; Created: 19 May 2019 ;; Version: 1.0.0 -;; Keywords: +;; Keywords: ;; Homepage: https://github.com/tgvaughan/sixel ;; Package-Requires: ((emacs "25")) @@ -14,15 +14,15 @@ ;;; Code: (defvar test-string - (concat "q" + (concat "Pq" "#0;2;0;0;0#1;2;100;100;0#2;2;0;100;0" "#1~~@@vv@@~~@@~~$" "#2??}}GG}}??}}??-" - "#1!14@")) + "#1!14@\\")) (defun sixel-get-params (string) "Retrieve the sixel parameters." - (car (split-string string "q"))) + (car (split-string (substring string 2) "q"))) (defun sixel-get-data (string) "Retrieve data string." @@ -57,6 +57,7 @@ Returns a sixel image object." finished) (while (not finished) (cond + ;; Define colour: ((looking-at "#\\([0-9]+\\);\\([0-9]+\\);\\([0-9]+\\);\\([0-9]+\\);\\([0-9]+\\)") (let ((tag (format "%02x" (string-to-number (match-string 1)))) (mode (match-string 2)) @@ -64,19 +65,19 @@ Returns a sixel image object." (g (string-to-number (match-string 4))) (b (string-to-number (match-string 5)))) (push (list tag r g b) colour-map))) - + ;; Set current colour: ((looking-at "#\\([0-9]+\\)") (let ((tag (format "%02x" (string-to-number (match-string 1))))) (setq current-colour tag))) - + ;; Carriage return: ((looking-at "\\$") (setq idx-out 0)) - + ;; New line: ((looking-at "-") (push (reverse this-row) rows) (setq this-row nil) (setq idx-out 0)) - + ;; RLE sixel char sequence: ((looking-at "!\\([0-9]+\\)\\([?-~]\\)") (let ((repeat-count (string-to-number (match-string 1))) (char (elt (match-string 2) 0))) @@ -84,38 +85,52 @@ Returns a sixel image object." (setq this-row (sixel-tag-sixel-in-row this-row idx-out char current-colour)) (setq idx-out (1+ idx-out))))) - - ((looking-at "\\([?-~]\\)") + ;; Sixel char: + ((looking-at "\\([?-~]\\)") ; Sixel char (let ((char (elt (match-string 1) 0))) (setq this-row (sixel-tag-sixel-in-row this-row idx-out char current-colour)) (setq idx-out (1+ idx-out)))) - - (t (setq finished t))) - + ;; Termination sequence: + ((looking-at "\\\\") + (setq finished t)) + ;; Skip other char: + ((looking-at "[[:ascii:]]"))) (goto-char (match-end 0))) (push (reverse this-row) rows) (cons colour-map (reverse rows))))) +(defun sixel-pad-rows (sixel-image) + "Pad out contents of rows in SIXEL-IMAGE so that all rows are the same length." + (let ((width (car (sixel-image-dims sixel-image))) + (rows (cdr sixel-image))) + (dotimes (row-idx (length rows)) + (let* ((row-cdr (nthcdr row-idx rows)) + (row-width (length (car row-cdr)))) + (if (< row-width width) + (setcar row-cdr (append (car row-cdr) + (make-list (- width row-width) + [nil nil nil nil nil nil]))))))) + sixel-image) + (defun sixel-image-colour-map (sixel-image) - "Extract colour map from SIXEL-DATA." + "Extract colour map from SIXEL-IMAGE." (car sixel-image)) (defun sixel-image-sixels (sixel-image) - "Extract sixels from SIXEL-DATA." + "Extract sixels from SIXEL-IMAGE." (cdr sixel-image)) (defun sixel-image-dims (sixel-image) - "Computes image width from SIXEL-DATA. Returns pair (width . height)." + "Compute image width from SIXEL-IMAGE. Return pair (width . height)." (let ((sixels (sixel-image-sixels sixel-image))) (cons (apply #'max (mapcar (lambda (row) (length row)) sixels)) (* 6 (length sixels))))) (defun sixel-image-to-xpm-values (sixel-image) - "Produce string representing parameter values component of XPM -representation of SIXEL-IMAGE." + "Produce parameter values component of XPM representation of SIXEL-IMAGE." (let* ((dims (sixel-image-dims sixel-image)) (colour-map (sixel-image-colour-map sixel-image)) (n-colours (1+ (length colour-map)))) @@ -125,8 +140,7 @@ representation of SIXEL-IMAGE." (number-to-string n-colours) " 2\""))) (defun sixel-image-to-xpm-colours (sixel-image) - "Produce string representing colour definitions component of XPM -representation of SIXEL-IMAGE." + "Produce colour definitions component of XPM representation of SIXEL-IMAGE." (let ((colour-map (sixel-image-colour-map sixel-image))) (concat (string-join @@ -136,18 +150,17 @@ representation of SIXEL-IMAGE." (elt colour 0) " " "c #" (format "%02x%02x%02x" - (elt colour 1) - (elt colour 2) - (elt colour 3)) + (/ (* 255 (elt colour 1)) 100) + (/ (* 255 (elt colour 2)) 100) + (/ (* 255 (elt colour 3)) 100)) "\"")) colour-map) - ",") - "\",\n" + ",\n") + ",\n" "\"-- c #000000\""))) (defun sixel-image-to-xpm-pixels (sixel-image) - "Produce string representating pixels component of XPM representation -of SIXEL-IMAGE." + "Produce pixels component of XPM representation of SIXEL-IMAGE." (concat "\"" (string-join @@ -168,15 +181,17 @@ of SIXEL-IMAGE." "\"")) (defun sixel-to-xpm (string) - "Returns an XPM image representation of the SIXEL graphic encoded in STRING." + "Return an XPM image representation of the SIXEL graphic encoded in STRING." (let* ((param-string (sixel-get-params string)) (data-string (sixel-get-data string)) - (sixel-image (sixel-process-data data-string))) - (concat - "/* XPM */" - "static char * pixmap = {" - (sixel-image-to-xpm-values sixel-image) ",\n" - (sixel-image-to-xpm-colours sixel-image) ",\n" - (sixel-image-to-xpm-pixels sixel-image) "};"))) - -;; sixel.el ends here + (sixel-image (sixel-pad-rows (sixel-process-data data-string)))) + (if (string-prefix-p "P" string) + (concat + "/* XPM */" + "static char * pixmap[] = {" + (sixel-image-to-xpm-values sixel-image) ",\n" + (sixel-image-to-xpm-colours sixel-image) ",\n" + (sixel-image-to-xpm-pixels sixel-image) "};") + (error "Incorrecly formatted sixel string")))) + +;;; sixel.el ends here