From 46e5cc113d45328de32b3655c8410321fd52ce6a Mon Sep 17 00:00:00 2001
From: Mustafa Merza <mustafa.merza95@gmail.com>
Date: Sun, 18 Aug 2024 20:55:59 +0300
Subject: [PATCH] - Added signing pages without taking cells' screenshots: 
 * signature position still needs fixing when the image is scaled inside image
 view 	* screenshots lose the image resolution and scale therefor different
 approach is taken.

- Fixed sign size scale.

- Fixed signing pages that are not displayed or loaded in the pager view.
---
 .../EditViewController.swift                  | 142 ++++++++++++++----
 .../MultiPageScanSession.swift                |   8 +
 2 files changed, 117 insertions(+), 33 deletions(-)

diff --git a/MiniScanner/Modules/EditViewController/EditViewController.swift b/MiniScanner/Modules/EditViewController/EditViewController.swift
index f01309d..32705ea 100644
--- a/MiniScanner/Modules/EditViewController/EditViewController.swift
+++ b/MiniScanner/Modules/EditViewController/EditViewController.swift
@@ -483,39 +483,71 @@ extension EditViewController {
         
         let items = scanSession.scannedItems
         
-        if !banner.signAllDoc {
-            
-            let cell = banner.pagerView.cellForItemat(index: self.banner.pagerView.currentIndex)
-            
-            cell?.prepareCellForScreenshot()
-            
-            let image = cell?.contentView.TakeScreenshot()
-            
-            cell?.restoreCellAfterScreenshot()
-            
-            cell?.selectedStickerView1?.removeFromSuperview()
-            
-            if let image {
+        activityIndicator.startAnimating()
+        
+        Task {
+            if !banner.signAllDoc {
                 
-                let index = banner.pagerView.currentIndex
+                let selectedIndex = banner.pagerView.currentIndex
                 
-                replacePageImage(image: image, at: index)
+                await applySignatureToScannedItem(at: selectedIndex)
                 
-                banner.pagerView.reloadData(at: index)
+                await MainActor.run {
+                    banner.pagerView.reloadData(at: selectedIndex)
+                }
+            } else {
+                
+                for (index, _) in items.enumerated() {
+                    
+                    await applySignatureToScannedItem(at: index)
+                }
+                
+                await MainActor.run {
+                    banner.pagerView.reloadData()
+                }
             }
-        } else {
             
-            for (index, item) in items.enumerated() {
+            await MainActor.run {
+                activityIndicator.stopAnimating()
+            }
+        }
+    }
+    
+    private func applySignatureToScannedItem(at index: Int) async {
+        
+        let cell = await MainActor.run {
+            banner.pagerView.cellForItemat(index: banner.pagerView.currentIndex)
+        }
+        
+        let scannedItem = await MainActor.run {
+            scanSession.scannedItems[index]
+        }
+        
+        var signedImage: UIImage?
+        
+        if let image = scannedItem.newRenderedImage?.retrieveImage(),
+           let signature = scannedItem.signtureImage,
+           let signaturePoint = scannedItem.signaturePosition,
+           let signatureSize = scannedItem.size {
+            
+            let originPoint = CGPoint(x: signaturePoint.x - signatureSize.width / 2, y: signaturePoint.y - signatureSize.height / 2)
+            
+            let signatureViewRect = CGRect(origin: originPoint, size: signatureSize)
+            
+            if let imageViewRect = cell?.imageView?.frame {
+                
+                signedImage = await getSignedImage(image: image,
+                                                   imageViewRect: imageViewRect,
+                                                   signature: signature,
+                                                   signatureViewRect: signatureViewRect)
                 
-                let image = item.screenShot
+                scannedItem.removeSign()
                 
-                if let image {
+                if let signedImage {
                     
-                    replacePageImage(image: image, at: index)
+                    replacePageImage(image: signedImage, at: index)
                 }
             }
-            
-            banner.pagerView.reloadData()
         }
     }
 }
@@ -591,11 +623,7 @@ extension EditViewController {
         let items = scanSession.scannedItems
         
         for item in items {
-            item.signtureImage = UIImage()
-            item.rotate = 0
-            item.signaturePosition = .zero
-            item.screenShot = UIImage()
-            item.size = .zero
+            item.removeSign()
         }
     }
     
@@ -754,11 +782,13 @@ extension EditViewController {
     
     private func addSignatureToAllPages(signatureImage: UIImage) {
         
+        let index = banner.pagerView.currentIndex
+        
         let items = scanSession.scannedItems
         
-        for (index, _) in items.enumerated() {
+        if let initPosition = banner.pagerView.cellForItem(at: index)?.contentView.center {
             
-            if let initPosition = banner.pagerView.cellForItem(at: 0)?.contentView.center {
+            for (index, _) in items.enumerated() {
                 
                 addSignatureToPage(signatureImage: signatureImage, at: index, position: initPosition)
             }
@@ -767,7 +797,11 @@ extension EditViewController {
     
     private func addSignatureToPage(signatureImage: UIImage, at index: Int, position: CGPoint) {
         
-        scanSession.scannedItems[index].addSign(signature: signatureImage, position: position, size: CGSize(width: 125, height: 125), rotate: 0)
+        let scale = 125 / signatureImage.width
+        let newHeight = signatureImage.height * scale
+        let size = CGSize(width: 125, height: newHeight)
+        
+        scanSession.scannedItems[index].addSign(signature: signatureImage, position: position, size: size, rotate: 0)
     }
     
     private func replacePageImage(image: UIImage, at index: Int) {
@@ -844,8 +878,6 @@ extension EditViewController: BannerViewDelegate {
         
         let signaturesCount = scanSession.scannedItems.filter { $0.signtureImage != nil && $0.signtureImage != UIImage() }.count
         
-        print("Heha", signaturesCount)
-        
         if signaturesCount == 0 {
             screenMode = .normal
         }
@@ -1095,3 +1127,47 @@ extension EditViewController {
         }
     }
 }
+
+extension EditViewController {
+    
+    func getSignedImage(image: UIImage,
+                        imageViewRect: CGRect,
+                        signature: UIImage,
+                        signatureViewRect: CGRect) async -> UIImage? {
+        
+        var signedImage: UIImage?
+        
+        let imageRect = CGRect(x: 0, y: 0, width: image.width, height: image.height)
+        
+        let scaledImageRect = AVMakeRect(aspectRatio: image.size,
+                                         insideRect: imageViewRect)
+        
+        let widthScale: CGFloat = imageRect.width / scaledImageRect.width
+        let heightScale: CGFloat = imageRect.height / scaledImageRect.height
+        
+        let newWidth = widthScale * signatureViewRect.width
+        let newHeight = heightScale * signatureViewRect.height
+        
+        let xScale: CGFloat = image.width / imageViewRect.width
+        let yScale: CGFloat = image.height / imageViewRect.height
+        
+        let newX = xScale * signatureViewRect.minX
+        let newY = yScale * signatureViewRect.minY
+        
+        let newSignatureRect = CGRect(x: newX, y: newY, width: newWidth, height: newHeight)
+        
+        let format = UIGraphicsImageRendererFormat()
+        format.scale = 1
+        
+        let renderer = UIGraphicsImageRenderer(size: imageRect.size)
+        
+        signedImage = renderer.image { context in
+            
+            image.draw(in: imageRect)
+            
+            signatureImage.draw(in: newSignatureRect)
+        }
+        
+        return signedImage
+    }
+}
diff --git a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift
index 318bc3b..4f87409 100644
--- a/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift	
+++ b/MiniScanner/Supporting Files/Frameworks/CustomWeScan/MultiPageSession/MultiPageScanSession.swift	
@@ -97,6 +97,14 @@ public class ScannedItem: Codable, Identifiable {
         self.screenShot = self.newRenderedImage?.retrieveImage()
     }
     
+    public func removeSign() {
+        self.signtureImage = nil
+        self.signaturePosition = nil
+        self.size = nil
+        self.rotate = nil
+        self.screenShot = nil
+    }
+    
     public func addScreenShot(screen: UIImage) {
         self.screenShot = screen
     }
-- 
GitLab