import CoreImage import CoreGraphics // MARK: - BORDER DETECTOR class BorderDetector { enum BorderColor { case black, white, gold, other } static func detect(image: CGImage, orientation: CGImagePropertyOrientation = .up) -> BorderColor { let context = SharedEngineResources.context let ciImage = CIImage(cgImage: image).oriented(orientation) let width = ciImage.extent.width let height = ciImage.extent.height // Crop a small strip from the left edge let cropRect = CGRect(x: CGFloat(width) * 0.02, y: CGFloat(height) * 0.4, width: CGFloat(width) * 0.05, height: CGFloat(height) * 0.2) let vector = CIVector(cgRect: cropRect) let filter = CIFilter(name: "CIAreaAverage", parameters: [kCIInputImageKey: ciImage, kCIInputExtentKey: vector]) guard let output = filter?.outputImage else { return .other } var bitmap = [UInt8](repeating: 0, count: 4) context.render(output, toBitmap: &bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: .RGBA8, colorSpace: nil) let r = Int(bitmap[0]) let g = Int(bitmap[1]) let b = Int(bitmap[2]) let brightness = (r + g + b) / 3 // Gold/Yellow detection (World Champ Decks): High Red/Green, Low Blue if r > 140 && g > 120 && b < 100 && r > b + 40 { return .gold } if brightness < 60 { return .black } if brightness > 180 { return .white } return .other } }