KMPDFThumbnialPageView.swift 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. //
  2. // KMPDFThumbnialPageView.swift
  3. // PDF Reader Pro
  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. // self.page?.draw(with: .cropBox, to: ctx)
  78. // if let tiffData = (self.page?.thumbnail(of: self.page?.size ?? .zero))?.tiffRepresentation {
  79. // if let tiffData = self.page?.PDFListViewTIFFData(for: self.page?.bounds ?? .zero) {
  80. // let image = NSImage(data: tiffData)
  81. // image?.draw(in: ctx as! NSRect)
  82. // image?.draw(in: bounds)
  83. // let bitmap = NSBitmapImageRep(data: tiffData)
  84. // ctx.draw((bitmap?.cgImage)!, in: NSMakeRect(0, 0, bounds.size.width, bounds.size.height))
  85. // ctx.restoreGState();
  86. // self.contents = bitmap?.cgImage
  87. // } else {
  88. // km_synchronized(self.page!.document) {
  89. self.page!.drawEdit(with: .cropBox, to: ctx)
  90. // }
  91. // self.page!.drawEdit(with: .cropBox, to: ctx)
  92. ctx.restoreGState();
  93. // }
  94. // ctx.restoreGState();
  95. if let _image = ctx.makeImage() {
  96. let image = NSImage(cgImage: _image, size: NSSize(width: viewWidth, height: viewHeight))
  97. self.page?.pageEditImage = image
  98. }
  99. // }
  100. }
  101. }
  102. }
  103. class KMPDFThumbnialPageView: NSView {
  104. internal var _page: CPDFPage?
  105. var page: CPDFPage? {
  106. get {
  107. self._page
  108. }
  109. set {
  110. self._page = newValue
  111. if pageLayer != nil {
  112. pageLayer.contents = nil
  113. pageLayer.delegate = nil
  114. pageLayer.removeFromSuperlayer()
  115. }
  116. pageLayer = KMPDFThumbnialPageLayer()
  117. pageLayer.frame = self.bounds
  118. pageLayer.page = newValue
  119. self.layer?.addSublayer(pageLayer)
  120. // if let image = self._page?.pageEditImage {
  121. // if (self.pageImageIv.superview == nil) {
  122. // self.addSubview(self.pageImageIv)
  123. // }
  124. // self.pageImageIv.image = image
  125. // self.pageImageIv.imageScaling = .scaleAxesIndependently
  126. // self.pageImageIv.translatesAutoresizingMaskIntoConstraints = false
  127. // self.pageImageIv.frame = self.bounds
  128. // self.pageImageIv.isHidden = false
  129. //// self.pageImageIv.image = image
  130. // } else {
  131. // self.pageImageIv.isHidden = true
  132. // }
  133. }
  134. }
  135. var pageLayer: KMPDFThumbnialPageLayer!
  136. var pageImageIv = NSImageView()
  137. override init(frame frameRect: NSRect) {
  138. super.init(frame: frameRect)
  139. self.wantsLayer = true
  140. self.layer?.backgroundColor = NSColor.white.cgColor
  141. self.shadow = NSShadow()
  142. self.layer?.shadowColor = NSColor.black.cgColor
  143. self.layer?.shadowOpacity = 0.2
  144. self.layer?.shadowRadius = 3
  145. self.layer?.shadowOffset = CGSize(width: 0, height: -3)
  146. if (pageLayer != nil) {
  147. pageLayer.frame = self.bounds
  148. }
  149. self.pageImageIv.frame = self.bounds
  150. }
  151. required init?(coder: NSCoder) {
  152. super.init(coder: coder)
  153. }
  154. override func layout() {
  155. super.layout()
  156. if (pageLayer != nil) {
  157. pageLayer.frame = self.bounds
  158. pageLayer.setNeedsDisplay()
  159. }
  160. self.pageImageIv.frame = self.bounds
  161. }
  162. }