Restore wide color

This commit is contained in:
Ali 2021-06-24 02:36:38 +04:00
parent b0c78bf1df
commit 30b6b7106b

View File

@ -372,33 +372,88 @@ public enum DrawingContextBltMode {
case Alpha case Alpha
} }
public struct DeviceGraphicsContextSettings { public func getSharedDevideGraphicsContextSettings() -> DeviceGraphicsContextSettings {
public static let shared: 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) UIGraphicsBeginImageContextWithOptions(CGSize(width: 1.0, height: 1.0), true, 1.0)
let refContext = UIGraphicsGetCurrentContext()! let refContext = UIGraphicsGetCurrentContext()!
let bytesPerRow = refContext.bytesPerRow opaqueSettings = OpaqueSettings(context: refContext)
let bitsPerPixel = refContext.bitsPerPixel
let bitsPerComponent = refContext.bitsPerComponent
let opaqueBitmapInfo = refContext.bitmapInfo
let image = UIGraphicsGetImageFromCurrentImageContext()!
let colorSpace = image.cgImage!.colorSpace!
assert(bytesPerRow == 32)
UIGraphicsEndImageContext() UIGraphicsEndImageContext()
UIGraphicsBeginImageContextWithOptions(CGSize(width: 1.0, height: 1.0), false, 1.0) UIGraphicsBeginImageContextWithOptions(CGSize(width: 1.0, height: 1.0), false, 1.0)
let refCtxTransparent = UIGraphicsGetCurrentContext()! let refCtxTransparent = UIGraphicsGetCurrentContext()!
let transparentBitmapInfo = refCtxTransparent.bitmapInfo transparentSettings = TransparentSettings(context: refCtxTransparent)
UIGraphicsEndImageContext() UIGraphicsEndImageContext()
}
return DeviceGraphicsContextSettings( return DeviceGraphicsContextSettings(
rowAlignment: bytesPerRow, rowAlignment: opaqueSettings!.rowAlignment,
bitsPerPixel: bitsPerPixel, bitsPerPixel: opaqueSettings!.bitsPerPixel,
bitsPerComponent: bitsPerComponent, bitsPerComponent: opaqueSettings!.bitsPerComponent,
opaqueBitmapInfo: opaqueBitmapInfo, opaqueBitmapInfo: opaqueSettings!.opaqueBitmapInfo,
transparentBitmapInfo: transparentBitmapInfo, transparentBitmapInfo: transparentSettings!.transparentBitmapInfo,
colorSpace: colorSpace colorSpace: opaqueSettings!.colorSpace
) )
}() }
public struct DeviceGraphicsContextSettings {
public static let shared: DeviceGraphicsContextSettings = getSharedDevideGraphicsContextSettings()
public let rowAlignment: Int public let rowAlignment: Int
public let bitsPerPixel: Int public let bitsPerPixel: Int