diff --git a/packaging/internal/package_darwin.go b/packaging/internal/package_darwin.go index d7d202db3..08bac6c76 100644 --- a/packaging/internal/package_darwin.go +++ b/packaging/internal/package_darwin.go @@ -19,6 +19,7 @@ import ( "text/template" "github.com/richardwilkes/gcs/v5/model/gurps" + "github.com/richardwilkes/gcs/v5/svg" "github.com/richardwilkes/toolbox/cmdline" "github.com/richardwilkes/toolbox/errs" "github.com/richardwilkes/toolbox/formats/icon" @@ -68,7 +69,7 @@ func writeICNS(dstPath string, img image.Image) (err error) { func writeDocICNS(dir string, base image.Image) error { for i := range gurps.KnownFileTypes { if fi := &gurps.KnownFileTypes[i]; fi.IsGCSData { - overlay, err := CreateImageFromSVG(fi.SVG, 512) + overlay, err := svg.CreateImageFromSVG(fi.SVG, 512) if err != nil { return err } diff --git a/packaging/internal/package_windows.go b/packaging/internal/package_windows.go index e173a1874..1a269c9ec 100644 --- a/packaging/internal/package_windows.go +++ b/packaging/internal/package_windows.go @@ -20,6 +20,7 @@ import ( "time" "github.com/richardwilkes/gcs/v5/model/gurps" + "github.com/richardwilkes/gcs/v5/svg" "github.com/richardwilkes/gcs/v5/ux" "github.com/richardwilkes/toolbox/cmdline" "github.com/richardwilkes/toolbox/errs" @@ -114,7 +115,7 @@ func addWindowsIcon(rs *winres.ResourceSet) error { for i := range gurps.KnownFileTypes { if fi := &gurps.KnownFileTypes[i]; fi.IsGCSData { var overlay image.Image - if overlay, err = CreateImageFromSVG(fi.SVG, 512); err != nil { + if overlay, err = svg.CreateImageFromSVG(fi.SVG, 512); err != nil { return err } var extIcon *winres.Icon diff --git a/packaging/internal/svg_image.go b/packaging/internal/svg_image.go deleted file mode 100644 index 627fac575..000000000 --- a/packaging/internal/svg_image.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 1998-2024 by Richard A. Wilkes. All rights reserved. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, version 2.0. If a copy of the MPL was not distributed with -// this file, You can obtain one at http://mozilla.org/MPL/2.0/. -// -// This Source Code Form is "Incompatible With Secondary Licenses", as -// defined by the Mozilla Public License, version 2.0. - -package internal - -import ( - "bytes" - "fmt" - "image" - - "github.com/richardwilkes/toolbox/errs" - "github.com/richardwilkes/unison" - "github.com/srwiley/oksvg" - "github.com/srwiley/rasterx" -) - -// CreateImageFromSVG turns one of our svg-as-a-path objects into an actual SVG document, then renders it into an image -// at the specified square size. Note that this is not currently GPU accelerated, as I haven't added the necessary bits -// to unison to support scribbling into arbitrary offscreen images yet. -func CreateImageFromSVG(svg *unison.SVG, size int) (image.Image, error) { - var buffer bytes.Buffer - fmt.Fprintf(&buffer, ``, - svg.Size().Width, svg.Size().Height, svg.PathScaledTo(1).ToSVGString(true)) - icon, err := oksvg.ReadIconStream(&buffer) - if err != nil { - return nil, errs.Wrap(err) - } - icon.SetTarget(0, 0, float64(size), float64(size)) - img := image.NewRGBA(image.Rect(0, 0, size, size)) - icon.Draw(rasterx.NewDasher(size, size, rasterx.NewScannerGV(size, size, img, img.Bounds())), 1) - return img, nil -} diff --git a/svg/svg.go b/svg/svg.go index dfde005cb..763f44c50 100644 --- a/svg/svg.go +++ b/svg/svg.go @@ -10,9 +10,15 @@ package svg import ( + "bytes" _ "embed" + "fmt" + "image" + "github.com/richardwilkes/toolbox/errs" "github.com/richardwilkes/unison" + "github.com/srwiley/oksvg" + "github.com/srwiley/rasterx" ) // Pre-defined SVG images used by GCS. @@ -253,3 +259,20 @@ var ( weightData string Weight = unison.MustSVGFromContentString(weightData) ) + +// CreateImageFromSVG turns one of our svg-as-a-path objects into an actual SVG document, then renders it into an image +// at the specified square size. Note that this is not currently GPU accelerated, as I haven't added the necessary bits +// to unison to support scribbling into arbitrary offscreen images yet. +func CreateImageFromSVG(svg *unison.SVG, size int) (image.Image, error) { + var buffer bytes.Buffer + fmt.Fprintf(&buffer, ``, + svg.Size().Width, svg.Size().Height, svg.PathScaledTo(1).ToSVGString(true)) + icon, err := oksvg.ReadIconStream(&buffer) + if err != nil { + return nil, errs.Wrap(err) + } + icon.SetTarget(0, 0, float64(size), float64(size)) + img := image.NewRGBA(image.Rect(0, 0, size, size)) + icon.Draw(rasterx.NewDasher(size, size, rasterx.NewScannerGV(size, size, img, img.Bounds())), 1) + return img, nil +} diff --git a/ux/platform_linux.go b/ux/platform_linux.go index 30252173d..22f88be09 100644 --- a/ux/platform_linux.go +++ b/ux/platform_linux.go @@ -23,6 +23,7 @@ import ( "strings" "github.com/richardwilkes/gcs/v5/model/gurps" + "github.com/richardwilkes/gcs/v5/svg" "github.com/richardwilkes/toolbox/cmdline" "github.com/richardwilkes/toolbox/errs" "github.com/richardwilkes/toolbox/formats/icon" @@ -99,7 +100,7 @@ func installDesktopIcons() error { for i := range gurps.KnownFileTypes { if fi := &gurps.KnownFileTypes[i]; fi.IsGCSData { var overlay image.Image - overlay, err = CreateImageFromSVG(fi.SVG, 128) + overlay, err = svg.CreateImageFromSVG(fi.SVG, 128) if err != nil { return err } diff --git a/ux/platform_windows.go b/ux/platform_windows.go index fb5bd5ea8..72c0bfbdb 100644 --- a/ux/platform_windows.go +++ b/ux/platform_windows.go @@ -19,6 +19,7 @@ import ( "syscall" "github.com/richardwilkes/gcs/v5/model/gurps" + "github.com/richardwilkes/gcs/v5/svg" "github.com/richardwilkes/toolbox/cmdline" "github.com/richardwilkes/toolbox/errs" "github.com/richardwilkes/toolbox/formats/icon" @@ -67,7 +68,7 @@ func configureRegistry() error { if fi := &gurps.KnownFileTypes[i]; fi.IsGCSData { // Create the doc icon var overlay image.Image - if overlay, err = CreateImageFromSVG(fi.SVG, 128); err != nil { + if overlay, err = svg.CreateImageFromSVG(fi.SVG, 128); err != nil { return err } docPath := filepath.Join(appDataDir, fi.Extensions[0][1:]+".ico")