OSDN Git Service

スクリーンショットが撮れない問題を修正
authormasakih <masakih@users.sourceforge.jp>
Fri, 3 Nov 2017 07:14:07 +0000 (16:14 +0900)
committermasakih <masakih@users.sourceforge.jp>
Fri, 3 Nov 2017 07:14:07 +0000 (16:14 +0900)
#37633

完全な修正には至らず

KCD/GameViewController.swift

index 32cc6e4..29074a7 100644 (file)
@@ -110,13 +110,34 @@ final class GameViewController: NSViewController {
     
     @IBAction func screenShot(_ sender: AnyObject?) {
         
-        let frame = webView.visibleRect
-        let screenshotBorder = UserDefaults.standard[.screenShotBorderWidth]
-        let f = frame.insetBy(dx: -screenshotBorder, dy: -screenshotBorder)
+        let frame = view.visibleRect
+//        let screenshotBorder = UserDefaults.standard[.screenShotBorderWidth]
+//        let f = frame.insetBy(dx: -screenshotBorder, dy: -screenshotBorder)
         
-        guard let rep = webView.bitmapImageRepForCachingDisplay(in: f) else { return }
+        guard let window = view.window else { return Logger.shared.log("Can not get window") }
+        
+        let windowCoordinateFrame = view.convert(frame, to: nil)
+        
+        let screenCoordinsteFrame = window.convertToScreen(windowCoordinateFrame)
+        
+        guard let screen = NSScreen.main else { return Logger.shared.log("Can not get Screen") }
+        let scFrame = screen.frame
+        
+        guard let cxt = window.graphicsContext?.cgContext else { return Logger.shared.log("Cannot get Context") }
+        let deviceCoordinateFrame = cxt.convertToDeviceSpace(screenCoordinsteFrame)
+        let raio = deviceCoordinateFrame.size.width / screenCoordinsteFrame.size.width
+        
+        let trimRect = CGRect(x: raio * screenCoordinsteFrame.origin.x,
+                              y: raio * (scFrame.size.height - screenCoordinsteFrame.origin.y - screenCoordinsteFrame.size.height),
+                              width: raio * screenCoordinsteFrame.size.width,
+                              height: raio * screenCoordinsteFrame.size.height)
+        
+        guard let fullSizeImage = CGDisplayCreateImage(CGMainDisplayID()) else { return Logger.shared.log("Can not get Image") }
+        
+        guard let image = fullSizeImage.cropping(to: trimRect) else { return Logger.shared.log("Can not trim image") }
+        
+        let rep = NSBitmapImageRep(cgImage: image)
         
-        webView.cacheDisplay(in: frame, to: rep)
         AppDelegate.shared.registerScreenshot(rep, fromOnScreen: .zero)
     }