From ef7d4bef8ee8ebf7ce6187ebefde384924f307ab Mon Sep 17 00:00:00 2001 From: Maksim Totmin Date: Wed, 17 Jun 2026 20:19:56 +0700 Subject: [PATCH] Improve icon rendering: fix scaling and centering for emoji, FontAwesome, and SVG icons --- cbdt.go | 5 ++++- fontawesome.go | 9 ++++++--- icons.go | 12 ++++++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/cbdt.go b/cbdt.go index 18bcc56..6e3d004 100644 --- a/cbdt.go +++ b/cbdt.go @@ -175,9 +175,12 @@ func renderCBDTGlyph(r rune, targetSize int, scale float64) (image.Image, bool) raw := emojiCBDT.imgs[idx] displaySize := int(float64(targetSize) * scale) - if displaySize < 1 { + if displaySize > targetSize { displaySize = targetSize } + if displaySize < 1 { + displaySize = 1 + } scaled := raw if raw.Bounds().Dx() != displaySize || raw.Bounds().Dy() != displaySize { diff --git a/fontawesome.go b/fontawesome.go index 2c090ca..d8b4fbd 100644 --- a/fontawesome.go +++ b/fontawesome.go @@ -115,11 +115,14 @@ func renderFAGlyph(style faStyle, name string, size int, scale float64) (image.I rgba := image.NewRGBA(image.Rect(0, 0, size, size)) - offX := (size - int(fontSize)) / 2 + adv := font.MeasureString(face, string(cp)).Ceil() + offX := (size - adv) / 2 if offX < 0 { - offX = size / 8 + offX = 0 } - baselineY := size * 7 / 10 + + metrics := face.Metrics() + baselineY := (size + metrics.Ascent.Ceil() - metrics.Descent.Ceil()) / 2 d := font.Drawer{ Dst: rgba, diff --git a/icons.go b/icons.go index 4a4e9c7..a7c869d 100644 --- a/icons.go +++ b/icons.go @@ -153,12 +153,12 @@ func svgToPNG(svgPath string, targetSize int, scale float64) (image.Image, error scale = 0.55 } - renderSize := targetSize - if scale < 1 { - renderSize = int(float64(targetSize) * scale) - if renderSize < 1 { - renderSize = 1 - } + renderSize := int(float64(targetSize) * scale) + if renderSize > targetSize { + renderSize = targetSize + } + if renderSize < 1 { + renderSize = 1 } cmd := exec.Command("rsvg-convert",