KMBackgroundModel.swift 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. //
  2. // KMBackgroundModel.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2022/12/23.
  6. //
  7. import Cocoa
  8. @objcMembers class KMBackgroundModel: NSObject {
  9. var type: CPDFBackgroundType = .color
  10. var color: NSColor?
  11. var imagePath: String?
  12. var rotation: CGFloat = 0.0
  13. var opacity: CGFloat = 1.0
  14. var isScale: Bool = false
  15. var scale: CGFloat = 1.0
  16. var verticalMode: Int = 1
  17. var verticalSpace: CGFloat = 0.0
  18. var horizontalMode: Int = 1
  19. var horizontalSpace: CGFloat = 0.0
  20. var backgroundID: String = ""
  21. var name: String = ""
  22. override init() {
  23. super.init()
  24. self.type = .color
  25. self.color = NSColor(red: 247/255, green: 247/255, blue: 247/255, alpha: 1)
  26. self.imagePath = nil
  27. self.rotation = 0
  28. self.opacity = 1
  29. self.isScale = false
  30. self.scale = 1
  31. self.verticalMode = 1
  32. self.horizontalMode = 1
  33. self.verticalSpace = 0
  34. self.horizontalSpace = 0
  35. self.backgroundID = NSString.tagString()
  36. self.name = "Background0"
  37. }
  38. func modelPreviewImage() -> NSImage? {
  39. if let resultPath = KMBackgroundManager.defaultManager.kBackgroundImageFolder?.stringByAppendingPathComponent((self.backgroundID + ".png")) {
  40. if let image = NSImage(contentsOfFile: resultPath) {
  41. return image
  42. }
  43. }
  44. return nil
  45. }
  46. func image() -> NSImage? {
  47. if let imagePath = self.imagePath {
  48. if let image = NSImage(contentsOfFile: imagePath) {
  49. return image
  50. }
  51. }
  52. return nil
  53. }
  54. //更新预览图
  55. func updatePreviewImage() {
  56. if let resultPath = KMBackgroundManager.defaultManager.kBackgroundImageFolder?.stringByAppendingPathComponent((self.backgroundID + ".png")) {
  57. let image = self.drawImage(rect: CGRectMake(0, 0, 136, 181))
  58. try?image.pngData()?.write(to: URL(fileURLWithPath: resultPath))
  59. }
  60. }
  61. func drawImage(rect: CGRect) -> NSImage {
  62. let drawRect: CGRect = NSMakeRect(0, 0, 128, 160)
  63. let image = NSImage(size: drawRect.size)
  64. image.lockFocus()
  65. NSGraphicsContext.current?.imageInterpolation = .high
  66. NSGraphicsContext.saveGraphicsState()
  67. NSColor.clear.set()
  68. drawRect.fill()
  69. NSGraphicsContext.restoreGraphicsState()
  70. let context: CGContext = NSGraphicsContext.current!.cgContext
  71. let _: NSSize = NSMakeSize(drawRect.size.width, drawRect.size.height)
  72. if (context != nil) {
  73. NSGraphicsContext.current = NSGraphicsContext(cgContext: context, flipped: false)
  74. }
  75. NSGraphicsContext.saveGraphicsState()
  76. if (self.type == .color) {
  77. var size = drawRect.size
  78. size.width *= self.scale
  79. size.height *= self.scale
  80. let radian = CGFloat(self.rotation) * (Double.pi/180.0)
  81. let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian)
  82. var rect = NSMakeRect(0, 0, size.width, size.height).applying(t)
  83. if (self.verticalMode == 0) {
  84. rect.origin.y = drawRect.size.height-rect.size.height
  85. } else if (self.verticalMode == 1) {
  86. rect.origin.y = (drawRect.size.height-rect.size.height) * 0.5
  87. } else if (self.verticalMode == 2) {
  88. rect.origin.y = 0
  89. }
  90. if (self.horizontalMode == 0) {
  91. rect.origin.x = 0
  92. } else if (self.horizontalMode == 1) {
  93. rect.origin.x = (drawRect.size.width-rect.size.width) * 0.5
  94. } else if (self.horizontalMode == 2) {
  95. rect.origin.x = drawRect.size.width-rect.size.width
  96. }
  97. rect.origin.x += self.horizontalSpace
  98. rect.origin.y += self.verticalSpace
  99. let contextCenter = NSPoint(x: rect.midX, y: rect.midY)
  100. context.translateBy(x: contextCenter.x, y: contextCenter.y)
  101. context.rotate(by: radian)
  102. context.translateBy(x: -contextCenter.x, y: -contextCenter.y)
  103. var red: CGFloat = 0
  104. var green: CGFloat = 0
  105. var blue: CGFloat = 0
  106. var alpha: CGFloat = 0
  107. let oldStrokeColor = self.color?.usingColorSpace(NSColorSpace.deviceRGB)
  108. oldStrokeColor?.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
  109. context.setFillColor(red: red, green: green, blue: blue, alpha: self.opacity);
  110. context.fill(NSMakeRect(rect.origin.x+(rect.size.width-size.width)/2.0,
  111. rect.origin.y+(rect.size.height-size.height)/2.0,
  112. size.width, size.height));
  113. } else if (self.type == .image) {
  114. var size: NSSize = CGSizeZero
  115. if let image = self.image() {
  116. size = image.size
  117. }
  118. size.width *= self.scale
  119. size.height *= self.scale
  120. var wScale = size.width / drawRect.size.width
  121. var hScale = size.height / drawRect.size.height
  122. var scale = max(wScale, hScale)
  123. if (scale > 1) {
  124. size.width /= scale
  125. size.height /= scale
  126. }
  127. let radian = CGFloat(self.rotation) * (Double.pi/180.0)
  128. let t: CGAffineTransform = CGAffineTransform(rotationAngle: radian)
  129. var rect = NSMakeRect(0, 0, size.width, size.height).applying(t)
  130. if (self.verticalMode == 0) {
  131. rect.origin.y = drawRect.size.height-rect.size.height
  132. } else if (self.verticalMode == 1) {
  133. rect.origin.y = (drawRect.size.height-rect.size.height) * 0.5
  134. } else if (self.verticalMode == 2) {
  135. rect.origin.y = 0
  136. }
  137. if (self.horizontalMode == 0) {
  138. rect.origin.x = 0
  139. } else if (self.horizontalMode == 1) {
  140. rect.origin.x = (drawRect.size.width-rect.size.width) * 0.5
  141. } else if (self.horizontalMode == 2) {
  142. rect.origin.x = drawRect.size.width-rect.size.width
  143. }
  144. rect.origin.x += self.horizontalSpace
  145. rect.origin.y += self.verticalSpace
  146. let contextCenter = NSPoint(x: rect.midX, y: rect.midY)
  147. context.translateBy(x: contextCenter.x, y: contextCenter.y)
  148. context.rotate(by: radian)
  149. context.translateBy(x: -contextCenter.x, y: -contextCenter.y)
  150. let finalRect = NSMakeRect(rect.origin.x+(rect.size.width-size.width)/2.0,
  151. rect.origin.y+(rect.size.height-size.height)/2.0,
  152. size.width, size.height)
  153. image.draw(in: NSMakeRect(rect.origin.x+(rect.size.width-size.width)/2.0,
  154. rect.origin.y+(rect.size.height-size.height)/2.0,
  155. size.width, size.height), from: NSZeroRect, operation: .sourceOver, fraction: self.opacity)
  156. }
  157. NSGraphicsContext.restoreGraphicsState()
  158. NSGraphicsContext.current?.imageInterpolation = .default
  159. image.unlockFocus()
  160. return image
  161. }
  162. }