Bläddra i källkod

Merge branch 'master' into animatedimageview-macos

Wei Wang 2 år sedan
förälder
incheckning
26de05a53f
2 ändrade filer med 22 tillägg och 11 borttagningar
  1. 19 0
      Sources/Image/ImageDrawing.swift
  2. 3 11
      Sources/Views/AnimatedImageView.swift

+ 19 - 0
Sources/Image/ImageDrawing.swift

@@ -563,6 +563,25 @@ extension CGImage {
         }
         return decodedImageRef
     }
+    
+    static func create(ref: CGImage) -> CGImage? {
+        guard let space = ref.colorSpace, let provider = ref.dataProvider else {
+            return nil
+        }
+        return CGImage(
+            width: ref.width,
+            height: ref.height,
+            bitsPerComponent: ref.bitsPerComponent,
+            bitsPerPixel: ref.bitsPerPixel,
+            bytesPerRow: ref.bytesPerRow,
+            space: space,
+            bitmapInfo: ref.bitmapInfo,
+            provider: provider,
+            decode: ref.decode,
+            shouldInterpolate: ref.shouldInterpolate,
+            intent: ref.renderingIntent
+        )
+    }
 }
 
 extension KingfisherWrapper where Base: KFCrossPlatformImage {

+ 3 - 11
Sources/Views/AnimatedImageView.swift

@@ -645,17 +645,10 @@ extension AnimatedImageView {
             self.maxFrameCount = count
             self.maxRepeatCount = repeatCount
             self.preloadQueue = preloadQueue
-            
-            GraphicsContext.begin(size: imageSize, scale: imageScale)
         }
         
         deinit {
             resetAnimatedFrames()
-            // Sometimes the Animator instance may deallocate on a non-main thread.
-            // Dispatch it to main thread if needed to avoid potential crashes.
-            CallbackQueue.mainCurrentOrAsync.execute {
-                GraphicsContext.end()
-            }
         }
 
         /// Gets the image frame of a given index.
@@ -734,13 +727,12 @@ extension AnimatedImageView {
                 // To get a workaround, create another image ref and use that to create the final image. This leads to
                 // some performance loss, but there is little we can do.
                 // https://github.com/onevcat/Kingfisher/issues/1844
-                guard let context = GraphicsContext.current(size: imageSize, scale: imageScale, inverting: true, cgImage: cgImage),
-                      let decodedImageRef = cgImage.decoded(on: context, scale: imageScale)
-                else {
+                // https://github.com/onevcat/Kingfisher/pulls/2194
+                guard let unretainedImage = CGImage.create(ref: cgImage) else {
                     return KFCrossPlatformImage(cgImage: cgImage)
                 }
                 
-                return KFCrossPlatformImage(cgImage: decodedImageRef)
+                return KFCrossPlatformImage(cgImage: unretainedImage)
             } else {
                 let image = KFCrossPlatformImage(cgImage: cgImage)
                 if backgroundDecode {