From cab0cb8e5a2ffd55ea4839430405b8f78828e438 Mon Sep 17 00:00:00 2001 From: DB p Date: Thu, 20 Mar 2025 14:40:59 +0900 Subject: [PATCH] Add SVG favicon support --- .../ChromiumBookmarkLoader.cs | 57 ++++++++++++++----- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs index acf863bf0..12b00375a 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/ChromiumBookmarkLoader.cs @@ -161,13 +161,13 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader using var cmd = connection.CreateCommand(); cmd.CommandText = @" - SELECT f.id, b.image_data - FROM favicons f - JOIN favicon_bitmaps b ON f.id = b.icon_id - JOIN icon_mapping m ON f.id = m.icon_id - WHERE m.page_url LIKE @url - ORDER BY b.width DESC - LIMIT 1"; + SELECT f.id, b.image_data + FROM favicons f + JOIN favicon_bitmaps b ON f.id = b.icon_id + JOIN icon_mapping m ON f.id = m.icon_id + WHERE m.page_url LIKE @url + ORDER BY b.width DESC + LIMIT 1"; cmd.Parameters.AddWithValue("@url", $"%{domain}%"); @@ -212,14 +212,29 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader { try { - using var ms = new MemoryStream(imageData); - using var bitmap = SKBitmap.Decode(ms); - if (bitmap != null) + // SVG 파일 시그니처 확인 (SVG XML 헤더 또는 특수 마커 검사) + bool isSvg = IsSvgData(imageData); + + if (isSvg) { - using var image = SKImage.FromBitmap(bitmap); - using var data = image.Encode(SKEncodedImageFormat.Png, 100); - using var fs = File.OpenWrite(outputPath); - data.SaveTo(fs); + // SVG 데이터는 있는 그대로 저장 (.svg 확장자 사용) + string svgOutputPath = Path.ChangeExtension(outputPath, ".svg"); + File.WriteAllBytes(svgOutputPath, imageData); + // 원래 경로 대신 SVG 경로를 반환하도록 outputPath 변수를 업데이트 + File.Copy(svgOutputPath, outputPath, true); + } + else + { + // 기존 비트맵 처리 코드 + using var ms = new MemoryStream(imageData); + using var bitmap = SKBitmap.Decode(ms); + if (bitmap != null) + { + using var image = SKImage.FromBitmap(bitmap); + using var data = image.Encode(SKEncodedImageFormat.Png, 100); + using var fs = File.OpenWrite(outputPath); + data.SaveTo(fs); + } } } catch (Exception ex) @@ -227,4 +242,18 @@ public abstract class ChromiumBookmarkLoader : IBookmarkLoader Log.Exception($"Failed to save image: {outputPath}", ex); } } + + private bool IsSvgData(byte[] data) + { + if (data == null || data.Length < 5) + return false; + + // SVG 파일 시그니처 확인 + // ASCII로 시작하는 SVG XML 헤더 확인 + string header = System.Text.Encoding.ASCII.GetString(data, 0, Math.Min(data.Length, 200)).ToLower(); + + return header.Contains("