From d282181269c07fcdcdc8ee435bc72a0ac62c52a2 Mon Sep 17 00:00:00 2001 From: Flowinho Date: Fri, 13 Mar 2020 11:43:17 +0100 Subject: [PATCH 1/3] Add isBright function to Shared Logic --- Shared/Extensions/IconImage.swift | 46 ++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/Shared/Extensions/IconImage.swift b/Shared/Extensions/IconImage.swift index 8d0a6c8b2..21ad8f851 100644 --- a/Shared/Extensions/IconImage.swift +++ b/Shared/Extensions/IconImage.swift @@ -20,6 +20,10 @@ final class IconImage { return image.isDark() }() + lazy var isBright: Bool = { + return image.isBright() + }() + let image: RSImage init(_ image: RSImage) { @@ -33,22 +37,48 @@ final class IconImage { func isDark() -> Bool { return self.cgImage(forProposedRect: nil, context: nil, hints: nil)?.isDark() ?? false } + + func isBright() -> Bool { + return self.cgImage(forProposedRect: nil, context: nil, hints: nil)?.Bright() ?? false + } } #else extension UIImage { func isDark() -> Bool { return self.cgImage?.isDark() ?? false } + + func isBright() -> Bool { + return self.cgImage?.isBright() ?? false + } } #endif +fileprivate enum ImageLuminanceType { + case regular, bright, dark +} extension CGImage { + func isBright() -> Bool { + guard let imageData = self.dataProvider?.data, let luminanceType = getLuminanceType(from: imageData) else { + return false + } + return luminanceType == .bright + } + func isDark() -> Bool { - guard let imageData = self.dataProvider?.data else { return false } - guard let ptr = CFDataGetBytePtr(imageData) else { return false } - - let length = CFDataGetLength(imageData) + guard let imageData = self.dataProvider?.data, let luminanceType = getLuminanceType(from: imageData) else { + return false + } + return luminanceType == .dark + } + + fileprivate func getLuminanceType(from data: CFData) -> ImageLuminanceType? { + guard let ptr = CFDataGetBytePtr(data) else { + return nil + } + + let length = CFDataGetLength(data) var pixelCount = 0 var totalLuminance = 0.0 @@ -68,10 +98,12 @@ extension CGImage { } let avgLuminance = totalLuminance / Double(pixelCount) - if totalLuminance == 0 { - return true + if totalLuminance == 0 || avgLuminance < 40 { + return .dark + } else if avgLuminance > 70 { + return .bright } else { - return avgLuminance < 40 + return .regular } } From ee86b1a14854574146da5be2d19e505b34dc1916 Mon Sep 17 00:00:00 2001 From: Flowinho Date: Fri, 13 Mar 2020 11:54:31 +0100 Subject: [PATCH 2/3] Apply background if feed-icon is bright --- iOS/IconView.swift | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/iOS/IconView.swift b/iOS/IconView.swift index 4b988973b..5a521844c 100644 --- a/iOS/IconView.swift +++ b/iOS/IconView.swift @@ -16,16 +16,11 @@ final class IconView: UIView { imageView.image = iconImage?.image if self.traitCollection.userInterfaceStyle == .dark { - if self.iconImage?.isDark ?? false { - self.isDisconcernable = false - self.setNeedsLayout() - } else { - self.isDisconcernable = true - self.setNeedsLayout() - } + self.isDisconcernable = !(self.iconImage?.isDark ?? true) } else { - self.setNeedsLayout() + self.isDisconcernable = !(self.iconImage?.isBright ?? true) } + self.setNeedsLayout() } } } From 130691db3415d451af0ef82e19ca2e465b69115a Mon Sep 17 00:00:00 2001 From: Flowinho Date: Fri, 13 Mar 2020 14:21:38 +0100 Subject: [PATCH 3/3] Revert to old logic --- iOS/IconView.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/iOS/IconView.swift b/iOS/IconView.swift index 5a521844c..7ce9faf3f 100644 --- a/iOS/IconView.swift +++ b/iOS/IconView.swift @@ -16,9 +16,21 @@ final class IconView: UIView { imageView.image = iconImage?.image if self.traitCollection.userInterfaceStyle == .dark { - self.isDisconcernable = !(self.iconImage?.isDark ?? true) + if self.iconImage?.isDark ?? false { + self.isDisconcernable = false + self.setNeedsLayout() + } else { + self.isDisconcernable = true + self.setNeedsLayout() + } } else { - self.isDisconcernable = !(self.iconImage?.isBright ?? true) + if self.iconImage?.isBright ?? false { + self.isDisconcernable = false + self.setNeedsLayout() + } else { + self.isDisconcernable = true + self.setNeedsLayout() + } } self.setNeedsLayout() }