From d282181269c07fcdcdc8ee435bc72a0ac62c52a2 Mon Sep 17 00:00:00 2001 From: Flowinho Date: Fri, 13 Mar 2020 11:43:17 +0100 Subject: [PATCH] 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 } }