changeset 95126:b7cee987e982

(Vfont_encoding_alist, find_font_encoding): Moved from fontset.c. (font_pixel_size)[! HAVE_WINDOW_SYSTEM]: Return 1. (font_open_entity): Update FRAME_X_DISPLAY_INFO (f)->n_fonts, FRAME_SMALLEST_CHAR_WIDTH (f), and FRAME_SMALLEST_FONT_HEIGHT (f) only when HAVE_WINDOW_SYSTEM is defined. (font_close_object): Update FRAME_X_DISPLAY_INFO (f)->n_fonts only when HAVE_WINDOW_SYSTEM is defined.
author Kenichi Handa <handa@m17n.org>
date Tue, 20 May 2008 06:33:10 +0000
parents 679d861f4d3a
children e2d4be6d5115
files src/font.c
diffstat 1 files changed, 63 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/font.c	Tue May 20 06:32:37 2008 +0000
+++ b/src/font.c	Tue May 20 06:33:10 2008 +0000
@@ -93,6 +93,8 @@
 /* Symbols representing values of font spacing property.  */
 Lisp_Object Qc, Qm, Qp, Qd;
 
+Lisp_Object Vfont_encoding_alist;
+
 /* Alist of font registry symbol and the corresponding charsets
    information.  The information is retrieved from
    Vfont_encoding_alist on demand.
@@ -209,6 +211,7 @@
      FRAME_PTR f;
      Lisp_Object spec;
 {
+#ifdef HAVE_WINDOW_SYSTEM
   Lisp_Object size = AREF (spec, FONT_SIZE_INDEX);
   double point_size;
   int dpi, pixel_size;
@@ -217,7 +220,8 @@
   if (INTEGERP (size))
     return XINT (size);
   if (NILP (size))
-    return 0;  xassert (FLOATP (size));
+    return 0;
+  xassert (FLOATP (size));
   point_size = XFLOAT_DATA (size);
   val = AREF (spec, FONT_DPI_INDEX);
   if (INTEGERP (val))
@@ -226,6 +230,9 @@
     dpi = f->resy;
   pixel_size = POINT_TO_PIXEL (point_size, dpi);
   return pixel_size;
+#else
+  return 1;
+#endif
 }
 
 
@@ -328,6 +335,31 @@
 extern Lisp_Object find_font_encoding P_ ((Lisp_Object));
 
 
+/* Return ENCODING or a cons of ENCODING and REPERTORY of the font
+   FONTNAME.  ENCODING is a charset symbol that specifies the encoding
+   of the font.  REPERTORY is a charset symbol or nil.  */
+
+Lisp_Object
+find_font_encoding (fontname)
+     Lisp_Object fontname;
+{
+  Lisp_Object tail, elt;
+
+  for (tail = Vfont_encoding_alist; CONSP (tail); tail = XCDR (tail))
+    {
+      elt = XCAR (tail);
+      if (CONSP (elt)
+	  && STRINGP (XCAR (elt))
+	  && fast_string_match_ignore_case (XCAR (elt), fontname) >= 0
+	  && (SYMBOLP (XCDR (elt))
+	      ? CHARSETP (XCDR (elt))
+	      : CONSP (XCDR (elt)) && CHARSETP (XCAR (XCDR (elt)))))
+	return (XCDR (elt));
+    }
+  /* We don't know the encoding of this font.  Let's assume `ascii'.  */
+  return Qascii;
+}
+
 /* Return encoding charset and repertory charset for REGISTRY in
    ENCODING and REPERTORY correspondingly.  If correct information for
    REGISTRY is available, return 0.  Otherwise return -1.  */
@@ -2141,6 +2173,7 @@
 }
 
 
+
 /* Font cache
 
    Each font backend has the callback function get_cache, and it
@@ -2496,6 +2529,7 @@
 	       : font->average_width ? font->average_width
 	       : font->space_width ? font->space_width
 	       : 1);
+#ifdef HAVE_WINDOW_SYSTEM
   FRAME_X_DISPLAY_INFO (f)->n_fonts++;
   if (FRAME_X_DISPLAY_INFO (f)->n_fonts == 1)
     {
@@ -2510,6 +2544,7 @@
       if (FRAME_SMALLEST_FONT_HEIGHT (f) > font->height)
 	FRAME_SMALLEST_FONT_HEIGHT (f) = font->height, fonts_changed_p = 1;
     }
+#endif
 
   return font_object;
 }
@@ -2531,9 +2566,11 @@
        prev = tail, tail = XCDR (tail))
     if (EQ (font_object, XCAR (tail)))
       {
+	font->driver->close (f, font);
+#ifdef HAVE_WINDOW_SYSTEM
 	xassert (FRAME_X_DISPLAY_INFO (f)->n_fonts);
-	font->driver->close (f, font);
 	FRAME_X_DISPLAY_INFO (f)->n_fonts--;
+#endif
 	if (NILP (prev))
 	  ASET (font_object, FONT_OBJLIST_INDEX, XCDR (objlist));
 	else
@@ -4409,6 +4446,29 @@
 #endif
 #endif	/* FONT_DEBUG */
 
+  DEFVAR_LISP ("font-encoding-alist", &Vfont_encoding_alist,
+	       doc: /*
+Alist of fontname patterns vs the corresponding encoding and repertory info.
+Each element looks like (REGEXP . (ENCODING . REPERTORY)),
+where ENCODING is a charset or a char-table,
+and REPERTORY is a charset, a char-table, or nil.
+
+If ENCDING and REPERTORY are the same, the element can have the form
+\(REGEXP . ENCODING).
+
+ENCODING is for converting a character to a glyph code of the font.
+If ENCODING is a charset, encoding a character by the charset gives
+the corresponding glyph code.  If ENCODING is a char-table, looking up
+the table by a character gives the corresponding glyph code.
+
+REPERTORY specifies a repertory of characters supported by the font.
+If REPERTORY is a charset, all characters beloging to the charset are
+supported.  If REPERTORY is a char-table, all characters who have a
+non-nil value in the table are supported.  It REPERTORY is nil, Emacs
+gets the repertory information by an opened font and ENCODING.  */);
+  Vfont_encoding_alist = Qnil;
+
+#ifdef HAVE_WINDOW_SYSTEM
 #ifdef HAVE_FREETYPE
   syms_of_ftfont ();
 #ifdef HAVE_X_WINDOWS
@@ -4432,6 +4492,7 @@
 #ifdef MAC_OS
   syms_of_atmfont ();
 #endif	/* MAC_OS */
+#endif	/* HAVE_WINDOW_SYSTEM */
 }
 
 /* arch-tag: 74c9475d-5976-4c93-a327-942ae3072846