// // KMBackgroundModel.swift // PDF Master // // Created by tangchao on 2022/12/23. // import Cocoa @objc enum KMBackgroundType: Int { case color = 0 case file = 1 } @objcMembers class KMBackgroundModel: KMWatermarkAdjectiveBaseModel { var type: KMBackgroundType = .color var color: NSColor? = NSColor.red var imagePath: String = "" var rotation: Int = 0 var opacity: CGFloat = 1.0 var scale: CGFloat = 1.0 var verticalMode: Int = 1 var verticalSpace: CGFloat = 0.0 var horizontalMode: Int = 1 var horizontalSpace: CGFloat = 0.0 var pagesString: String = "" var backgroundID: String = "" var image: NSImage! override func copy() -> Any { let model: KMBackgroundModel = KMBackgroundModel() model.type = self.type model.color = self.color model.imagePath = self.imagePath model.rotation = self.rotation model.opacity = self.opacity model.scale = self.scale model.verticalMode = self.verticalMode model.verticalSpace = self.verticalSpace model.horizontalMode = self.horizontalMode model.horizontalSpace = self.horizontalSpace model.pageRangeType = self.pageRangeType model.pagesString = self.pagesString model.backgroundID = self.backgroundID model.image = self.image return model } func drawImage(rect: CGRect) -> NSImage { var drawRect: CGRect = NSMakeRect(0, 0, 128, 160) let image = NSImage(size: drawRect.size) image.lockFocus() NSGraphicsContext.current?.imageInterpolation = .high NSGraphicsContext.saveGraphicsState() NSColor.clear.set() drawRect.fill() NSGraphicsContext.restoreGraphicsState() let context: CGContext = NSGraphicsContext.current!.cgContext let imageSize: NSSize = NSMakeSize(drawRect.size.width, drawRect.size.height) if (context != nil) { NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false) } NSGraphicsContext.saveGraphicsState() if (self.type == .color) { var size = drawRect.size size.width *= self.scale size.height *= self.scale let radian = CGFloat(self.rotation) * (Double.pi/180.0) let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian) var rect = NSMakeRect(0, 0, size.width, size.height).applying(t) if (self.verticalMode == 0) { rect.origin.y = drawRect.size.height-rect.size.height } else if (self.verticalMode == 1) { rect.origin.y = (drawRect.size.height-rect.size.height) * 0.5 } else if (self.verticalMode == 2) { rect.origin.y = 0 } if (self.horizontalMode == 0) { rect.origin.x = 0 } else if (self.horizontalMode == 1) { rect.origin.x = (drawRect.size.width-rect.size.width) * 0.5 } else if (self.horizontalMode == 2) { rect.origin.x = drawRect.size.width-rect.size.width } rect.origin.x += self.horizontalSpace rect.origin.y += self.verticalSpace let contextCenter = NSPoint(x: rect.midX, y: rect.midY) context.translateBy(x: contextCenter.x, y: contextCenter.y) context.rotate(by: radian) context.translateBy(x: -contextCenter.x, y: -contextCenter.y) var red: CGFloat = 0 var green: CGFloat = 0 var blue: CGFloat = 0 var alpha: CGFloat = 0 self.color!.usingColorSpaceName(NSColorSpaceName.calibratedRGB)?.getRed(&red, green: &green, blue: &blue, alpha: &alpha) context.setFillColor(red: red, green: green, blue: blue, alpha: self.opacity); context.fill(NSMakeRect(rect.origin.x+(rect.size.width-size.width)/2.0, rect.origin.y+(rect.size.height-size.height)/2.0, size.width, size.height)); } else if (self.type == .file) { let image = self.image var size: NSSize = image!.size size.width *= self.scale size.height *= self.scale var wScale = size.width / drawRect.size.width var hScale = size.height / drawRect.size.height var scale = max(wScale, hScale) if (scale > 1) { size.width /= scale size.height /= scale } let radian = CGFloat(self.rotation) * (Double.pi/180.0) let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian) var rect = NSMakeRect(0, 0, size.width, size.height).applying(t) if (self.verticalMode == 0) { rect.origin.y = drawRect.size.height-rect.size.height } else if (self.verticalMode == 1) { rect.origin.y = (drawRect.size.height-rect.size.height) * 0.5 } else if (self.verticalMode == 2) { rect.origin.y = 0 } if (self.horizontalMode == 0) { rect.origin.x = 0 } else if (self.horizontalMode == 1) { rect.origin.x = (drawRect.size.width-rect.size.width) * 0.5 } else if (self.horizontalMode == 2) { rect.origin.x = drawRect.size.width-rect.size.width } rect.origin.x += self.horizontalSpace rect.origin.y += self.verticalSpace let contextCenter = NSPoint(x: rect.midX, y: rect.midY) context.translateBy(x: contextCenter.x, y: contextCenter.y) context.rotate(by: radian) context.translateBy(x: -contextCenter.x, y: -contextCenter.y) let finalRect = NSMakeRect(rect.origin.x+(rect.size.width-size.width)/2.0, rect.origin.y+(rect.size.height-size.height)/2.0, size.width, size.height) image?.draw(in: NSMakeRect(rect.origin.x+(rect.size.width-size.width)/2.0, rect.origin.y+(rect.size.height-size.height)/2.0, size.width, size.height), from: NSZeroRect, operation: .sourceOver, fraction: self.opacity) } NSGraphicsContext.restoreGraphicsState() NSGraphicsContext.current?.imageInterpolation = .default image.unlockFocus() return image } } class KMBackgroundTemplateModel: KMBackgroundModel { var isSelected: Bool = false }