1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-02-04 22:50:59 -08:00

Add a new function `svg-embed'

* doc/lispref/display.texi (SVG Images): Document `svg-embed'.

* lisp/svg.el (svg-embed): New function.
(svg--image-data): Ditto.
This commit is contained in:
Lars Magne Ingebrigtsen 2016-06-27 18:20:48 +02:00
parent 058e856277
commit 44caa96dc5
2 changed files with 36 additions and 0 deletions

View file

@ -5350,6 +5350,19 @@ that describe the outer circumference of the polygon.
@end lisp
@end defun
@defun svg-embed svg image image-type datap &rest args
Add an embedded (raster) image to @var{svg}. If @var{datap} is
@code{nil}, @var{IMAGE} should be a file name; if not, it should be a
binary string containing the image data. @var{image-type} should be a
@acronym{MIME} image type, for instance @samp{"image/jpeg"}.
@lisp
(svg-embed svg "~/rms.jpg" "image/jpeg" nil
:width "100px" :height "100px"
:x "50px" :y "75px")
@end lisp
@end defun
Finally, the @code{svg-image} takes an SVG object as its parameter and
returns an image object suitable for use in functions like
@code{insert-image}. Here's a complete example that creates and

View file

@ -137,6 +137,18 @@ POINTS is a list of x/y pairs."
", "))
,@(svg--arguments svg args)))))
(defun svg-embed (svg image image-type datap &rest args)
"Insert IMAGE into the SVG structure.
IMAGE should be a file name if DATAP is nil, and a binary string
otherwise. IMAGE-TYPE should be a MIME image type, like
\"image/jpeg\" or the like."
(svg--append
svg
(dom-node
'image
`((xlink:href . ,(svg--image-data image image-type datap))
,@(svg--arguments svg args)))))
(defun svg--append (svg node)
(let ((old (and (dom-attr node 'id)
(dom-by-id svg
@ -147,6 +159,17 @@ POINTS is a list of x/y pairs."
(dom-append-child svg node)))
(svg-possibly-update-image svg))
(defun svg--image-data (image image-type datap)
(with-temp-buffer
(set-buffer-multibyte nil)
(if datap
(insert image)
(insert-file-contents image))
(base64-encode-region (point-min) (point-max) t)
(goto-char (point-min))
(insert "data:" image-type ";base64,")
(buffer-string)))
(defun svg--arguments (svg args)
(let ((stroke-width (or (plist-get args :stroke-width)
(dom-attr svg 'stroke-width)))