From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Titus von der Malsburg Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] Implement functions for measuring fonts and max chars per line Date: Mon, 22 Dec 2014 23:25:10 +0100 Message-ID: <87d27b2ugp.fsf@posteo.de> References: <87k31j3g03.fsf@posteo.de> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha1; protocol="application/pgp-signature" X-Trace: ger.gmane.org 1419287157 32385 80.91.229.3 (22 Dec 2014 22:25:57 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 22 Dec 2014 22:25:57 +0000 (UTC) Cc: Eli Zaretskii To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Dec 22 23:25:50 2014 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Y3BQB-0006hV-Ma for ged-emacs-devel@m.gmane.org; Mon, 22 Dec 2014 23:25:47 +0100 Original-Received: from localhost ([::1]:42133 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3BQB-0006vL-0B for ged-emacs-devel@m.gmane.org; Mon, 22 Dec 2014 17:25:47 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:54177) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3BQ0-0006ux-BO for emacs-devel@gnu.org; Mon, 22 Dec 2014 17:25:43 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y3BPs-0007Ux-Il for emacs-devel@gnu.org; Mon, 22 Dec 2014 17:25:36 -0500 Original-Received: from mx02.posteo.de ([89.146.194.165]:41036) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y3BPj-0007Rc-Gg; Mon, 22 Dec 2014 17:25:19 -0500 Original-Received: from dovecot03.posteo.de (unknown [185.67.36.28]) by mx02.posteo.de (Postfix) with ESMTPS id D875525B17D7; Mon, 22 Dec 2014 23:25:16 +0100 (CET) Original-Received: from mail.posteo.de (localhost [127.0.0.1]) by dovecot03.posteo.de (Postfix) with ESMTPSA id 3k5wGz2V41z5vN4; Mon, 22 Dec 2014 23:25:15 +0100 (CET) In-reply-to: <87k31j3g03.fsf@posteo.de> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 89.146.194.165 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:180525 Archived-At: --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Below is an updated version of the patch with entries in etc/NEWS and a fix for a typo in the doc-string of `default-font-height'. The old ChangeLog entry can be reused: Implement functions for measuring fonts and max chars per line * simple.el (default-font-width): new function. * (default-font-height): elaborate doc-string * window.el (window-font-width): new function (window-font-height): new function (window-max-chars-per-line): new function diff --git a/etc/NEWS b/etc/NEWS index 14a9176..4adcb3d 100644 =2D-- a/etc/NEWS +++ b/etc/NEWS @@ -163,6 +163,24 @@ possible inaccuracies in the end position. In particular, it now returns the average width of the font's characters, which can be used for geometry-related calculations. =20 +** A new function `default-font-width' returns the average width of a +character in the current buffer's default font. If the default face +is remapped (see `face-remapping-alist'), the value for the remapped +face is returned. This function complements the existing function +`default-font-height'. + +** New functions `window-font-height' and `window-font-width return +the height and average width of characters in a specified face and +window. If FACE is remapped (see `face-remapping-alist'), the +function returns the information for the remapped face. + +** A new function `window-max-chars-per-line' returns the maximal +number of characters that can be displayed on one line. If a face +and/or window are provided, these values are used for the +calculation. This function is different from `window-body-width' in +that it accounts for (i) continuation glyphs, (ii) the size of the +font, and (iii) the specified window. + * Editing Changes in Emacs 25.1 =20 diff --git a/lisp/simple.el b/lisp/simple.el index 0fcd5db..b700c68 100644 =2D-- a/lisp/simple.el +++ b/lisp/simple.el @@ -5377,7 +5377,10 @@ lines." (declare-function font-info "font.c" (name &optional frame)) =20 (defun default-font-height () =2D "Return the height in pixels of the current buffer's default face font= ." + "Return the height in pixels of the current buffer's default face font. + +If the default font is remapped (see `face-remapping-alist'), the +function returns the height of the remapped face." (let ((default-font (face-font 'default))) (cond ((and (display-multi-font-p) @@ -5388,6 +5391,25 @@ lines." (aref (font-info default-font) 3)) (t (frame-char-height))))) =20 +(defun default-font-width () + "Return the width in pixels of the current buffer's default face font. + +If the default font is remapped (see `face-remapping-alist'), the +function returns the width of the remapped face." + (let ((default-font (face-font 'default))) + (cond + ((and (display-multi-font-p) + ;; Avoid calling font-info if the frame's default font was + ;; not changed since the frame was created. That's because + ;; font-info is expensive for some fonts, see bug #14838. + (not (string=3D (frame-parameter nil 'font) default-font))) + (let* ((info (font-info (face-font 'default))) + (width (aref info 11))) + (if (> width 0) + width + (aref info 10)))) + (t (frame-char-width))))) + (defun default-line-height () "Return the pixel height of current buffer's default-face text line. =20 diff --git a/lisp/window.el b/lisp/window.el index c95b0d6..990f953 100644 =2D-- a/lisp/window.el +++ b/lisp/window.el @@ -1830,6 +1830,57 @@ optional argument PIXELWISE is passed to the functio= ns." (window-body-width window pixelwise) (window-body-height window pixelwise))) =20 +(defun window-font-width (&optional window face) + "Return average character width for the font of FACE used in WINDOW. +WINDOW must be a live window and defaults to the selected one. + +If FACE is nil or omitted, the default face is used. If FACE is +remapped (see `face-remapping-alist'), the function returns the +information for the remapped face." + (with-selected-window (window-normalize-window window t) + (let* ((face (if face face 'default)) + (info (font-info (face-font face))) + (width (aref info 11))) + (if (> width 0) + width + (aref info 10))))) + +(defun window-font-height (&optional window face) + "Return character height for the font of FACE used in WINDOW. +WINDOW must be a live window and defaults to the selected one. + +If FACE is nil or omitted, the default face is used. If FACE is +remapped (see `face-remapping-alist'), the function returns the +information for the remapped face." + (with-selected-window (window-normalize-window window t) + (let* ((face (if face face 'default)) + (info (font-info (face-font face)))) + (aref info 3)))) + +(defun window-max-chars-per-line (&optional window face) + "Return the number of characters that can be displayed on one line in WI= NDOW. +WINDOW must be a live window and defaults to the selected one. + +The character width of FACE is used for the calculation. If FACE +is nil or omitted, the default face is used. If FACE is +remapped (see `face-remapping-alist'), the function uses the +remapped face. + +This function is different from `window-body-width' in two +ways. First, it accounts for the portions of the line reserved +for the continuation glyph. Second, it accounts for the size of +the font." + (with-selected-window (window-normalize-window window t) + (let* ((window-width (window-body-width window t)) + (font-width (window-font-width window face)) + (ncols (/ window-width font-width))) + (if (and (display-graphic-p) + overflow-newline-into-fringe + (/=3D (frame-parameter nil 'left-fringe) 0) + (/=3D (frame-parameter nil 'right-fringe) 0)) + ncols + (1- ncols))))) + (defun window-current-scroll-bars (&optional window) "Return the current scroll bar types for WINDOW. WINDOW must be a live window and defaults to the selected one. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAEBAgAGBQJUmJpHAAoJEK40WfPGE2idUBQIAIHdPQgPmE4DSsveC+DV+KtP PSztfcUms3JE29J/aF2CXWmm+g5pqmkwWagTGw/+RWptJGZ0AsVBVt/HhwSXFJ+/ h6XwcD6xqJDN4LEeGSayoKedvqThltfw+wainI6MkCtqI+4NQlEl/BVw0PgSbLIy Hwr3AuxPfhb9qTdRy6nJQq2laOFrvb5orxQpeuT+6d9/YvzIP2R0hq8BXHtuc/zZ c7wpLZQAUglZTfAkdUx5H2qnoU0AgZo3DI/egkWdNollxI8G8LO74+oZvuetnlkF ZLaS49AImgpwzcwqP5b1Tg/P19PkzJvVmloBCpJ6rqXKbLJt4NwiWoSjQojETCs= =R99q -----END PGP SIGNATURE----- --=-=-=--