aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 Andy Wingo <wingo@igalia.com>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu build svg)
  #:use-module (rsvg)
  #:use-module (cairo)
  #:use-module (srfi srfi-11)
  #:export (svg->png))

(define* (downscaled-surface surface
                             #:key
                             source-width source-height
                             width height)
  "Return a new rendering context where SURFACE is scaled to WIDTH x HEIGHT."
  (let ((cr (cairo-create (cairo-image-surface-create 'argb32
                                                      width height))))
    (cairo-scale cr (/ width source-width) (/ height source-height))
    (cairo-set-source-surface cr surface 0 0)
    (cairo-pattern-set-filter (cairo-get-source cr) 'best)
    (cairo-rectangle cr 0 0 source-width source-height)
    (cairo-fill cr)
    cr))

(define* (svg->png in-svg out-png
                   #:key width height)
  "Render the file at IN-SVG as a PNG file in OUT-PNG.  When WIDTH and HEIGHT
are provided, use them as the dimensions of OUT-PNG; otherwise preserve the
dimensions of IN-SVG."
  (define svg
    (rsvg-handle-new-from-file in-svg))

  (let-values (((origin-width origin-height em ex)
                (rsvg-handle-get-dimensions svg)))
    (let* ((surf (cairo-image-surface-create 'argb32
                                             origin-width origin-height))
           (cr   (cairo-create surf)))
      (rsvg-handle-render-cairo svg cr)
      (cairo-surface-flush surf)
      (let ((cr (if (and width height
                         (not (= width origin-width))
                         (not (= height origin-height)))
                    (downscaled-surface surf
                                        #:source-width origin-width
                                        #:source-height origin-height
                                        #:width width
                                        #:height height)
                    cr)))
        (cairo-surface-write-to-png (cairo-get-target cr) out-png)))))

;;; svg.scm ends here
417f24a1'>.dir-locals: Add let-keywords indentation rules....Maxim Cournoyer 2023-02-02.dir-locals.el: Adjust indentation rule for test-assertm....Maxim Cournoyer 2023-02-02.dir-locals.el: Add indentation rule for computed-file....Maxim Cournoyer 2022-09-07.dir-locals.el: Update yas snippets directory....Andrew Tropin 2022-09-05.dir-locals.el: Add .go to completion-ignored-extensions....Andrew Tropin 2022-09-05.dir-locals.el: Add guix yasnippets....Andrew Tropin 2022-07-10monads: Add 'mparameterize'....Ludovic Courtès 2022-07-10.dir-locals.el: Restore Emacs 27 lisp-fill-paragraph behavior....Maxim Cournoyer 2022-06-28.dir-locals.el: Properly indent 'wrap-script'....Maxim Cournoyer 2022-06-07.dir-locals: Adjust to bug-reference-mode in Emacs 28....Ludovic Courtès 2022-03-06import: github: Reuse HTTP connection for the /tags URL fallback....Ludovic Courtès 2022-03-06tests: Add (guix http-client) tests....Ludovic Courtès 2022-01-29.dir-locals.el: Don't mess up indentation of prepend and append....Liliana Marie Prikler 2021-08-12Merge branch 'master' into core-updates-frozen...Marius Bakke 2021-08-02.dir-locals.el: Specify indentation rule for with-shepherd-action....Maxim Cournoyer 2021-07-18Merge branch 'master' into core-updatesLudovic Courtès 2021-07-11packages: Add 'modify-inputs'....Ludovic Courtès 2021-06-29pack: Add support for the deb format....Maxim Cournoyer 2021-03-30build-system: Rewrite using gexps....Ludovic Courtès 2020-12-15system: 'init' does not recompute the hash of each store item....Ludovic Courtès 2020-11-17Merge remote-tracking branch 'origin/version-1.2.0' into master...Maxim Cournoyer 2020-11-16.dir-locals.el: Add upstream report link....Miguel Ángel Arruga Vivas 2020-11-16.dir-locals.el: Use setq-local on guix-directory....Christopher Lemmer Webber 2020-11-16.dir-locals.el: Prevent errors if .dir-locals.el isn't found....Christopher Lemmer Webber 2020-11-12maint: update-guix-package: Optionally add sources to store....Maxim Cournoyer 2020-11-01.dir-locals.el: Require cl-lib at runtime....Miguel Ángel Arruga Vivas 2020-10-31.dir-locals.el: Automatically set the GEISER-GUILE-LOAD-PATH variable....Maxim Cournoyer 2020-10-19maint: update-guix-package: Prevent accidentally breaking guix pull....Maxim Cournoyer 2020-09-14deduplication: pass store directory to replace-with-link....Caleb Ristvedt 2020-09-14.dir-locals.el: fix call-with-{retrying-}transaction indenting....Caleb Ristvedt 2020-08-26.dir-locals.el: Add indentation rule for 'package/inherit'....Ludovic Courtès 2020-06-25deduplication: Use 'dynamic-wind' when changing permissions of the parent....Ludovic Courtès 2020-06-16channels: 'latest-channel-instance' authenticates Git checkouts....Ludovic Courtès