Support rendering Sixel with XPM images

* eat.el (eat--t-sixel-render-bitmap): Support conversion to
XPM format.
* eat.el (eat-sixel-render-formats): Add XPM to the default.
* eat.el (eat-term-set-parameter, eat--sixel-render-format):
Support XPM as an allowed format.
* eat.texi (Sixel): Update.
This commit is contained in:
Akib Azmain Turja 2023-10-03 18:51:24 +06:00
parent f122b16488
commit fac3f746cd
No known key found for this signature in database
GPG key ID: 5535FCF54D88616B
2 changed files with 52 additions and 10 deletions

51
eat.el
View file

@ -198,9 +198,11 @@ aspect ratio of 3:2."
:group 'eat-ui :group 'eat-ui
:group 'eat-eshell) :group 'eat-eshell)
(defcustom eat-sixel-render-formats '(svg half-block background none) (defcustom eat-sixel-render-formats
'(xpm svg half-block background none)
"List of formats to render Sixel, in order of preference." "List of formats to render Sixel, in order of preference."
:type '(repeat (choice (const :tag "SVG Image" svg) :type '(repeat (choice (const :tag "XPM Image" xpm)
(const :tag "SVG Image" svg)
(const :tag "UTF-8 half block" half-block) (const :tag "UTF-8 half block" half-block)
(const :tag "Background color" background) (const :tag "Background color" background)
(const :tag "None" none))) (const :tag "None" none)))
@ -3043,6 +3045,42 @@ CHAR-SIZE is the width and height of a character."
(format " fill=\"%s\"></rect>" color)) (format " fill=\"%s\"></rect>" color))
strs)))) strs))))
strs)) strs))
,@(eat--t-term-sixel-image-extra-props eat--t-term))))
('xpm
(put-text-property
(point) (1+ (point)) 'display
`(image
:type xpm
:data ,(let ((color-map nil)
(pixmap nil)
(color-key-length
(length (format "%x" (* (car char-size)
(cdr char-size))))))
(dotimes (i (cdr char-size))
(push nil pixmap)
(dotimes (j (car char-size))
(let ((idx (format
(format "%%0%ix" color-key-length)
(+ (* i (car char-size)) j)))
(color (or (aref (aref bitmap i) j)
"None")))
(push (format "%s c %s" idx color) color-map)
(push idx (car pixmap)))))
(concat
"/* XPM */\n"
"static char * XFACE[] = {\n"
(format "\"%i %i %i %i\",\n" (car char-size)
(cdr char-size) (* (car char-size)
(cdr char-size))
color-key-length)
(mapconcat (lambda (line)
(format "\"%s\",\n" line))
color-map)
(mapconcat (lambda (row)
(format "\"%s\"" (string-join
(nreverse row))))
(nreverse pixmap) ",\n")
"\n};"))
,@(eat--t-term-sixel-image-extra-props eat--t-term))))))) ,@(eat--t-term-sixel-image-extra-props eat--t-term)))))))
(defun eat--t-sixel-flush-line (nullify) (defun eat--t-sixel-flush-line (nullify)
@ -4016,9 +4054,9 @@ If NULLIFY is non-nil, nullify flushed part of Sixel buffer."
(setf (eat--t-term-char-width terminal) (car value)) (setf (eat--t-term-char-width terminal) (car value))
(setf (eat--t-term-char-height terminal) (cdr value))) (setf (eat--t-term-char-height terminal) (cdr value)))
('sixel-render-format ('sixel-render-format
(unless (memq value '(background half-block svg none)) (unless (memq value '(background half-block svg xpm none))
(error "`sixel-render-format' parameter must be set to one of\ (error "`sixel-render-format' parameter must be set to one of\
the supported methods")) the supported formats"))
(setf (eat--t-term-sixel-render-format terminal) value)) (setf (eat--t-term-sixel-render-format terminal) value))
('sixel-image-extra-properties ('sixel-image-extra-properties
(setf (eat--t-term-sixel-image-extra-props terminal) value))) (setf (eat--t-term-sixel-image-extra-props terminal) value)))
@ -5092,7 +5130,10 @@ selection, or nil if none."
(cl-return 'half-block))) (cl-return 'half-block)))
('svg (when (and (display-graphic-p) ('svg (when (and (display-graphic-p)
(image-type-available-p 'svg)) (image-type-available-p 'svg))
(cl-return 'svg))))) (cl-return 'svg)))
('xpm (when (and (display-graphic-p)
(image-type-available-p 'xpm))
(cl-return 'xpm)))))
'none)) 'none))
(defun eat--set-term-sixel-params () (defun eat--set-term-sixel-params ()

View file

@ -991,11 +991,12 @@ customizing the @code{eat-sixel-render-formats} user option.
@vindex eat-sixel-render-formats @vindex eat-sixel-render-formats
@defopt eat-sixel-render-formats @defopt eat-sixel-render-formats
List of formats to render Sixel, in order of preference. Each element List of formats to render Sixel, in order of preference. Each element
of the list is one of @code{svg}, @code{half-block}, of the list is one of @code{xpm}, @code{svg}, @code{half-block},
@code{background}, @code{none}. @code{svg} means to use SVG image @code{background}, @code{none}. @code{xpm} and @code{svg} means to
format, @code{half-block} means to use UTF-8 half block characters, use XPM and SVG image format respectively, @code{half-block} means to
@code{background} means to just use background color, and @code{none} use UTF-8 half block characters, @code{background} means to just use
means to not render the image, instead just clear the area. background color, and @code{none} means to not render the image,
instead just clear the area.
@end defopt @end defopt
@node Blinking Text @node Blinking Text