emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master b197822: Allow querying font by name for its height


From: Eli Zaretskii
Subject: [Emacs-diffs] master b197822: Allow querying font by name for its height and other info. (Bug#19395)
Date: Thu, 18 Dec 2014 16:11:10 +0000

branch: master
commit b1978229162b0d4c3b14d8ad8bff383eb3511969
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Allow querying font by name for its height and other info.  (Bug#19395)
    
     src/font.c (Ffont_info): Add more font information to the vector
     returned by the function, inspired by query-font.  Doc fix.
    
     doc/lispref/display.texi (Low-Level Font): Document font-info and 
query-font.
    
     lisp/international/mule-diag.el (describe-font-internal): Display
     additional info returned by font-info.
     lisp/linum.el (linum--face-width): Rename from linum--face-height,
     and use the new functionality of font-info.
     (linum-update-window): Use linum--face-width and frame-char-width,
     instead of approximating with height.
    
     etc/NEWS: Mention the enhancement in font-info.
---
 doc/lispref/ChangeLog           |    4 +
 doc/lispref/display.texi        |  124 ++++++++++++++++++++++++++++++++++++++-
 etc/NEWS                        |   26 +++++----
 lisp/ChangeLog                  |   10 +++
 lisp/international/mule-diag.el |   10 +++-
 lisp/linum.el                   |   15 +++--
 src/ChangeLog                   |    6 ++
 src/font.c                      |   47 +++++++++++++-
 8 files changed, 217 insertions(+), 25 deletions(-)

diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog
index a48289c..7424ab0 100644
--- a/doc/lispref/ChangeLog
+++ b/doc/lispref/ChangeLog
@@ -1,3 +1,7 @@
+2014-12-18  Eli Zaretskii  <address@hidden>
+
+       * display.texi (Low-Level Font): Document font-info and query-font.
+
 2014-12-16  Nicolas Petton  <address@hidden>
 
        * sequences.texi (Seq Library): Add documentation for seq.el.
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 90aa979..48860c8 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -3349,9 +3349,9 @@ The script that the font must support (a symbol).
 @item :otf
 @cindex OpenType font
 The font must be an OpenType font that supports these OpenType
-features, provided Emacs is compiled with support for @samp{libotf} (a
-library for performing complex text layout in certain scripts).  The
-value must be a list of the form
+features, provided Emacs is compiled with a library, such as
address@hidden on GNU/Linux, that supports complex text layout for
+scripts which need that.  The value must be a list of the form
 
 @smallexample
 @code{(@var{script-tag} @var{langsys-tag} @var{gsub} @var{gpos})}
@@ -3450,6 +3450,124 @@ If the optional argument @var{fold-wildcards} is 
address@hidden,
 consecutive wildcards in the XLFD are folded into one.
 @end defun
 
+The following two functions return important information about a font.
+
address@hidden font-info name &optional frame
+This function returns information about a font specified by its
address@hidden, a string, as it is used on @var{frame}.  If @var{frame} is
+omitted or @code{nil}, it defaults to the selected frame.
+
+The value returned by the function is a vector of the form
address@hidden@var{opened-name} @var{full-name} @var{size} @var{height}
address@hidden @var{relative-compose} @var{default-ascent}
address@hidden @var{ascent} @var{descent} @var{space-width}
address@hidden @var{filename} @var{capability}]}.  Here's the
+description of each components of this vector:
+
address@hidden @var
address@hidden opened-name
+The name used to open the font, a string.
+
address@hidden full-name
+The full name of the font, a string.
+
address@hidden size
+The pixel size of the font.
+
address@hidden height
+The height of the font in pixels.
+
address@hidden baseline-offset
+The offset in pixels from the @acronym{ASCII} baseline, positive
+upward.
+
address@hidden relative-compose
address@hidden default-ascent
+Numbers controlling how to compose characters.
+
address@hidden ascent
address@hidden descent
+The ascent and descent of this font.  The sum of these two numbers
+should be equal to the value of @var{height} above.
+
address@hidden space-width
+The width, in pixels, of the font's space character.
+
address@hidden average-width
+The average width of the font characters.  If this is zero, Emacs uses
+the value of @var{space-width} instead, when it calculates text layout
+on display.
+
address@hidden filename
+The file name of the font as a string.  This can be @code{nil} if the
+font back-end does not provide a way to find out the font's file name.
+
address@hidden capability
+A list whose first element is a symbol representing the font type, one
+of @code{x}, @code{opentype}, @code{truetype}, @code{type1},
address@hidden, or @code{bdf}.  For OpenType fonts, the list includes 2
+additional elements describing the @sc{gsub} and @sc{gpos} features
+supported by the font.  Each of these elements is a list of the form
address@hidden((@var{script} (@var{langsys} @var{feature} @dots{}) @dots{})
address@hidden)}, where @var{script} is a symbol representing an OpenType
+script tag, @var{langsys} is a symbol representing an OpenType langsys
+tag (or @code{nil}, which stands for the default langsys), and each
address@hidden is a symbol representing an OpenType feature tag.
address@hidden table
address@hidden defun
+
address@hidden query-font font-object
+This function returns information about a @var{font-object}.  (This is
+in contrast to @code{font-info}, which takes the font name, a string,
+as its argument.)
+
+The value returned by the function is a vector of the form
address@hidden@var{name} @var{filename} @var{pixel-size} @var{max-width}
address@hidden @var{descent} @var{space-width} @var{average-width}
address@hidden  Here's the description of each components of this
+vector:
+
address@hidden @var
address@hidden name
+The font name, a string.
+
address@hidden filename
+The file name of the font as a string.  This can be @code{nil} if the
+font back-end does not provide a way to find out the font's file name.
+
address@hidden pixel-size
+The pixel size of the font used to open the font.
+
address@hidden max-width
+The maximum advance width of the font.
+
address@hidden ascent
address@hidden descent
+The ascent and descent of this font.  The sum of these two numbers
+gives the font height.
+
address@hidden space-width
+The width, in pixels, of the font's space character.
+
address@hidden average-width
+The average width of the font characters.  If this is zero, Emacs uses
+the value of @var{space-width} instead, when it calculates text layout
+on display.
+
address@hidden capability
+A list whose first element is a symbol representing the font type, one
+of @code{x}, @code{opentype}, @code{truetype}, @code{type1},
address@hidden, or @code{bdf}.  For OpenType fonts, the list includes 2
+additional elements describing the @sc{gsub} and @sc{gpos} features
+supported by the font.  Each of these elements is a list of the form
address@hidden((@var{script} (@var{langsys} @var{feature} @dots{}) @dots{})
address@hidden)}, where @var{script} is a symbol representing an OpenType
+script tag, @var{langsys} is a symbol representing an OpenType langsys
+tag (or @code{nil}, which stands for the default langsys), and each
address@hidden is a symbol representing an OpenType feature tag.
address@hidden table
address@hidden defun
+
 @node Fringes
 @section Fringes
 @cindex fringes
diff --git a/etc/NEWS b/etc/NEWS
index a17cef6..865ae07 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -108,6 +108,17 @@ environment.  For the time being this is implemented for 
modern POSIX
 systems and for MS-Windows, for other systems they fall back to their
 counterparts `string-lessp' and `string-equal'.
 
+*** The ls-lisp package uses `string-collate-lessp' to sort file names.
+If you want the old, locale-independent sorting, customize the new
+option `ls-lisp-use-string-collate' to a nil value.
+
+*** The MS-Windows specific variable `w32-collate-ignore-punctuation',
+if set to a non-nil value, causes the above 2 functions to ignore
+symbol and punctuation characters when collating strings.  This
+emulates the behavior of modern Posix platforms when the locale's
+codeset is "UTF-8" (as in "en_US.UTF-8").  This is needed because
+MS-Windows doesn't support UTF-8 as codeset in its locales.
+
 +++
 ** The new function `bidi-find-overridden-directionality' allows to
 find characters whose directionality was, perhaps maliciously,
@@ -122,17 +133,6 @@ the visual appearance both of the copied text and the text 
at
 destination, even when the copied text includes mixed bidirectional
 text and directional control characters.
 
-*** The ls-lisp package uses `string-collate-lessp' to sort file names.
-If you want the old, locale-independent sorting, customize the new
-option `ls-lisp-use-string-collate' to a nil value.
-
-*** The MS-Windows specific variable `w32-collate-ignore-punctuation',
-if set to a non-nil value, causes the above 2 functions to ignore
-symbol and punctuation characters when collating strings.  This
-emulates the behavior of modern Posix platforms when the locale's
-codeset is "UTF-8" (as in "en_US.UTF-8").  This is needed because
-MS-Windows doesn't support UTF-8 as codeset in its locales.
-
 ** New variable `ns-use-fullscreen-animation' controls animation for
 non-native NS fullscreen.  The default is nil.  Set to t to enable
 animation when entering and leaving fullscreen.  For native OSX fullscreen
@@ -159,6 +159,10 @@ fontification during full screen scrolling operations, 
giving less
 hesitant operation during auto-repeat of C-v, M-v at the cost of
 possible inaccuracies in the end position.
 
+** The function `font-info' now returns more details about a font.
+In particular, it now returns the average width of the font's
+characters, which can be used for geometry-related calculations.
+
 
 * Editing Changes in Emacs 25.1
 
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 89a92f6..cb8348e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,13 @@
+2014-12-18  Eli Zaretskii  <address@hidden>
+
+       * international/mule-diag.el (describe-font-internal): Display
+       additional info returned by font-info.
+
+       * linum.el (linum--face-width): Rename from linum--face-height,
+       and use the new functionality of font-info.
+       (linum-update-window): Use linum--face-width and frame-char-width,
+       instead of approximating with height.
+
 2014-12-18  Dmitry Gutov  <address@hidden>
 
        * vc/vc-svn.el (vc-svn-dir-status-files): Revert the 2014-12-02
diff --git a/lisp/international/mule-diag.el b/lisp/international/mule-diag.el
index 13a1785..ead2dec 100644
--- a/lisp/international/mule-diag.el
+++ b/lisp/international/mule-diag.el
@@ -825,10 +825,18 @@ but still contains full information about each coding 
system."
 The IGNORED argument is ignored."
   (print-list "name (opened by):" (aref font-info 0))
   (print-list "       full name:" (aref font-info 1))
+  (and (aref font-info 12)
+       (print-list "       file name:" (aref font-info 12)))
   (print-list "            size:" (format "%2d" (aref font-info 2)))
   (print-list "          height:" (format "%2d" (aref font-info 3)))
   (print-list " baseline-offset:" (format "%2d" (aref font-info 4)))
-  (print-list "relative-compose:" (format "%2d" (aref font-info 5))))
+  (print-list "relative-compose:" (format "%2d" (aref font-info 5)))
+  (print-list "  default-ascent:" (format "%2d" (aref font-info 6)))
+  (print-list "          ascent:" (format "%2d" (aref font-info 8)))
+  (print-list "         descent:" (format "%2d" (aref font-info 9)))
+  (print-list "   average-width:" (format "%2d" (aref font-info 11)))
+  (print-list "     space-width:" (format "%2d" (aref font-info 10)))
+  (print-list "       max-width:" (format "%2d" (aref font-info 7))))
 
 ;;;###autoload
 (defun describe-font (fontname)
diff --git a/lisp/linum.el b/lisp/linum.el
index b13bd8d..fb2cda6 100644
--- a/lisp/linum.el
+++ b/lisp/linum.el
@@ -138,8 +138,13 @@ Linum mode is a buffer-local minor mode."
       (mapc #'delete-overlay linum-available)
       (setq linum-available nil))))
 
-(defun linum--face-height (face)
-  (aref (font-info (face-font face)) 2))
+(defun linum--face-width (face)
+  (let ((info (font-info (face-font face)))
+       width)
+    (setq width (aref info 11))
+    (if (<= width 0)
+       (setq width (aref info 10)))
+    width))
 
 (defun linum-update-window (win)
   "Update line numbers for the portion visible in window WIN."
@@ -183,10 +188,8 @@ Linum mode is a buffer-local minor mode."
       (setq line (1+ line)))
     (when (display-graphic-p)
       (setq width (ceiling
-                   ;; We'd really want to check the widths rather than the
-                   ;; heights, but it's a start.
-                   (/ (* width 1.0 (linum--face-height 'linum))
-                      (frame-char-height)))))
+                   (/ (* width 1.0 (linum--face-width 'linum))
+                      (frame-char-width)))))
     (set-window-margins win width (cdr (window-margins win)))))
 
 (defun linum-after-change (beg end _len)
diff --git a/src/ChangeLog b/src/ChangeLog
index 16e99ae..2b125d5 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-18  Eli Zaretskii  <address@hidden>
+
+       * font.c (Ffont_info): Add more font information to the vector
+       returned by the function, inspired by query-font.  Doc fix.
+       (Bug#19395)
+
 2014-12-18  Stefan Monnier  <address@hidden>
 
        * keyboard.c (input_was_pending): New var.
diff --git a/src/font.c b/src/font.c
index 70e6316..d10d228 100644
--- a/src/font.c
+++ b/src/font.c
@@ -4921,8 +4921,11 @@ If FRAME is omitted or nil, use the selected frame.  */)
 DEFUN ("font-info", Ffont_info, Sfont_info, 1, 2, 0,
        doc: /* Return information about a font named NAME on frame FRAME.
 If FRAME is omitted or nil, use the selected frame.
-The returned value is a vector of OPENED-NAME, FULL-NAME, SIZE,
-  HEIGHT, BASELINE-OFFSET, RELATIVE-COMPOSE, and DEFAULT-ASCENT,
+
+The returned value is a vector:
+  [ OPENED-NAME FULL-NAME SIZE HEIGHT BASELINE-OFFSET RELATIVE-COMPOSE
+    DEFAULT-ASCENT MAX-WIDTH ASCENT DESCENT SPACE-WIDTH AVERAGE-WIDTH
+    CAPABILITY ]
 where
   OPENED-NAME is the name used for opening the font,
   FULL-NAME is the full name of the font,
@@ -4930,7 +4933,33 @@ where
   HEIGHT is the pixel-height of the font (i.e., ascent + descent),
   BASELINE-OFFSET is the upward offset pixels from ASCII baseline,
   RELATIVE-COMPOSE and DEFAULT-ASCENT are the numbers controlling
-    how to compose characters.
+    how to compose characters,
+  MAX-WIDTH is the maximum advance width of the font,
+  ASCENT, DESCENT, SPACE-WIDTH, AVERAGE-WIDTH are metrics of the font
+    in pixels,
+  FILENAME is the font file name, a string (or nil if the font backend
+    doesn't provide a file name).
+  CAPABILITY is a list whose first element is a symbol representing the
+    font format, one of x, opentype, truetype, type1, pcf, or bdf.
+    The remaining elements describe the details of the font capabilities,
+    as follows:
+
+      If the font is OpenType font, the form of the list is
+        \(opentype GSUB GPOS)
+      where GSUB shows which "GSUB" features the font supports, and GPOS
+      shows which "GPOS" features the font supports.  Both GSUB and GPOS are
+      lists of the form:
+       \((SCRIPT (LANGSYS FEATURE ...) ...) ...)
+
+      where
+        SCRIPT is a symbol representing OpenType script tag.
+        LANGSYS is a symbol representing OpenType langsys tag, or nil
+         representing the default langsys.
+        FEATURE is a symbol representing OpenType feature tag.
+
+      If the font is not an OpenType font, there are no elements
+      in CAPABILITY except the font format symbol.
+
 If the named font is not yet loaded, return nil.  */)
   (Lisp_Object name, Lisp_Object frame)
 {
@@ -4966,7 +4995,7 @@ If the named font is not yet loaded, return nil.  */)
     return Qnil;
   font = XFONT_OBJECT (font_object);
 
-  info = make_uninit_vector (7);
+  info = make_uninit_vector (14);
   ASET (info, 0, AREF (font_object, FONT_NAME_INDEX));
   ASET (info, 1, AREF (font_object, FONT_FULLNAME_INDEX));
   ASET (info, 2, make_number (font->pixel_size));
@@ -4974,6 +5003,16 @@ If the named font is not yet loaded, return nil.  */)
   ASET (info, 4, make_number (font->baseline_offset));
   ASET (info, 5, make_number (font->relative_compose));
   ASET (info, 6, make_number (font->default_ascent));
+  ASET (info, 7, make_number (font->max_width));
+  ASET (info, 8, make_number (font->ascent));
+  ASET (info, 9, make_number (font->descent));
+  ASET (info, 10, make_number (font->space_width));
+  ASET (info, 11, make_number (font->average_width));
+  ASET (info, 12, AREF (font_object, FONT_FILE_INDEX));
+  if (font->driver->otf_capability)
+    ASET (info, 13, Fcons (Qopentype, font->driver->otf_capability (font)));
+  else
+    ASET (info, 13, Qnil);
 
 #if 0
   /* As font_object is still in FONT_OBJLIST of the entity, we can't



reply via email to

[Prev in Thread] Current Thread [Next in Thread]