ソースを参照

Use image renderer instead of context for drawing

onevcat 4 年 前
コミット
a728fcaeea
1 ファイル変更34 行追加5 行削除
  1. 34 5
      Sources/Image/ImageDrawing.swift

+ 34 - 5
Sources/Image/ImageDrawing.swift

@@ -56,7 +56,7 @@ extension KingfisherWrapper where Base: KFCrossPlatformImage {
         }
         
         let rect = CGRect(origin: .zero, size: size)
-        return draw(to: rect.size) { _ in
+        return draw(to: rect.size, inverting: false) { _ in
             if let backgroundColor = backgroundColor {
                 backgroundColor.setFill()
                 UIRectFill(rect)
@@ -123,7 +123,7 @@ extension KingfisherWrapper where Base: KFCrossPlatformImage {
         }
         
         let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: size)
-        return draw(to: size) { _ in
+        return draw(to: size, inverting: false) { _ in
             #if os(macOS)
             if let backgroundColor = backgroundColor {
                 let rectPath = NSBezierPath(rect: rect)
@@ -187,7 +187,7 @@ extension KingfisherWrapper where Base: KFCrossPlatformImage {
         }
         
         let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: size)
-        return draw(to: size) { _ in
+        return draw(to: size, inverting: false) { _ in
             #if os(macOS)
             base.draw(in: rect, from: .zero, operation: .copy, fraction: 1.0)
             #else
@@ -348,7 +348,7 @@ extension KingfisherWrapper where Base: KFCrossPlatformImage {
         }
         
         let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
-        return draw(to: rect.size) { context in
+        return draw(to: rect.size, inverting: false) { context in
             #if os(macOS)
             base.draw(in: rect)
             if fraction > 0 {
@@ -492,12 +492,13 @@ extension KingfisherWrapper where Base: KFCrossPlatformImage {
 extension KingfisherWrapper where Base: KFCrossPlatformImage {
     func draw(
         to size: CGSize,
-        inverting: Bool = false,
+        inverting: Bool,
         scale: CGFloat? = nil,
         refImage: KFCrossPlatformImage? = nil,
         draw: (CGContext) -> Bool // Whether use the refImage (`true`) or ignore image orientation (`false`)
     ) -> KFCrossPlatformImage
     {
+        #if os(macOS)
         let targetScale = scale ?? self.scale
         GraphicsContext.begin(size: size, scale: targetScale)
         guard let context = GraphicsContext.current(size: size, scale: targetScale, inverting: inverting, cgImage: cgImage) else {
@@ -509,8 +510,36 @@ extension KingfisherWrapper where Base: KFCrossPlatformImage {
         guard let cgImage = context.makeImage() else {
             return base
         }
+        print(base.imageOrientation.rawValue)
         let ref = useRefImage ? (refImage ?? base) : nil
         return KingfisherWrapper.image(cgImage: cgImage, scale: targetScale, refImage: ref)
+        #else
+        
+        let format = UIGraphicsImageRendererFormat.default()
+        format.scale = scale ?? self.scale
+        let renderer = UIGraphicsImageRenderer(size: size, format: format)
+        
+        var useRefImage: Bool = false
+        let image = renderer.image { rendererContext in
+            
+            let context = rendererContext.cgContext
+            if inverting { // If drawing a CGImage, we need to make context flipped.
+                context.scaleBy(x: 1.0, y: -1.0)
+                context.translateBy(x: 0, y: -size.height)
+            }
+            
+            useRefImage = draw(context)
+        }
+        if useRefImage {
+            guard let cgImage = image.cgImage else {
+                return base
+            }
+            let ref = refImage ?? base
+            return KingfisherWrapper.image(cgImage: cgImage, scale: format.scale, refImage: ref)
+        } else {
+            return image
+        }
+        #endif
     }
     
     #if os(macOS)