From f771c93781b3135200cae6dbc8e45dbb887f77b1 Mon Sep 17 00:00:00 2001 From: Illia Ostapyshyn Date: Thu, 13 May 2021 19:34:36 +0200 Subject: Support HiDPI displays on vanilla emacs Fixes the long-standing issue of displaying pdf contents in proper resolution on retina Macs using vanilla (not a fork) emacs [1], [2] This commit squashes changes contributed by @iostapyshyn. It introduces the following changes: - Use `frame-scale-factor` to detect HiDPI displays in preference to other methods. `frame-scale-factor` is a new function introduced in Vanilla Emacs to return the scale factor of the backing store. - Allow scaling for `png` type images as well (if `pdf-view-use-scaling` is `t`), since this works well and I'm not sure why it was originally disabled. 1: politza/pdf-tools#51 2: hlissner/doom-emacs#4989 Closes #13 --- lisp/pdf-cache.el | 3 ++- lisp/pdf-util.el | 15 +++++++-------- lisp/pdf-view.el | 13 ++----------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/lisp/pdf-cache.el b/lisp/pdf-cache.el index e9a7ca5..50d7688 100644 --- a/lisp/pdf-cache.el +++ b/lisp/pdf-cache.el @@ -380,6 +380,7 @@ See also `pdf-info-renderpage-highlight' and (pdf-cache-pagelinks (pdf-view-current-page))))))))) +(defvar pdf-view-use-scaling) (defun pdf-cache--prefetch-pages (window image-width) (when (and (eq window (selected-window)) (pdf-util-pdf-buffer-p)) @@ -388,7 +389,7 @@ See also `pdf-info-renderpage-highlight' and (pdf-cache-lookup-image page image-width - (if (not (pdf-view-use-scaling-p)) + (if (not pdf-view-use-scaling) image-width (* 2 image-width)))) (setq page (pop pdf-cache--prefetch-pages))) diff --git a/lisp/pdf-util.el b/lisp/pdf-util.el index 3c4d77b..c57f6ec 100644 --- a/lisp/pdf-util.el +++ b/lisp/pdf-util.el @@ -945,15 +945,14 @@ See also `regexp-quote'." (defun pdf-util-frame-scale-factor () "Return the frame scale factor depending on the image type used for display. -When `pdf-view-use-scaling' is non-nil and imagemagick or -image-io are used as the image type for display, return the -backing-scale-factor of the frame if available. If a -backing-scale-factor attribute isn't available, return 2 if the +When `pdf-view-use-scaling' is non-nil, return the scale factor of the frame +if available. If the scale factor isn't available, return 2 if the frame's PPI is larger than 180. Otherwise, return 1." - (if (and pdf-view-use-scaling - (memq (pdf-view-image-type) '(imagemagick image-io)) - (fboundp 'frame-monitor-attributes)) - (or (cdr (assq 'backing-scale-factor (frame-monitor-attributes))) + (if pdf-view-use-scaling + (or (and (fboundp 'frame-scale-factor) + (truncate (frame-scale-factor))) + (and (fboundp 'frame-monitor-attributes) + (cdr (assq 'backing-scale-factor (frame-monitor-attributes)))) (if (>= (pdf-util-frame-ppi) 180) 2 1)) diff --git a/lisp/pdf-view.el b/lisp/pdf-view.el index 03ff716..bb42e45 100644 --- a/lisp/pdf-view.el +++ b/lisp/pdf-view.el @@ -92,10 +92,7 @@ FIXME: Explain dis-/advantages of imagemagick and png." This variable affects both the reuse of higher-resolution images as lower-resolution ones by down-scaling the image. As well as the rendering of higher-resolution for high-resolution displays, -if available. - -It has no effect, unless either the imagemagick or image-io -image-format is available." +if available." :group 'pdf-view :type 'boolean) @@ -911,12 +908,6 @@ See also `pdf-view-use-imagemagick'." (t (error "PNG image supported not compiled into Emacs")))) -(defun pdf-view-use-scaling-p () - "Return t if scaling should be used." - (and (memq (pdf-view-image-type) - '(imagemagick image-io)) - pdf-view-use-scaling)) - (defmacro pdf-view-create-image (data &rest props) ;; TODO: add DATA and PROPS to docstring. "Like `create-image', but with set DATA-P and TYPE arguments." @@ -935,7 +926,7 @@ See also `pdf-view-use-imagemagick'." (let* ((size (pdf-view-desired-image-size page window)) (data (pdf-cache-renderpage page (car size) - (if (not (pdf-view-use-scaling-p)) + (if (not pdf-view-use-scaling) (car size) (* 2 (car size))))) (hotspots (pdf-view-apply-hotspot-functions -- cgit v1.0