From 9f126bfb8ff42b3bc8ce16f5a1373a3c8ce91964 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 29 Sep 2019 19:40:12 -0500 Subject: [PATCH] Add a background if the image is too dark and we are in dark mode. --- NetNewsWire.xcodeproj/project.pbxproj | 4 ++ .../Cell/MasterFeedTableViewCell.swift | 15 ++++++ iOS/UIKit Extensions/UIImage-Extensions.swift | 47 +++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 iOS/UIKit Extensions/UIImage-Extensions.swift diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 8bdb83bab..f3789f111 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -216,6 +216,7 @@ 51FA73AA2332C2FD0090D516 /* ArticleExtractorConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FA73A92332C2FD0090D516 /* ArticleExtractorConfig.swift */; }; 51FA73AB2332C2FD0090D516 /* ArticleExtractorConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FA73A92332C2FD0090D516 /* ArticleExtractorConfig.swift */; }; 51FA73B72332D5F70090D516 /* ArticleExtractorButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FA73B62332D5F70090D516 /* ArticleExtractorButton.swift */; }; + 51FD40C72341555A00880194 /* UIImage-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51FD40BD2341555600880194 /* UIImage-Extensions.swift */; }; 55E15BCB229D65A900D6602A /* AccountsReaderAPI.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55E15BC1229D65A900D6602A /* AccountsReaderAPI.xib */; }; 55E15BCC229D65A900D6602A /* AccountsReaderAPIWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55E15BCA229D65A900D6602A /* AccountsReaderAPIWindowController.swift */; }; 5F323809231DF9F000706F6B /* NNWTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F323808231DF9F000706F6B /* NNWTableViewCell.swift */; }; @@ -895,6 +896,7 @@ 51FA73A62332BE880090D516 /* ExtractedArticle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtractedArticle.swift; sourceTree = ""; }; 51FA73A92332C2FD0090D516 /* ArticleExtractorConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleExtractorConfig.swift; sourceTree = ""; }; 51FA73B62332D5F70090D516 /* ArticleExtractorButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleExtractorButton.swift; sourceTree = ""; }; + 51FD40BD2341555600880194 /* UIImage-Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage-Extensions.swift"; sourceTree = ""; }; 557EE1A522B6F4E1004206FA /* SettingsReaderAPIAccountView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsReaderAPIAccountView.swift; sourceTree = ""; }; 55E15BC1229D65A900D6602A /* AccountsReaderAPI.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AccountsReaderAPI.xib; sourceTree = ""; }; 55E15BCA229D65A900D6602A /* AccountsReaderAPIWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsReaderAPIWindowController.swift; sourceTree = ""; }; @@ -1332,6 +1334,7 @@ 51934CC1230F5963006127BE /* ThemedNavigationController.swift */, 51F85BF82274AA7B00C787DC /* UIBarButtonItem-Extensions.swift */, 51F85BF622749FA100C787DC /* UIFont-Extensions.swift */, + 51FD40BD2341555600880194 /* UIImage-Extensions.swift */, 512E092B2268B25500BDCFDD /* UISplitViewController-Extensions.swift */, 51C4524E226506F400C03939 /* UIStoryboard-Extensions.swift */, ); @@ -2807,6 +2810,7 @@ 51C452852265093600C03939 /* FlattenedAccountFolderPickerData.swift in Sources */, 51C4526B226508F600C03939 /* MasterFeedViewController.swift in Sources */, 5126EE97226CB48A00C22AFC /* SceneCoordinator.swift in Sources */, + 51FD40C72341555A00880194 /* UIImage-Extensions.swift in Sources */, 5132293B23305D4C0033D4ED /* SettingsAboutView.swift in Sources */, 84CAFCB022BC8C35007694F0 /* FetchRequestOperation.swift in Sources */, 51EF0F77227716200050506E /* FaviconGenerator.swift in Sources */, diff --git a/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift b/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift index 1322c8b72..25d481c2d 100644 --- a/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift +++ b/iOS/MasterFeed/Cell/MasterFeedTableViewCell.swift @@ -34,6 +34,21 @@ class MasterFeedTableViewCell : NNWTableViewCell { var faviconImage: UIImage? { didSet { faviconImageView.image = faviconImage + + if self.traitCollection.userInterfaceStyle == .dark { + DispatchQueue.global(qos: .background).async { + if self.faviconImage?.isDark() ?? false { + DispatchQueue.main.async { + self.faviconImageView.backgroundColor = AppAssets.avatarBackgroundColor + } + } else { + DispatchQueue.main.async { + self.faviconImageView.backgroundColor = nil + } + } + } + } + } } diff --git a/iOS/UIKit Extensions/UIImage-Extensions.swift b/iOS/UIKit Extensions/UIImage-Extensions.swift new file mode 100644 index 000000000..a64d3965d --- /dev/null +++ b/iOS/UIKit Extensions/UIImage-Extensions.swift @@ -0,0 +1,47 @@ +// +// UIImage-Extensions.swift +// NetNewsWire +// +// Created by Maurice Parker on 9/29/19. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import UIKit + +extension CGImage { + + func isDark() -> Bool { + guard let imageData = self.dataProvider?.data else { return false } + guard let ptr = CFDataGetBytePtr(imageData) else { return false } + + let length = CFDataGetLength(imageData) + var visiblePixels = 0 + var darkPixels = 0 + + for i in stride(from: 0, to: length, by: 4) { + + let r = ptr[i] + let g = ptr[i + 1] + let b = ptr[i + 2] + let a = ptr[i + 3] + let luminance = (0.299 * Double(r) + 0.587 * Double(g) + 0.114 * Double(b)) + + if Double(a) > 0.0 { + visiblePixels += 1 + if luminance < 50 { + darkPixels += 1 + } + } + + } + + return Double(darkPixels) / Double(visiblePixels) > 0.4 + } + +} + +extension UIImage { + func isDark() -> Bool { + return self.cgImage?.isDark() ?? false + } +}