[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 44caa96: Add a new function `svg-embed'

From: Lars Ingebrigtsen
Subject: [Emacs-diffs] master 44caa96: Add a new function `svg-embed'
Date: Mon, 27 Jun 2016 16:21:00 +0000 (UTC)

branch: master
commit 44caa96dc5c16cbc4ee1bb26ec880af2e2ecf9f8
Author: Lars Magne Ingebrigtsen <address@hidden>
Commit: Lars Magne Ingebrigtsen <address@hidden>

    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 a7c1d09..575cad8 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
address@hidden svg-embed svg image image-type datap &rest args
+Add an embedded (raster) image to @var{svg}.  If @var{datap} is
address@hidden, @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
address@hidden image type, for instance @samp{"image/jpeg"}.
+(svg-embed svg "~/rms.jpg" "image/jpeg" nil
+           :width "100px" :height "100px"
+           :x "50px" :y "75px")
address@hidden lisp
address@hidden 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 c4f3270..c33b092 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)))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]