KMPDFThumbnialPageView.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. //
  2. // KMPDFThumbnialPageView.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2022/11/24.
  6. //
  7. import Cocoa
  8. extension CPDFPage {
  9. private static var _pageEditImageKey = "KMPageEditImageKey"
  10. var pageEditImage: NSImage? {
  11. get {
  12. return objc_getAssociatedObject(self, &CPDFPage._pageEditImageKey) as? NSImage
  13. }
  14. set {
  15. objc_setAssociatedObject(self, &CPDFPage._pageEditImageKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
  16. }
  17. }
  18. }
  19. class KMPDFThumbnialPageLayer: CATiledLayer {
  20. var page: CPDFPage?
  21. override init() {
  22. super.init()
  23. self.initDefaultValue()
  24. }
  25. override init(layer: Any) {
  26. super.init(layer: layer)
  27. self.initDefaultValue()
  28. }
  29. required init?(coder: NSCoder) {
  30. super.init(coder: coder)
  31. self.initDefaultValue()
  32. }
  33. public func initDefaultValue() {
  34. self.levelsOfDetail = 2
  35. self.levelsOfDetailBias = 3
  36. self.tileSize = CGSize(width: 1024, height: 1024)
  37. }
  38. override func draw(in ctx: CGContext) {
  39. super.draw(in: ctx)
  40. if (self.page != nil) {
  41. // if let data = self.page?.pageEditImage {
  42. // ctx.saveGState()
  43. // var bounds = self.page!.bounds
  44. // let transform = self.page!.transform()
  45. // bounds = bounds.applying(transform);
  46. //
  47. // let viewWidth: CGFloat = NSWidth(self.bounds)
  48. // let viewHeight: CGFloat = NSHeight(self.bounds)
  49. //
  50. // if (self.page!.rotation == -90 || self.page!.rotation == -270) {
  51. // let height = bounds.size.height
  52. // bounds.size.height = bounds.size.width
  53. // bounds.size.width = height
  54. // }
  55. //
  56. // ctx.scaleBy(x: viewWidth / bounds.size.width,
  57. // y: viewHeight / bounds.size.height);
  58. // let bitmap = NSBitmapImageRep(data: data.tiffRepresentation!)
  59. // ctx.draw((bitmap?.cgImage)!, in: NSMakeRect(0, 0, viewWidth, viewHeight))
  60. // ctx.restoreGState()
  61. // self.contents = bitmap?.cgImage
  62. // } else {
  63. ctx.saveGState();
  64. var bounds = self.page!.bounds
  65. let transform = self.page!.transform()
  66. bounds = bounds.applying(transform);
  67. let viewWidth: CGFloat = NSWidth(self.bounds)
  68. let viewHeight: CGFloat = NSHeight(self.bounds)
  69. if (self.page!.rotation == -90 || self.page!.rotation == -270) {
  70. let height = bounds.size.height
  71. bounds.size.height = bounds.size.width
  72. bounds.size.width = height
  73. }
  74. ctx.scaleBy(x: viewWidth / bounds.size.width,
  75. y: viewHeight / bounds.size.height);
  76. self.page!.drawEdit(with: .cropBox, to: ctx)
  77. ctx.restoreGState();
  78. if let _image = ctx.makeImage() {
  79. let image = NSImage(cgImage: _image, size: NSSize(width: viewWidth, height: viewHeight))
  80. self.page?.pageEditImage = image
  81. }
  82. // }
  83. }
  84. }
  85. }
  86. class KMPDFThumbnialPageView: NSView {
  87. internal var _page: CPDFPage?
  88. var page: CPDFPage? {
  89. get {
  90. self._page
  91. }
  92. set {
  93. self._page = newValue
  94. if pageLayer != nil {
  95. pageLayer.contents = nil
  96. pageLayer.delegate = nil
  97. pageLayer.removeFromSuperlayer()
  98. }
  99. pageLayer = KMPDFThumbnialPageLayer()
  100. pageLayer.frame = self.bounds
  101. pageLayer.page = newValue
  102. self.layer?.addSublayer(pageLayer)
  103. // if let image = self._page?.pageEditImage {
  104. // if (self.pageImageIv.superview == nil) {
  105. // self.addSubview(self.pageImageIv)
  106. // }
  107. // self.pageImageIv.image = image
  108. // self.pageImageIv.imageScaling = .scaleAxesIndependently
  109. // self.pageImageIv.translatesAutoresizingMaskIntoConstraints = false
  110. // self.pageImageIv.frame = self.bounds
  111. // self.pageImageIv.isHidden = false
  112. //// self.pageImageIv.image = image
  113. // } else {
  114. // self.pageImageIv.isHidden = true
  115. // }
  116. }
  117. }
  118. var pageLayer: KMPDFThumbnialPageLayer!
  119. var pageImageIv = NSImageView()
  120. override init(frame frameRect: NSRect) {
  121. super.init(frame: frameRect)
  122. self.wantsLayer = true
  123. self.layer?.backgroundColor = NSColor.white.cgColor
  124. self.shadow = NSShadow()
  125. self.layer?.shadowColor = NSColor.black.cgColor
  126. self.layer?.shadowOpacity = 0.2
  127. self.layer?.shadowRadius = 3
  128. self.layer?.shadowOffset = CGSize(width: 0, height: -3)
  129. if (pageLayer != nil) {
  130. pageLayer.frame = self.bounds
  131. }
  132. self.pageImageIv.frame = self.bounds
  133. }
  134. required init?(coder: NSCoder) {
  135. super.init(coder: coder)
  136. }
  137. override func layout() {
  138. super.layout()
  139. if (pageLayer != nil) {
  140. pageLayer.frame = self.bounds
  141. pageLayer.setNeedsDisplay()
  142. }
  143. self.pageImageIv.frame = self.bounds
  144. }
  145. }