diff --git a/Shared/Article Rendering/ArticleRenderer.swift b/Shared/Article Rendering/ArticleRenderer.swift index 833228120..d66aac5a2 100644 --- a/Shared/Article Rendering/ArticleRenderer.swift +++ b/Shared/Article Rendering/ArticleRenderer.swift @@ -159,6 +159,48 @@ private extension ArticleRenderer { return permalink != preferredLink // Make date a link if it’s a different link from the title’s link } + static let avatarDimension = 48 + static let doubledDimension = CGFloat(avatarDimension * 2) + + static func imageScaledForDisplay(image: RSImage) -> RSImage { + // Aspect fit. + #if os(macOS) + + if image.size.height <= doubledDimension && image.size.width <= doubledDimension { + return image + } + + let scaledImage = NSImage.init(size: NSSize(width: doubledDimension, height: doubledDimension)) + scaledImage.lockFocus() + + var imageRectWidth = doubledDimension + var imageRectHeight = doubledDimension + var imageRectOriginX = CGFloat(0.0) + var imageRectOriginY = CGFloat(0.0) + + if image.size.width > image.size.height { + let factor: CGFloat = doubledDimension / image.size.width + imageRectHeight = image.size.height * factor + imageRectOriginY = (doubledDimension - imageRectHeight) / 2.0 + } + else if image.size.height > image.size.width { + let factor: CGFloat = doubledDimension / image.size.height + imageRectWidth = image.size.width * factor + imageRectOriginX = (doubledDimension - imageRectWidth) / 2.0 + } + + image.draw(in: NSRect(x: imageRectOriginX, y: imageRectOriginY, width: imageRectWidth, height: imageRectHeight)) + scaledImage.unlockFocus() + return scaledImage + + #else //iOS + + // TODO: https://github.com/brentsimmons/NetNewsWire/issues/1021 + + return image + #endif + } + func faviconImgTag(forFeed feed: Feed) -> String? { if let cachedImgTag = ArticleRenderer.faviconImgTagCache[feed] { @@ -166,7 +208,8 @@ private extension ArticleRenderer { } if let favicon = appDelegate.faviconDownloader.favicon(for: feed) { - if let s = base64String(forImage: favicon) { + let scaledImage = ArticleRenderer.imageScaledForDisplay(image: favicon) + if let s = base64String(forImage: scaledImage) { var dimension = min(favicon.size.height, CGFloat(ArticleRenderer.avatarDimension)) // Assuming square images. dimension = max(dimension, 16) // Some favicons say they’re < 16. Force them larger. if dimension >= CGFloat(ArticleRenderer.avatarDimension) * 0.8 { //Close enough to scale up. @@ -195,7 +238,8 @@ private extension ArticleRenderer { } if let icon = appDelegate.feedIconDownloader.icon(for: feed) { - if let s = base64String(forImage: icon) { + let scaledImage = ArticleRenderer.imageScaledForDisplay(image: icon) + if let s = base64String(forImage: scaledImage) { #if os(macOS) let imgTag = "" #else @@ -228,7 +272,6 @@ private extension ArticleRenderer { return nil } - static let avatarDimension = 48 struct Avatar { let imageURL: String