emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] Changes to emacs/src/macterm.c


From: YAMAMOTO Mitsuharu
Subject: [Emacs-diffs] Changes to emacs/src/macterm.c
Date: Tue, 19 Apr 2005 08:04:09 -0400

Index: emacs/src/macterm.c
diff -c emacs/src/macterm.c:1.111 emacs/src/macterm.c:1.112
*** emacs/src/macterm.c:1.111   Mon Apr 18 07:44:54 2005
--- emacs/src/macterm.c Tue Apr 19 12:04:09 2005
***************
*** 5841,5961 ****
  int font_name_table_size = 0;
  int font_name_count = 0;
  
! #if 0
! /* compare two strings ignoring case */
! static int
! stricmp (const char *s, const char *t)
! {
!   for ( ; tolower (*s) == tolower (*t); s++, t++)
!     if (*s == '\0')
!       return 0;
!   return tolower (*s) - tolower (*t);
! }
! 
! /* compare two strings ignoring case and handling wildcard */
! static int
! wildstrieq (char *s1, char *s2)
! {
!   if (strcmp (s1, "*") == 0 || strcmp (s2, "*") == 0)
!     return true;
! 
!   return stricmp (s1, s2) == 0;
! }
  
! /* Assume parameter 1 is fully qualified, no wildcards. */
! static int
! mac_font_pattern_match (fontname, pattern)
!     char * fontname;
!     char * pattern;
  {
!   char *regex = (char *) alloca (strlen (pattern) * 2 + 3);
!   char *font_name_copy = (char *) alloca (strlen (fontname) + 1);
!   char *ptr;
! 
!   /* Copy fontname so we can modify it during comparison.  */
!   strcpy (font_name_copy, fontname);
  
!   ptr = regex;
!   *ptr++ = '^';
! 
!   /* Turn pattern into a regexp and do a regexp match.  */
!   for (; *pattern; pattern++)
      {
!       if (*pattern == '?')
!         *ptr++ = '.';
!       else if (*pattern == '*')
!         {
!           *ptr++ = '.';
!           *ptr++ = '*';
!         }
        else
!         *ptr++ = *pattern;
      }
-   *ptr = '$';
-   *(ptr + 1) = '\0';
- 
-   return (fast_c_string_match_ignore_case (build_string (regex),
-                                            font_name_copy) >= 0);
- }
- 
- /* Two font specs are considered to match if their foundry, family,
-    weight, slant, and charset match.  */
- static int
- mac_font_match (char *mf, char *xf)
- {
-   char m_foundry[50], m_family[50], m_weight[20], m_slant[2], m_charset[20];
-   char x_foundry[50], x_family[50], x_weight[20], x_slant[2], x_charset[20];
- 
-   if (sscanf (mf, 
"-%49[^-]-%49[^-]-%19[^-]-%1[^-]-%*[^-]--%*[^-]-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]-%19s",
-               m_foundry, m_family, m_weight, m_slant, m_charset) != 5)
-     return mac_font_pattern_match (mf, xf);
- 
-   if (sscanf (xf, 
"-%49[^-]-%49[^-]-%19[^-]-%1[^-]-%*[^-]-%*[^-]-%*[^-]-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]-%19s",
-               x_foundry, x_family, x_weight, x_slant, x_charset) != 5)
-     return mac_font_pattern_match (mf, xf);
  
!   return (wildstrieq (m_foundry, x_foundry)
!           && wildstrieq (m_family, x_family)
!           && wildstrieq (m_weight, x_weight)
!           && wildstrieq (m_slant, x_slant)
!           && wildstrieq (m_charset, x_charset))
!          || mac_font_pattern_match (mf, xf);
  }
- #endif
  
- static Lisp_Object Qbig5, Qcn_gb, Qsjis, Qeuc_kr;
  
  static void
! decode_mac_font_name (name, size, scriptcode)
       char *name;
       int size;
! #if TARGET_API_MAC_CARBON
!      int scriptcode;
! #else
!      short scriptcode;
! #endif
  {
-   Lisp_Object coding_system;
    struct coding_system coding;
!   char *buf;
  
!   switch (scriptcode)
!     {
!     case smTradChinese:
!       coding_system = Qbig5;
!       break;
!     case smSimpChinese:
!       coding_system = Qcn_gb;
!       break;
!     case smJapanese:
!       coding_system = Qsjis;
!       break;
!     case smKorean:
!       coding_system = Qeuc_kr;
        break;
!     default:
!       return;
!     }
  
    setup_coding_system (coding_system, &coding);
    coding.src_multibyte = 0;
--- 5841,5899 ----
  int font_name_table_size = 0;
  int font_name_count = 0;
  
! /* Alist linking character set strings to Mac text encoding and Emacs
!    coding system. */
! static Lisp_Object Vmac_charset_info_alist;
  
! static Lisp_Object
! create_text_encoding_info_alist ()
  {
!   Lisp_Object result = Qnil, rest;
  
!   for (rest = Vmac_charset_info_alist; CONSP (rest); rest = XCDR (rest))
      {
!       Lisp_Object charset_info = XCAR (rest);
!       Lisp_Object charset, coding_system, text_encoding;
!       Lisp_Object existing_info;
! 
!       if (!(CONSP (charset_info)
!           && STRINGP (charset = XCAR (charset_info))
!           && CONSP (XCDR (charset_info))
!           && INTEGERP (text_encoding = XCAR (XCDR (charset_info)))
!           && CONSP (XCDR (XCDR (charset_info)))
!           && SYMBOLP (coding_system = XCAR (XCDR (XCDR (charset_info))))))
!       continue;
! 
!       existing_info = assq_no_quit (text_encoding, result);
!       if (NILP (existing_info))
!       result = Fcons (list3 (text_encoding, coding_system, charset),
!                       result);
        else
!       if (NILP (Fmember (charset, XCDR (XCDR (existing_info)))))
!         XSETCDR (XCDR (existing_info),
!                  Fcons (charset, XCDR (XCDR (existing_info))));
      }
  
!   return result;
  }
  
  
  static void
! decode_mac_font_name (name, size, coding_system)
       char *name;
       int size;
!      Lisp_Object coding_system;
  {
    struct coding_system coding;
!   char *buf, *p;
  
!   for (p = name; *p; p++)
!     if (!isascii (*p) || iscntrl (*p))
        break;
! 
!   if (*p == '\0'
!       || NILP (coding_system) || NILP (Fcoding_system_p (coding_system)))
!     return;
  
    setup_coding_system (coding_system, &coding);
    coding.src_multibyte = 0;
***************
*** 5971,6038 ****
  
  
  static char *
! mac_to_x_fontname (name, size, style, scriptcode)
       char *name;
       int size;
       Style style;
! #if TARGET_API_MAC_CARBON
!      int scriptcode;
! #else
!      short scriptcode;
! #endif
  {
    char foundry[32], family[32], cs[32];
    char xf[256], *result, *p;
  
!   if (sscanf (name, "%31[^-]-%31[^-]-%31s", foundry, family, cs) != 3)
      {
        strcpy(foundry, "Apple");
        strcpy(family, name);
- 
-       switch (scriptcode)
-       {
-       case smTradChinese:     /* == kTextEncodingMacChineseTrad */
-         strcpy(cs, "big5-0");
-         break;
-       case smSimpChinese:     /* == kTextEncodingMacChineseSimp */
-         strcpy(cs, "gb2312.1980-0");
-         break;
-       case smJapanese:                /* == kTextEncodingMacJapanese */
-         strcpy(cs, "jisx0208.1983-sjis");
-         break;
-       case -smJapanese:
-       /* Each Apple Japanese font is entered into the font table
-          twice: once as a jisx0208.1983-sjis font and once as a
-          jisx0201.1976-0 font.  The latter can be used to display
-          the ascii charset and katakana-jisx0201 charset.  A
-          negative script code signals that the name of this latter
-          font is being built.  */
-       strcpy(cs, "jisx0201.1976-0");
-       break;
-       case smKorean:          /* == kTextEncodingMacKorean */
-         strcpy(cs, "ksc5601.1989-0");
-         break;
- #if TARGET_API_MAC_CARBON
-       case kTextEncodingMacCyrillic:
-       strcpy(cs, "mac-cyrillic");
-       break;
-       case kTextEncodingMacCentralEurRoman:
-       strcpy(cs, "mac-centraleurroman");
-       break;
-       case kTextEncodingMacSymbol:
-       case kTextEncodingMacDingbats:
-       strcpy(cs, "adobe-fontspecific");
-       break;
- #endif
-       default:
-       strcpy(cs, "mac-roman");
-       break;
-       }
      }
  
    sprintf(xf, "-%s-%s-%s-%c-normal--%d-%d-75-75-m-%d-%s",
            foundry, family, style & bold ? "bold" : "medium",
!         style & italic ? 'i' : 'r', size, size * 10, size * 10, cs);
  
    result = (char *) xmalloc (strlen (xf) + 1);
    strcpy (result, xf);
--- 5909,5934 ----
  
  
  static char *
! mac_to_x_fontname (name, size, style, charset)
       char *name;
       int size;
       Style style;
!      char *charset;
  {
    char foundry[32], family[32], cs[32];
    char xf[256], *result, *p;
  
!   if (sscanf (name, "%31[^-]-%31[^-]-%31s", foundry, family, cs) == 3)
!     charset = cs;
!   else
      {
        strcpy(foundry, "Apple");
        strcpy(family, name);
      }
  
    sprintf(xf, "-%s-%s-%s-%c-normal--%d-%d-75-75-m-%d-%s",
            foundry, family, style & bold ? "bold" : "medium",
!         style & italic ? 'i' : 'r', size, size * 10, size * 10, charset);
  
    result = (char *) xmalloc (strlen (xf) + 1);
    strcpy (result, xf);
***************
*** 6050,6059 ****
     "ETL-Fixed-iso8859-1", "ETL-Fixed-koi8-r", etc.  Both types of font
     names are handled accordingly.  */
  static void
! x_font_name_to_mac_font_name (char *xf, char *mf)
  {
!   char foundry[32], family[32], weight[20], slant[2], cs[32];
!   Lisp_Object coding_system = Qnil;
    struct coding_system coding;
  
    strcpy (mf, "");
--- 5946,5958 ----
     "ETL-Fixed-iso8859-1", "ETL-Fixed-koi8-r", etc.  Both types of font
     names are handled accordingly.  */
  static void
! x_font_name_to_mac_font_name (xf, mf, mf_decoded, style, cs)
!      char *xf, *mf, *mf_decoded;
!      Style *style;
!      char *cs;
  {
!   char foundry[32], family[32], weight[20], slant[2], *p;
!   Lisp_Object charset_info, coding_system = Qnil;
    struct coding_system coding;
  
    strcpy (mf, "");
***************
*** 6064,6093 ****
                foundry, family, weight, slant, cs) != 5)
      return;
  
!   if (strcmp (cs, "big5-0") == 0)
!     coding_system = Qbig5;
!   else if (strcmp (cs, "gb2312.1980-0") == 0)
!     coding_system = Qcn_gb;
!   else if (strcmp (cs, "jisx0208.1983-sjis") == 0
!          || strcmp (cs, "jisx0201.1976-0") == 0)
!     coding_system = Qsjis;
!   else if (strcmp (cs, "ksc5601.1989-0") == 0)
!     coding_system = Qeuc_kr;
!   else if (strcmp (cs, "mac-roman") == 0
!          || strcmp (cs, "mac-cyrillic") == 0
!          || strcmp (cs, "mac-centraleurroman") == 0
!          || strcmp (cs, "adobe-fontspecific") == 0)
!     strcpy (mf, family);
    else
!     sprintf (mf, "%s-%s-%s", foundry, family, cs);
  
!   if (!NILP (coding_system))
      {
        setup_coding_system (coding_system, &coding);
        coding.src_multibyte = 1;
        coding.dst_multibyte = 1;
        coding.mode |= CODING_MODE_LAST_BLOCK;
!       encode_coding (&coding, family, mf, strlen (family), sizeof (Str32) - 
1);
        mf[coding.produced] = '\0';
      }
  }
--- 5963,5998 ----
                foundry, family, weight, slant, cs) != 5)
      return;
  
!   *style = normal;
!   if (strcmp (weight, "bold") == 0)
!     *style |= bold;
!   if (*slant == 'i')
!     *style |= italic;
! 
!   charset_info = Fassoc (build_string (cs), Vmac_charset_info_alist);
!   if (!NILP (charset_info))
!     {
!       strcpy (mf_decoded, family);
!       coding_system = Fcar (Fcdr (Fcdr (charset_info)));
!     }
    else
!     sprintf (mf_decoded, "%s-%s-%s", foundry, family, cs);
  
!   for (p = mf_decoded; *p; p++)
!     if (!isascii (*p) || iscntrl (*p))
!       break;
! 
!   if (*p == '\0'
!       || NILP (coding_system) || NILP (Fcoding_system_p (coding_system)))
!     strcpy (mf, mf_decoded);
!   else
      {
        setup_coding_system (coding_system, &coding);
        coding.src_multibyte = 1;
        coding.dst_multibyte = 1;
        coding.mode |= CODING_MODE_LAST_BLOCK;
!       encode_coding (&coding, mf_decoded, mf,
!                    strlen (mf_decoded), sizeof (Str32) - 1);
        mf[coding.produced] = '\0';
      }
  }
***************
*** 6122,6302 ****
  init_font_name_table ()
  {
  #if TARGET_API_MAC_CARBON
!   SInt32 sv;
  
!   if (Gestalt (gestaltSystemVersion, &sv) == noErr && sv >= 0x1000)
      {
!       FMFontFamilyIterator ffi;
!       FMFontFamilyInstanceIterator ffii;
!       FMFontFamily ff;
! 
!       /* Create a dummy instance iterator here to avoid creating and
!        destroying it in the loop.  */
!       if (FMCreateFontFamilyInstanceIterator (0, &ffii) != noErr)
!       return;
!       /* Create an iterator to enumerate the font families.  */
!       if (FMCreateFontFamilyIterator (NULL, NULL, kFMDefaultOptions, &ffi)
!         != noErr)
!       {
!         FMDisposeFontFamilyInstanceIterator (&ffii);
!         return;
!       }
  
!       while (FMGetNextFontFamily (&ffi, &ff) == noErr)
!       {
!         Str255 name;
!         FMFont font;
!         FMFontStyle style;
!         FMFontSize size;
!         TextEncoding encoding;
!         TextEncodingBase sc;
  
!         if (FMGetFontFamilyName (ff, name) != noErr)
!           break;
!         p2cstr (name);
!         if (*name == '.')
!           continue;
  
!         if (FMGetFontFamilyTextEncoding (ff, &encoding) != noErr)
!           break;
!         sc = GetTextEncodingBase (encoding);
!         decode_mac_font_name (name, sizeof (name), sc);
  
!         /* Point the instance iterator at the current font family.  */
!         if (FMResetFontFamilyInstanceIterator (ff, &ffii) != noErr)
!           break;
  
!         while (FMGetNextFontFamilyInstance (&ffii, &font, &style, &size)
!                == noErr)
            {
!             /* Both jisx0208.1983-sjis and jisx0201.1976-0 parts are
!                contained in Apple Japanese (SJIS) font.  */
!           again:
              if (size == 0)
                {
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
!                                                               style, sc));
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
!                                                               italic, sc));
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
!                                                               bold, sc));
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
                                                                italic | bold,
!                                                               sc));
                }
              else
-               add_font_name_table_entry (mac_to_x_fontname (name, size,
-                                                             style, sc));
-             if (sc == smJapanese)
                {
!                 sc = -smJapanese;
!                 goto again;
                }
-             else if (sc == -smJapanese)
-               sc = smJapanese;
            }
        }
- 
-       /* Dispose of the iterators.  */
-       FMDisposeFontFamilyIterator (&ffi);
-       FMDisposeFontFamilyInstanceIterator (&ffii);
      }
-   else
-     {
- #endif  /* TARGET_API_MAC_CARBON */
-       GrafPtr port;
-       SInt16 fontnum, old_fontnum;
-       int num_mac_fonts = CountResources('FOND');
-       int i, j;
-       Handle font_handle, font_handle_2;
-       short id, scriptcode;
-       ResType type;
-       Str32 name;
-       struct FontAssoc *fat;
-       struct AsscEntry *assc_entry;
  
!       GetPort (&port);  /* save the current font number used */
! #if TARGET_API_MAC_CARBON
!       old_fontnum = GetPortTextFont (port);
! #else
!       old_fontnum = port->txFont;
! #endif
  
!       for (i = 1; i <= num_mac_fonts; i++)  /* get all available fonts */
        {
!         font_handle = GetIndResource ('FOND', i);
!         if (!font_handle)
!           continue;
! 
!         GetResInfo (font_handle, &id, &type, name);
!         GetFNum (name, &fontnum);
!         p2cstr (name);
!         if (fontnum == 0)
!           continue;
! 
!         TextFont (fontnum);
!         scriptcode = FontToScript (fontnum);
!         decode_mac_font_name (name, sizeof (name), scriptcode);
!         do
            {
!             HLock (font_handle);
  
!             if (GetResourceSizeOnDisk (font_handle)
!                 >= sizeof (struct FamRec))
                {
!                 fat = (struct FontAssoc *) (*font_handle
!                                             + sizeof (struct FamRec));
!                 assc_entry
!                   = (struct AsscEntry *) (*font_handle
!                                           + sizeof (struct FamRec)
!                                           + sizeof (struct FontAssoc));
  
!                 for (j = 0; j <= fat->numAssoc; j++, assc_entry++)
                    {
!                     if (font_name_table_size == 0)
!                       {
!                         font_name_table_size = 16;
!                         font_name_table = (char **)
!                           xmalloc (font_name_table_size * sizeof (char *));
!                       }
!                     else if (font_name_count >= font_name_table_size)
!                       {
!                         font_name_table_size += 16;
!                         font_name_table = (char **)
!                           xrealloc (font_name_table,
!                                     font_name_table_size * sizeof (char *));
!                       }
!                     font_name_table[font_name_count++]
!                       = mac_to_x_fontname (name,
!                                            assc_entry->fontSize,
!                                            assc_entry->fontStyle,
!                                            scriptcode);
!                     /* Both jisx0208.1983-sjis and jisx0201.1976-0
!                        parts are contained in Apple Japanese (SJIS)
!                        font.  */
!                     if (smJapanese == scriptcode)
!                       {
!                         font_name_table[font_name_count++]
!                           = mac_to_x_fontname (name,
!                                                assc_entry->fontSize,
!                                                assc_entry->fontStyle,
!                                                -smJapanese);
!                       }
                    }
                }
- 
-             HUnlock (font_handle);
-             font_handle_2 = GetNextFOND (font_handle);
-             ReleaseResource (font_handle);
-             font_handle = font_handle_2;
            }
-         while (ResError () == noErr && font_handle);
-       }
  
!       TextFont (old_fontnum);
! #if TARGET_API_MAC_CARBON
      }
! #endif  /* TARGET_API_MAC_CARBON */
  }
  
  
--- 6027,6206 ----
  init_font_name_table ()
  {
  #if TARGET_API_MAC_CARBON
!   FMFontFamilyIterator ffi;
!   FMFontFamilyInstanceIterator ffii;
!   FMFontFamily ff;
!   Lisp_Object text_encoding_info_alist;
!   struct gcpro gcpro1;
! 
!   /* Create a dummy instance iterator here to avoid creating and
!      destroying it in the loop.  */
!   if (FMCreateFontFamilyInstanceIterator (0, &ffii) != noErr)
!     return;
!   /* Create an iterator to enumerate the font families.  */
!   if (FMCreateFontFamilyIterator (NULL, NULL, kFMDefaultOptions, &ffi)
!       != noErr)
!     {
!       FMDisposeFontFamilyInstanceIterator (&ffii);
!       return;
!     }
  
!   text_encoding_info_alist = create_text_encoding_info_alist ();
! 
!   GCPRO1 (text_encoding_info_alist);
! 
!   while (FMGetNextFontFamily (&ffi, &ff) == noErr)
      {
!       Str255 name;
!       FMFont font;
!       FMFontStyle style;
!       FMFontSize size;
!       TextEncoding encoding;
!       TextEncodingBase sc;
!       Lisp_Object text_encoding_info;
  
!       if (FMGetFontFamilyName (ff, name) != noErr)
!       break;
!       p2cstr (name);
!       if (*name == '.')
!       continue;
  
!       if (FMGetFontFamilyTextEncoding (ff, &encoding) != noErr)
!       break;
!       sc = GetTextEncodingBase (encoding);
!       text_encoding_info = assq_no_quit (make_number (sc),
!                                        text_encoding_info_alist);
!       if (!NILP (text_encoding_info))
!       decode_mac_font_name (name, sizeof (name),
!                             XCAR (XCDR (text_encoding_info)));
!       else
!       text_encoding_info = assq_no_quit (make_number (kTextEncodingMacRoman),
!                                          text_encoding_info_alist);
  
!       /* Point the instance iterator at the current font family.  */
!       if (FMResetFontFamilyInstanceIterator (ff, &ffii) != noErr)
!       break;
  
!       while (FMGetNextFontFamilyInstance (&ffii, &font, &style, &size)
!            == noErr)
!       {
!         Lisp_Object rest = XCDR (XCDR (text_encoding_info));
  
!         for (; !NILP (rest); rest = XCDR (rest))
            {
!             char *cs = SDATA (XCAR (rest));
! 
              if (size == 0)
                {
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
!                                                               style, cs));
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
!                                                               italic, cs));
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
!                                                               bold, cs));
                  add_font_name_table_entry (mac_to_x_fontname (name, size,
                                                                italic | bold,
!                                                               cs));
                }
              else
                {
!                 add_font_name_table_entry (mac_to_x_fontname (name, size,
!                                                               style, cs));
                }
            }
        }
      }
  
!   UNGCPRO;
! 
!   /* Dispose of the iterators.  */
!   FMDisposeFontFamilyIterator (&ffi);
!   FMDisposeFontFamilyInstanceIterator (&ffii);
! #else  /* !TARGET_API_MAC_CARBON */
!   GrafPtr port;
!   SInt16 fontnum, old_fontnum;
!   int num_mac_fonts = CountResources('FOND');
!   int i, j;
!   Handle font_handle, font_handle_2;
!   short id, scriptcode;
!   ResType type;
!   Str32 name;
!   struct FontAssoc *fat;
!   struct AsscEntry *assc_entry;
!   Lisp_Object text_encoding_info_alist, text_encoding_info;
!   struct gcpro gcpro1;
! 
!   GetPort (&port);  /* save the current font number used */
!   old_fontnum = port->txFont;
! 
!   text_encoding_info_alist = create_text_encoding_info_alist ();
  
!   GCPRO1 (text_encoding_info_alist);
! 
!   for (i = 1; i <= num_mac_fonts; i++)  /* get all available fonts */
!     {
!       font_handle = GetIndResource ('FOND', i);
!       if (!font_handle)
!       continue;
! 
!       GetResInfo (font_handle, &id, &type, name);
!       GetFNum (name, &fontnum);
!       p2cstr (name);
!       if (fontnum == 0)
!       continue;
! 
!       TextFont (fontnum);
!       scriptcode = FontToScript (fontnum);
!       text_encoding_info = assq_no_quit (make_number (scriptcode),
!                                        text_encoding_info_alist);
!       if (!NILP (text_encoding_info))
!       decode_mac_font_name (name, sizeof (name),
!                             XCAR (XCDR (text_encoding_info)));
!       else
!       text_encoding_info = assq_no_quit (make_number (smRoman),
!                                          text_encoding_info_alist);
!       do
        {
!         HLock (font_handle);
! 
!         if (GetResourceSizeOnDisk (font_handle)
!             >= sizeof (struct FamRec))
            {
!             fat = (struct FontAssoc *) (*font_handle
!                                         + sizeof (struct FamRec));
!             assc_entry
!               = (struct AsscEntry *) (*font_handle
!                                       + sizeof (struct FamRec)
!                                       + sizeof (struct FontAssoc));
  
!             for (j = 0; j <= fat->numAssoc; j++, assc_entry++)
                {
!                 Lisp_Object rest = XCDR (XCDR (text_encoding_info));
  
!                 for (; !NILP (rest); rest = XCDR (rest))
                    {
!                     char *cs = SDATA (XCAR (rest));
! 
!                     add_font_name_table_entry (mac_to_x_fontname (name,
!                                                                   
assc_entry->fontSize,
!                                                                   
assc_entry->fontStyle,
!                                                                   cs));
                    }
                }
            }
  
!         HUnlock (font_handle);
!         font_handle_2 = GetNextFOND (font_handle);
!         ReleaseResource (font_handle);
!         font_handle = font_handle_2;
!       }
!       while (ResError () == noErr && font_handle);
      }
! 
!   UNGCPRO;
! 
!   TextFont (old_fontnum);
! #endif  /* !TARGET_API_MAC_CARBON */
  }
  
  
***************
*** 6384,6390 ****
        ptr++;
        if (i == *field)
          {
!           if ('1' <= *ptr && *ptr <= '9')
              {
                *val = *ptr++ - '0';
                while ('0' <= *ptr && *ptr <= '9' && *val < 10000)
--- 6288,6294 ----
        ptr++;
        if (i == *field)
          {
!           if ('0' <= *ptr && *ptr <= '9')
              {
                *val = *ptr++ - '0';
                while ('0' <= *ptr && *ptr <= '9' && *val < 10000)
***************
*** 6402,6422 ****
  
    if (i == 14 && ptr == NULL)
      {
!       if (scl_val[XLFD_SCL_POINT_SIZE] > 0)
!       {
!         scl_val[XLFD_SCL_PIXEL_SIZE] = scl_val[XLFD_SCL_POINT_SIZE] / 10;
!         scl_val[XLFD_SCL_AVGWIDTH] = scl_val[XLFD_SCL_POINT_SIZE];
!       }
!       else if (scl_val[XLFD_SCL_PIXEL_SIZE] > 0)
!       {
!         scl_val[XLFD_SCL_POINT_SIZE] =
!           scl_val[XLFD_SCL_AVGWIDTH] = scl_val[XLFD_SCL_PIXEL_SIZE] * 10;
!       }
!       else if (scl_val[XLFD_SCL_AVGWIDTH] > 0)
!       {
!         scl_val[XLFD_SCL_PIXEL_SIZE] = scl_val[XLFD_SCL_AVGWIDTH] / 10;
!         scl_val[XLFD_SCL_POINT_SIZE] = scl_val[XLFD_SCL_AVGWIDTH];
!       }
      }
    else
      scl_val[XLFD_SCL_PIXEL_SIZE] = -1;
--- 6306,6326 ----
  
    if (i == 14 && ptr == NULL)
      {
!       if (scl_val[XLFD_SCL_PIXEL_SIZE] < 0)
!       scl_val[XLFD_SCL_PIXEL_SIZE] =
!         (scl_val[XLFD_SCL_POINT_SIZE] > 0 ? scl_val[XLFD_SCL_POINT_SIZE] / 10
!          : (scl_val[XLFD_SCL_AVGWIDTH] > 0 ? scl_val[XLFD_SCL_AVGWIDTH] / 10
!             : -1));
!       if (scl_val[XLFD_SCL_POINT_SIZE] < 0)
!       scl_val[XLFD_SCL_POINT_SIZE] =
!         (scl_val[XLFD_SCL_PIXEL_SIZE] > 0 ? scl_val[XLFD_SCL_PIXEL_SIZE] * 10
!          : (scl_val[XLFD_SCL_AVGWIDTH] > 0 ? scl_val[XLFD_SCL_AVGWIDTH]
!             : -1));
!       if (scl_val[XLFD_SCL_AVGWIDTH] < 0)
!       scl_val[XLFD_SCL_AVGWIDTH] =
!         (scl_val[XLFD_SCL_PIXEL_SIZE] > 0 ? scl_val[XLFD_SCL_PIXEL_SIZE] * 10
!          : (scl_val[XLFD_SCL_POINT_SIZE] > 0 ? scl_val[XLFD_SCL_POINT_SIZE]
!             : -1));
      }
    else
      scl_val[XLFD_SCL_PIXEL_SIZE] = -1;
***************
*** 6507,6555 ****
    return font_list;
  }
  
! /* Return a list of at most MAXNAMES font specs matching the one in
!    PATTERN.  Cache matching fonts for patterns in
!    dpyinfo->name_list_element to avoid looking them up again by
!    calling mac_font_pattern_match (slow).  Return as many matching
!    fonts as possible if MAXNAMES = -1.  */
  
  Lisp_Object
! x_list_fonts (struct frame *f,
!               Lisp_Object pattern,
!               int size,
!               int maxnames)
  {
!   Lisp_Object newlist = Qnil, tem, key;
!   struct mac_display_info *dpyinfo = f ? FRAME_MAC_DISPLAY_INFO (f) : NULL;
  
!   if (dpyinfo)
      {
        tem = XCAR (XCDR (dpyinfo->name_list_element));
        key = Fcons (pattern, make_number (maxnames));
  
!       newlist = Fassoc (key, tem);
!       if (!NILP (newlist))
        {
!         newlist = Fcdr_safe (newlist);
          goto label_cached;
        }
-     }
  
!   BLOCK_INPUT;
!   newlist = mac_do_list_fonts (SDATA (pattern), maxnames);
!   UNBLOCK_INPUT;
  
!   /* MAC_TODO: add code for matching outline fonts here */
  
!   if (dpyinfo)
!     {
        XSETCAR (XCDR (dpyinfo->name_list_element),
!              Fcons (Fcons (key, newlist),
                      XCAR (XCDR (dpyinfo->name_list_element))));
      }
-  label_cached:
  
!   return newlist;
  }
  
  
--- 6411,6472 ----
    return font_list;
  }
  
! /* Return a list of names of available fonts matching PATTERN on frame F.
! 
!    Frame F null means we have not yet created any frame on Mac, and
!    consult the first display in x_display_list.  MAXNAMES sets a limit
!    on how many fonts to match.  */
  
  Lisp_Object
! x_list_fonts (f, pattern, size, maxnames)
!      struct frame *f;
!      Lisp_Object pattern;
!      int size, maxnames;
  {
!   Lisp_Object list = Qnil, patterns, tem, key;
!   struct mac_display_info *dpyinfo
!     = f ? FRAME_MAC_DISPLAY_INFO (f) : x_display_list;
! 
!   xassert (size <= 0);
! 
!   patterns = Fassoc (pattern, Valternate_fontname_alist);
!   if (NILP (patterns))
!     patterns = Fcons (pattern, Qnil);
  
!   for (; CONSP (patterns); patterns = XCDR (patterns))
      {
+       pattern = XCAR (patterns);
+ 
+       if (!STRINGP (pattern))
+         continue;
+ 
        tem = XCAR (XCDR (dpyinfo->name_list_element));
        key = Fcons (pattern, make_number (maxnames));
  
!       list = Fassoc (key, tem);
!       if (!NILP (list))
        {
!         list = Fcdr_safe (list);
!         /* We have a cashed list.  Don't have to get the list again.  */
          goto label_cached;
        }
  
!       BLOCK_INPUT;
!       list = mac_do_list_fonts (SDATA (pattern), maxnames);
!       UNBLOCK_INPUT;
  
!       /* MAC_TODO: add code for matching outline fonts here */
  
!       /* Now store the result in the cache.  */
        XSETCAR (XCDR (dpyinfo->name_list_element),
!              Fcons (Fcons (key, list),
                      XCAR (XCDR (dpyinfo->name_list_element))));
+ 
+     label_cached:
+       if (NILP (list)) continue; /* Try the remaining alternatives.  */
      }
  
!   return list;
  }
  
  
***************
*** 6668,6674 ****
  }
  
  
! const int kDefaultFontSize = 9;
  
  
  /* XLoadQueryFont creates and returns an internal representation for a
--- 6585,6591 ----
  }
  
  
! const int kDefaultFontSize = 12;
  
  
  /* XLoadQueryFont creates and returns an internal representation for a
***************
*** 6680,6696 ****
  static MacFontStruct *
  XLoadQueryFont (Display *dpy, char *fontname)
  {
!   int i, size, is_two_byte_font, char_width;
    char *name;
    GrafPtr port;
    SInt16 old_fontnum, old_fontsize;
    Style old_fontface;
!   Str32 mfontname;
    SInt16 fontnum;
!   Style fontface = normal;
    MacFontStruct *font;
    FontInfo the_fontinfo;
!   char s_weight[7], c_slant;
  
    if (is_fully_specified_xlfd (fontname))
      name = fontname;
--- 6597,6621 ----
  static MacFontStruct *
  XLoadQueryFont (Display *dpy, char *fontname)
  {
!   int i, size, point_size, avgwidth, is_two_byte_font, char_width;
    char *name;
    GrafPtr port;
    SInt16 old_fontnum, old_fontsize;
    Style old_fontface;
!   Str32 mfontname, mfontname_decoded, charset;
    SInt16 fontnum;
!   Style fontface;
! #if TARGET_API_MAC_CARBON
!   TextEncoding encoding;
!   int scriptcode;
! #else
!   short scriptcode;
! #endif
    MacFontStruct *font;
    FontInfo the_fontinfo;
! #ifdef MAC_OSX
!   UInt32 old_flags, new_flags;
! #endif
  
    if (is_fully_specified_xlfd (fontname))
      name = fontname;
***************
*** 6715,6760 ****
    old_fontface = port->txFace;
  #endif
  
!   if (sscanf (name, 
"-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]--%d-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]-%*s", 
&size) != 1)
      size = kDefaultFontSize;
  
!   if (sscanf (name, 
"-%*[^-]-%*[^-]-%6[^-]-%*c-%*[^-]--%*[^-]-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]-%*s", 
s_weight) == 1)
!     if (strcmp (s_weight, "bold") == 0)
!       fontface |= bold;
! 
!   if (sscanf (name, 
"-%*[^-]-%*[^-]-%*[^-]-%c-%*[^-]--%*[^-]-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]-%*s", 
&c_slant) == 1)
!     if (c_slant == 'i')
!       fontface |= italic;
! 
!   x_font_name_to_mac_font_name (name, mfontname);
    c2pstr (mfontname);
    GetFNum (mfontname, &fontnum);
    if (fontnum == 0)
      return NULL;
  
    font = (MacFontStruct *) xmalloc (sizeof (struct MacFontStruct));
  
-   font->fontname = (char *) xmalloc (strlen (name) + 1);
-   bcopy (name, font->fontname, strlen (name) + 1);
- 
    font->mac_fontnum = fontnum;
    font->mac_fontsize = size;
    font->mac_fontface = fontface;
!   font->mac_scriptcode = FontToScript (fontnum);
  
    /* Apple Japanese (SJIS) font is listed as both
       "*-jisx0208.1983-sjis" (Japanese script) and "*-jisx0201.1976-0"
       (Roman script) in init_font_name_table ().  The latter should be
       treated as a one-byte font.  */
!   {
!     char cs[32];
  
!     if (sscanf (name,
!               
"-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]--%*[^-]-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]-%31s",
!               cs) == 1
!       && 0 == strcmp (cs, "jisx0201.1976-0"))
!       font->mac_scriptcode = smRoman;
!   }
  
    is_two_byte_font = font->mac_scriptcode == smJapanese ||
                       font->mac_scriptcode == smTradChinese ||
--- 6640,6689 ----
    old_fontface = port->txFace;
  #endif
  
!   if (sscanf (name, 
"-%*[^-]-%*[^-]-%*[^-]-%*c-%*[^-]--%d-%d-%*[^-]-%*[^-]-%*c-%d-%*s", &size, 
&point_size, &avgwidth) != 3)
!     size = 0;
!   else
!     {
!       if (size == 0)
!       if (point_size > 0)
!         size = point_size / 10;
!       else if (avgwidth > 0)
!         size = avgwidth / 10;
!     }
!   if (size == 0)
      size = kDefaultFontSize;
  
!   x_font_name_to_mac_font_name (name, mfontname, mfontname_decoded,
!                               &fontface, charset);
    c2pstr (mfontname);
+ #if TARGET_API_MAC_CARBON
+   fontnum = FMGetFontFamilyFromName (mfontname);
+   if (fontnum == kInvalidFontFamily
+       || FMGetFontFamilyTextEncoding (fontnum, &encoding) != noErr)
+     return NULL;
+   scriptcode = GetTextEncodingBase (encoding);
+ #else
    GetFNum (mfontname, &fontnum);
    if (fontnum == 0)
      return NULL;
+   scriptcode = FontToScript (fontnum);
+ #endif
  
    font = (MacFontStruct *) xmalloc (sizeof (struct MacFontStruct));
  
    font->mac_fontnum = fontnum;
    font->mac_fontsize = size;
    font->mac_fontface = fontface;
!   font->mac_scriptcode = scriptcode;
  
    /* Apple Japanese (SJIS) font is listed as both
       "*-jisx0208.1983-sjis" (Japanese script) and "*-jisx0201.1976-0"
       (Roman script) in init_font_name_table ().  The latter should be
       treated as a one-byte font.  */
!   if (scriptcode == smJapanese && strcmp (charset, "jisx0201.1976-0") == 0)
!     font->mac_scriptcode = smRoman;
  
!   font->full_name = mac_to_x_fontname (mfontname_decoded, size, fontface, 
charset);
  
    is_two_byte_font = font->mac_scriptcode == smJapanese ||
                       font->mac_scriptcode == smTradChinese ||
***************
*** 6879,6885 ****
       struct mac_display_info *dpyinfo;
       XFontStruct *font;
  {
!   xfree (font->fontname);
    if (font->per_char)
      xfree (font->per_char);
    xfree (font);
--- 6808,6814 ----
       struct mac_display_info *dpyinfo;
       XFontStruct *font;
  {
!   xfree (font->full_name);
    if (font->per_char)
      xfree (font->per_char);
    xfree (font);
***************
*** 6919,6924 ****
--- 6848,6855 ----
                              SDATA (XCAR (tail)))))
            return (dpyinfo->font_table + i);
      }
+   else
+     return NULL;
  
    /* Load the font and add it to the table.  */
    {
***************
*** 6928,6940 ****
      unsigned long value;
      int i;
  
!     /* If we have found fonts by x_list_font, load one of them.  If
!        not, we still try to load a font by the name given as FONTNAME
!        because XListFonts (called in x_list_font) of some X server has
!        a bug of not finding a font even if the font surely exists and
!        is loadable by XLoadQueryFont.  */
!     if (size > 0 && !NILP (font_names))
!       fontname = (char *) SDATA (XCAR (font_names));
  
      BLOCK_INPUT;
      font = (MacFontStruct *) XLoadQueryFont (FRAME_MAC_DISPLAY (f), fontname);
--- 6859,6865 ----
      unsigned long value;
      int i;
  
!     fontname = (char *) SDATA (XCAR (font_names));
  
      BLOCK_INPUT;
      font = (MacFontStruct *) XLoadQueryFont (FRAME_MAC_DISPLAY (f), fontname);
***************
*** 6967,6974 ****
      bzero (fontp, sizeof (*fontp));
      fontp->font = font;
      fontp->font_idx = i;
!     fontp->name = (char *) xmalloc (strlen (font->fontname) + 1);
!     bcopy (font->fontname, fontp->name, strlen (font->fontname) + 1);
  
      if (font->min_bounds.width == font->max_bounds.width)
        {
--- 6892,6899 ----
      bzero (fontp, sizeof (*fontp));
      fontp->font = font;
      fontp->font_idx = i;
!     fontp->name = (char *) xmalloc (strlen (fontname) + 1);
!     bcopy (fontname, fontp->name, strlen (fontname) + 1);
  
      if (font->min_bounds.width == font->max_bounds.width)
        {
***************
*** 6999,7005 ****
          fontp->average_width = FONT_WIDTH (font);
        }
  
!     fontp->full_name = fontp->name;
  
      fontp->size = font->max_bounds.width;
      fontp->height = FONT_HEIGHT (font);
--- 6924,6931 ----
          fontp->average_width = FONT_WIDTH (font);
        }
  
!     fontp->full_name = (char *) xmalloc (strlen (font->full_name) + 1);
!     bcopy (font->full_name, fontp->full_name, strlen (font->full_name) + 1);
  
      fontp->size = font->max_bounds.width;
      fontp->height = FONT_HEIGHT (font);
***************
*** 9810,9827 ****
    Qmac_ready_for_drag_n_drop = intern ("mac-ready-for-drag-n-drop");
    staticpro (&Qmac_ready_for_drag_n_drop);
  
-   Qbig5 = intern ("big5");
-   staticpro (&Qbig5);
- 
-   Qcn_gb = intern ("cn-gb");
-   staticpro (&Qcn_gb);
- 
-   Qsjis = intern ("sjis");
-   staticpro (&Qsjis);
- 
-   Qeuc_kr = intern ("euc-kr");
-   staticpro (&Qeuc_kr);
- 
    DEFVAR_LISP ("x-toolkit-scroll-bars", &Vx_toolkit_scroll_bars,
               doc: /* If not nil, Emacs uses toolkit scroll bars.  */);
    Vx_toolkit_scroll_bars = Qt;
--- 9736,9741 ----
***************
*** 9888,9893 ****
--- 9802,9823 ----
  The text will be rendered using Core Graphics text rendering which
  may anti-alias the text.  */);
    Vmac_use_core_graphics = Qnil;
+ 
+   /* Register an entry for `mac-roman' so that it can be used when
+      creating the terminal frame on Mac OS 9 before loading
+      term/mac-win.elc.  */
+   DEFVAR_LISP ("mac-charset-info-alist", &Vmac_charset_info_alist,
+                doc: /* Alist linking Emacs character sets to Mac text 
encoding and Emacs coding system.
+ Each entry should be of the form:
+ 
+    (CHARSET-NAME TEXT-ENCODING CODING-SYSTEM)
+ 
+ where CHARSET-NAME is a string used in font names to identify the
+ charset, TEXT-ENCODING is a TextEncodingBase value, and CODING_SYSTEM
+ is a coding system corresponding to TEXT-ENCODING.  */);
+   Vmac_charset_info_alist =
+     Fcons (list3 (build_string ("mac-roman"),
+                 make_number (smRoman), Qnil), Qnil);
  }
  
  /* arch-tag: f2259165-4454-4c04-a029-a133c8af7b5b




reply via email to

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