diff --git a/Sources/SVGConverterCore/Internal/PixelScaleWindow.swift b/Sources/SVGConverterCore/Internal/PixelScaleWindow.swift new file mode 100644 index 0000000..149e368 --- /dev/null +++ b/Sources/SVGConverterCore/Internal/PixelScaleWindow.swift @@ -0,0 +1,12 @@ +// +// PixelScaleWindow.swift +// +// +// Created by Alexandre Podlewski on 09/04/2022. +// + +import AppKit + +class PixelScaleWindow: NSWindow { + override var backingScaleFactor: CGFloat { return 1 } +} diff --git a/Sources/SVGConverterCore/Internal/WebViewSVGRenderer.swift b/Sources/SVGConverterCore/Internal/WebViewSVGRenderer.swift index 8aff667..eaac99a 100644 --- a/Sources/SVGConverterCore/Internal/WebViewSVGRenderer.swift +++ b/Sources/SVGConverterCore/Internal/WebViewSVGRenderer.swift @@ -79,12 +79,8 @@ final class WebViewSVGRenderer: WKWebView, WKNavigationDelegate { } isRendering = true self.completion = completion - let webViewScale = layer?.contentsScale ?? 1 self.inPixelSize = size - self.inPointSize = NSSize( - width: size.width / webViewScale, - height: size.height / webViewScale - ) + self.inPointSize = self.convertFromBacking(size) do { let resizedSVGData = try resizeSVG(svgData, to: self.inPointSize) guard let svgString = String(data: resizedSVGData, encoding: .utf8) else { @@ -119,8 +115,6 @@ final class WebViewSVGRenderer: WKWebView, WKNavigationDelegate { ) ) - webView.layer?.contentsScale = 1.0 - webView.layer?.rasterizationScale = 0.1 webView.frame.size = config.rect.size webView.takeSnapshot(with: config) { [weak self] image, error in guard let self = self else { return } diff --git a/Sources/SVGConverterCore/SVGRenderer.swift b/Sources/SVGConverterCore/SVGRenderer.swift index effe503..b17d9bb 100644 --- a/Sources/SVGConverterCore/SVGRenderer.swift +++ b/Sources/SVGConverterCore/SVGRenderer.swift @@ -6,6 +6,7 @@ // import Foundation +import AppKit @available(macOS 10.15, *) @MainActor @@ -51,6 +52,7 @@ public final class SVGRenderer { // MARK: - Private Properties + private let rendererWindow: NSWindow private let renderer: WebViewSVGRenderer // MARK: - Life cycle @@ -70,6 +72,14 @@ public final class SVGRenderer { } self.renderer = WebViewSVGRenderer(options: options) + // ???: (Alexandre Podlewski) 09/04/2022 Without forcing the backing scale factor it is not possible to control + // the output of screeshoting the web view. Without window issues could also occurred when changing of + // focused screen with a different scale factor. An issue occurred when focused on a x1 screen, with + // the webview outside of a window it had a default backing scale factor of x2 but the snapshot was taken + // as x1, this causing invalid size generated images. + self.rendererWindow = PixelScaleWindow() + self.rendererWindow.contentView = self.renderer + self.warningHandler = warningHandler self.renderer.warningHandler = warningHandler }