(mdatabase__dir_list, M_database_hook)
[m17n/m17n-lib.git] / src / face.c
index ffd0487..9e7ecc7 100644 (file)
@@ -86,6 +86,7 @@
 #include <string.h>
 #include <ctype.h>
 
+#include "config.h"
 #include "m17n-gui.h"
 #include "m17n-misc.h"
 #include "internal.h"
 
 static M17NObjectArray face_table;
 
-static MSymbol Mlatin;
+MSymbol Mlatin;
 
 static MSymbol M_face_prop_index;
 
@@ -482,8 +483,8 @@ mface__init ()
   mface__default->property[MFACE_ADSTYLE] = msymbol ("");
   mface__default->property[MFACE_SIZE] = (void *) 120;
   mface__default->property[MFACE_FONTSET] = mfontset (NULL);
-  mface__default->property[MFACE_FOREGROUND] = msymbol ("white");
-  mface__default->property[MFACE_FONTSET] = msymbol ("black");
+  mface__default->property[MFACE_FOREGROUND] = msymbol ("black");
+  mface__default->property[MFACE_BACKGROUND] = msymbol ("white");
   mface__default->property[MFACE_HLINE] = hline;
   mface__default->property[MFACE_BOX] = box;
   mface__default->property[MFACE_VIDEOMODE] = Mnormal;
@@ -496,14 +497,13 @@ mface__init ()
   mface_reverse_video->property[MFACE_VIDEOMODE] = (void *) Mreverse;
 
   {
-    MFaceHLineProp *hline_prop;
+    MFaceHLineProp hline_prop;
 
-    MSTRUCT_MALLOC (hline_prop, MERROR_FACE);
-    hline_prop->type = MFACE_HLINE_UNDER;
-    hline_prop->width = 1;
-    hline_prop->color = Mnil;
+    hline_prop.type = MFACE_HLINE_UNDER;
+    hline_prop.width = 1;
+    hline_prop.color = Mnil;
     mface_underline = mface ();
-    mface_underline->property[MFACE_HLINE] = (void *) hline_prop;
+    mface_put_prop (mface_underline, Mhline, &hline_prop);
   }
 
   mface_medium = mface ();
@@ -600,8 +600,7 @@ mface__fini ()
     base faces pointed by FACES on the frame FRAME.  */
 
 MRealizedFace *
-mface__realize (MFrame *frame, MFace **faces, int num,
-               MSymbol language, MSymbol charset, int size)
+mface__realize (MFrame *frame, MFace **faces, int num, int size)
 {
   MRealizedFace *rface;
   MRealizedFont *rfont;
@@ -611,7 +610,7 @@ mface__realize (MFrame *frame, MFace **faces, int num,
   MGlyph g;
   MFaceHookFunc func;
 
-  if (num == 0 && language == Mnil && charset == Mnil && frame->rface)
+  if (num == 0 && frame->rface)
     return frame->rface;
 
   for (i = 0; i < MFACE_PROPERTY_MAX; i++)
@@ -650,16 +649,16 @@ mface__realize (MFrame *frame, MFace **faces, int num,
   rface->rfontset = mfont__realize_fontset (frame,
                                            (MFontset *) props[MFACE_FONTSET],
                                            &merged_face);
+  g.type = GLYPH_SPACE;
   g.c = ' ';
   num = 1;
   rfont = mfont__lookup_fontset (rface->rfontset, &g, &num,
-                                msymbol ("latin"), language, Mnil,
-                                size);
-
+                                Mlatin, Mnil, Mnil, size);
   if (rfont)
     {
       rface->rfont = rfont;
       g.otf_encoded = 0;
+      work_gstring.frame = frame;
       work_gstring.glyphs[0] = g;
       work_gstring.glyphs[0].rface = rface;
       work_gstring.glyphs[1].code = MCHAR_INVALID_CODE;
@@ -682,7 +681,7 @@ mface__realize (MFrame *frame, MFace **faces, int num,
   if (rface->box && rface->box->width == 0)
     rface->box = NULL;
   rface->ascii_rface = rface;
-  mwin__realize_face (rface);
+  (*frame->driver->realize_face) (rface);
 
   func = (MFaceHookFunc) rface->face.property[MFACE_HOOK_FUNC];
   if (func && func != noop_hook)
@@ -708,53 +707,46 @@ MGlyph *
 mface__for_chars (MSymbol script, MSymbol language, MSymbol charset,
                  MGlyph *from_g, MGlyph *to_g, int size)
 {
-  MRealizedFace *rface = from_g->rface->ascii_rface, *new;
   MRealizedFont *rfont;
-  int num = to_g - from_g, i;
-  MPlist *plist;
+  int num = to_g - from_g;
 
   rfont = mfont__lookup_fontset (from_g->rface->rfontset, from_g, &num,
                                 script, language, charset, size);
   if (! rfont)
+    num = 1;
+  
+  to_g = from_g + num;
+  while (from_g < to_g)
     {
-      if (rface->rfont)
-       MPLIST_DO (plist, rface->non_ascii_list)
-         {
-           rface = MPLIST_VAL (plist);
-           if (! rface->rfont)
-             break;
-         }
-      num = 1;
-      goto finish;
-    }
-  if (rface->rfont == rfont)
-    goto finish;
+      MGlyph *g = from_g;
+      MRealizedFace *rface = from_g++->rface;
 
-  MPLIST_DO (plist, rface->non_ascii_list)
-    if (((MRealizedFace *) MPLIST_VAL (plist))->rfont == rfont)
-      break;
-  if (! MPLIST_TAIL_P (plist))
-    {
-      rface = MPLIST_VAL (plist);
-      goto finish;
+      while (from_g < to_g && rface == from_g->rface) from_g++;
+      if (rface->rfont != rfont)
+       {
+         MPlist *plist = mplist_find_by_value (rface->non_ascii_list, rfont);
+         MRealizedFace *new;
+
+         if (plist)
+           new = MPLIST_VAL (plist);
+         else
+           {
+             MSTRUCT_MALLOC (new, MERROR_FACE);
+             mplist_push (rface->non_ascii_list, Mt, new);
+             *new = *rface;
+             new->rfont = rfont;
+             new->non_ascii_list = NULL;
+             if (rfont)
+               {
+                 new->ascent = rfont->ascent;
+                 new->descent = rfont->descent;
+               }
+           }
+         while (g < from_g)
+           g++->rface = new;
+       }
     }
-
-  MSTRUCT_MALLOC (new, MERROR_FACE);
-  mplist_push (rface->non_ascii_list, Mt, new);
-  *new = *rface;
-  rface = new;
-  rface->rfont = rfont;
-  rface->non_ascii_list = NULL;
-  work_gstring.glyphs[0].code = MCHAR_INVALID_CODE;
-  work_gstring.glyphs[0].rface = rface;
-  mfont__get_metric (&work_gstring, 0, 1);
-  rface->ascent = work_gstring.glyphs[0].ascent;
-  rface->descent = work_gstring.glyphs[0].descent;
-  
- finish:
-  for (i = 0; i < num; i++, from_g++)
-    from_g->rface = rface;
-  return from_g;
+  return to_g;
 }
 
 
@@ -766,7 +758,6 @@ mface__free_realized (MRealizedFace *rface)
   MPLIST_DO (plist, rface->non_ascii_list)
     free (MPLIST_VAL (plist));
   M17N_OBJECT_UNREF (rface->non_ascii_list);
-  mwin__free_realized_face (rface);
   free (rface);
 }
 
@@ -774,7 +765,7 @@ void
 mface__update_frame_face (MFrame *frame)
 {
   frame->rface = NULL;
-  frame->rface = mface__realize (frame, NULL, 0, Mnil, Mnil, 0);
+  frame->rface = mface__realize (frame, NULL, 0, 0);
   frame->space_width = frame->rface->space_width;
   frame->ascent = frame->rface->ascent;
   frame->descent = frame->rface->descent;
@@ -1725,6 +1716,9 @@ mface_put_prop (MFace *face, MSymbol key, void *val)
     val = get_hline_create (val);
   else if (key == Mbox)
     val = get_box_create (val);
+
+  if (face->property[index] == val)
+    return 0;
   face->property[index] = val;
 
   MPLIST_DO (plist, face->frame_list)