From 44caa96dc5c16cbc4ee1bb26ec880af2e2ecf9f8 Mon Sep 17 00:00:00 2001 From: Lars Magne Ingebrigtsen Date: Mon, 27 Jun 2016 18:20:48 +0200 Subject: [PATCH] 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. --- doc/lispref/display.texi | 13 +++++++++++++ lisp/svg.el | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index a7c1d0992de..575cad89f83 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -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 diff --git a/lisp/svg.el b/lisp/svg.el index c4f3270ea8a..c33b0923c26 100644 --- a/lisp/svg.el +++ b/lisp/svg.el @@ -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))) -- 2.11.4.GIT