ScanEngine.swift 53 lignes · 1311 octets
import UIKit

/// Port of android `scan/ScanEngine.kt`.
/// Coordinates are image pixels with a top-left origin (same as Android).
struct ScanCorners {
    let topLeft: CGPoint
    let topRight: CGPoint
    let bottomRight: CGPoint
    let bottomLeft: CGPoint
}

struct ScanResult {
    let bitmap: UIImage
    let angleDegrees: Float
    let confidence: Float
    let corners: ScanCorners?

    init(
        bitmap: UIImage,
        angleDegrees: Float = 0,
        confidence: Float = 1,
        corners: ScanCorners? = nil
    ) {
        self.bitmap = bitmap
        self.angleDegrees = angleDegrees
        self.confidence = confidence
        self.corners = corners
    }
}

protocol ScanEngine {
    func scan(_ source: UIImage, manualCorners: ScanCorners?) async throws -> ScanResult
}

extension ScanEngine {
    /// Kotlin default parameter `manualCorners = null`.
    func scan(_ source: UIImage) async throws -> ScanResult {
        try await scan(source, manualCorners: nil)
    }
}

/// Port of Kotlin `ScanException`.
struct ScanException: Error, LocalizedError {
    let message: String
    let underlying: Error?

    init(_ message: String, underlying: Error? = nil) {
        self.message = message
        self.underlying = underlying
    }

    var errorDescription: String? { message }
}