From 30b6b7106b8a0baf855b5b18e170f13e74d43bcd Mon Sep 17 00:00:00 2001 From: Ali <> Date: Thu, 24 Jun 2021 02:36:38 +0400 Subject: [PATCH] Restore wide color --- submodules/Display/Source/GenerateImage.swift | 93 +++++++++++++++---- 1 file changed, 74 insertions(+), 19 deletions(-) diff --git a/submodules/Display/Source/GenerateImage.swift b/submodules/Display/Source/GenerateImage.swift index 908afc2aeb..0606e987ef 100644 --- a/submodules/Display/Source/GenerateImage.swift +++ b/submodules/Display/Source/GenerateImage.swift @@ -372,33 +372,88 @@ public enum DrawingContextBltMode { case Alpha } -public struct DeviceGraphicsContextSettings { - public static let shared: DeviceGraphicsContextSettings = { +public func getSharedDevideGraphicsContextSettings() -> DeviceGraphicsContextSettings { + struct OpaqueSettings { + let rowAlignment: Int + let bitsPerPixel: Int + let bitsPerComponent: Int + let opaqueBitmapInfo: CGBitmapInfo + let colorSpace: CGColorSpace + + init(context: CGContext) { + self.rowAlignment = context.bytesPerRow + self.bitsPerPixel = context.bitsPerPixel + self.bitsPerComponent = context.bitsPerComponent + self.opaqueBitmapInfo = context.bitmapInfo + if #available(iOS 10.0, *) { + if UIScreen.main.traitCollection.displayGamut == .P3 { + self.colorSpace = CGColorSpace(name: CGColorSpace.displayP3) ?? context.colorSpace! + } else { + self.colorSpace = context.colorSpace! + } + } else { + self.colorSpace = context.colorSpace! + } + assert(self.rowAlignment == 32) + assert(self.bitsPerPixel == 32) + assert(self.bitsPerComponent == 8) + } + } + + struct TransparentSettings { + let transparentBitmapInfo: CGBitmapInfo + + init(context: CGContext) { + self.transparentBitmapInfo = context.bitmapInfo + } + } + + var opaqueSettings: OpaqueSettings? + var transparentSettings: TransparentSettings? + + if #available(iOS 10.0, *) { + let opaqueFormat = UIGraphicsImageRendererFormat() + let transparentFormat = UIGraphicsImageRendererFormat() + if #available(iOS 12.0, *) { + opaqueFormat.preferredRange = .standard + transparentFormat.preferredRange = .standard + } + opaqueFormat.opaque = true + transparentFormat.opaque = false + + let opaqueRenderer = UIGraphicsImageRenderer(bounds: CGRect(origin: CGPoint(), size: CGSize(width: 1.0, height: 1.0)), format: opaqueFormat) + let _ = opaqueRenderer.image(actions: { context in + opaqueSettings = OpaqueSettings(context: context.cgContext) + }) + + let transparentRenderer = UIGraphicsImageRenderer(bounds: CGRect(origin: CGPoint(), size: CGSize(width: 1.0, height: 1.0)), format: transparentFormat) + let _ = transparentRenderer.image(actions: { context in + transparentSettings = TransparentSettings(context: context.cgContext) + }) + } else { UIGraphicsBeginImageContextWithOptions(CGSize(width: 1.0, height: 1.0), true, 1.0) let refContext = UIGraphicsGetCurrentContext()! - let bytesPerRow = refContext.bytesPerRow - let bitsPerPixel = refContext.bitsPerPixel - let bitsPerComponent = refContext.bitsPerComponent - let opaqueBitmapInfo = refContext.bitmapInfo - let image = UIGraphicsGetImageFromCurrentImageContext()! - let colorSpace = image.cgImage!.colorSpace! - assert(bytesPerRow == 32) + opaqueSettings = OpaqueSettings(context: refContext) UIGraphicsEndImageContext() UIGraphicsBeginImageContextWithOptions(CGSize(width: 1.0, height: 1.0), false, 1.0) let refCtxTransparent = UIGraphicsGetCurrentContext()! - let transparentBitmapInfo = refCtxTransparent.bitmapInfo + transparentSettings = TransparentSettings(context: refCtxTransparent) UIGraphicsEndImageContext() + } - return DeviceGraphicsContextSettings( - rowAlignment: bytesPerRow, - bitsPerPixel: bitsPerPixel, - bitsPerComponent: bitsPerComponent, - opaqueBitmapInfo: opaqueBitmapInfo, - transparentBitmapInfo: transparentBitmapInfo, - colorSpace: colorSpace - ) - }() + return DeviceGraphicsContextSettings( + rowAlignment: opaqueSettings!.rowAlignment, + bitsPerPixel: opaqueSettings!.bitsPerPixel, + bitsPerComponent: opaqueSettings!.bitsPerComponent, + opaqueBitmapInfo: opaqueSettings!.opaqueBitmapInfo, + transparentBitmapInfo: transparentSettings!.transparentBitmapInfo, + colorSpace: opaqueSettings!.colorSpace + ) +} + +public struct DeviceGraphicsContextSettings { + public static let shared: DeviceGraphicsContextSettings = getSharedDevideGraphicsContextSettings() public let rowAlignment: Int public let bitsPerPixel: Int