*** empty log message ***
[m17n/m17n-lib.git] / src / face.c
1 /* face.c -- face module.
2    Copyright (C) 2003, 2004
3      National Institute of Advanced Industrial Science and Technology (AIST)
4      Registration Number H15PRO112
5
6    This file is part of the m17n library.
7
8    The m17n library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Lesser General Public License
10    as published by the Free Software Foundation; either version 2.1 of
11    the License, or (at your option) any later version.
12
13    The m17n library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Lesser General Public License for more details.
17
18    You should have received a copy of the GNU Lesser General Public
19    License along with the m17n library; if not, write to the Free
20    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21    02111-1307, USA.  */
22
23 /***en
24     @addtogroup m17nFace
25     @brief A face is an object to control appearance of M-text.
26
27     A @e face is an object of the type #MFace and controls how to
28     draw M-texts.  A face has a fixed number of @e face @e properties.
29     Like other types of properties, a face property consists of a key
30     and a value.  A key is one of the following symbols:
31
32     #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
33     #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
34     #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
35
36     "The face property that belongs to face F and whose key is @c xxx"
37     may be shortened to "the xxx property of F".
38
39     The M-text drawing functions first search an M-text for the text
40     property whose key is the symbol #Mface, then draw the M-text
41     using the value of that text property.  This value must be a
42     pointer to a face object.
43
44     If there are multiple text properties whose key is @c Mface, and
45     they are not conflicting one another, properties of those faces
46     are merged and used.
47
48     If no faces specify a certain property, the value of the default
49     face is used.  */
50
51 /***ja
52     @addtogroup m17nFace
53     @brief ¥Õ¥§¡¼¥¹¤È¤Ï¡¢M-text ¤Î¸«±É¤¨¤òÀ©¸æ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë.
54
55     @e ¥Õ¥§¡¼¥¹ ¤Ï #MFace ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¢M-text 
56     ¤Îɽ¼¨ÊýË¡¤òÀ©¸æ¤¹¤ë¡£¥Õ¥§¡¼¥¹¤Ï¸ÇÄê¸Ä¤Î @e ¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£ ¤ò»ý¤Ä¡£
57     Â¾¤Î¥×¥í¥Ñ¥Æ¥£Æ±ÍÍ¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Ï¥­¡¼¤ÈÃͤ«¤é¤Ê¤ê¡¢¥­¡¼¤Ï°Ê²¼¤Î¥·¥ó¥Ü¥ë¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ë¡£
58
59     #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox, 
60     #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle, 
61     #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
62
63     ¡Ö¥Õ¥§¡¼¥¹ F ¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¤¦¤Á¥­¡¼¤¬ @c Mxxx 
64     ¤Ç¤¢¤ë¤â¤Î¡×¤Î¤³¤È¤ò´Êñ¤Ë¡ÖF ¤Î xxx ¥×¥í¥Ñ¥Æ¥£¡×¤È¸Æ¤Ö¤³¤È¤¬¤¢¤ë¡£
65
66     M-text ¤Îɽ¼¨´Ø¿ô¤Ï¡¢¤Þ¤ººÇ½é¤Ë¤½¤Î M-text ¤«¤é¥­¡¼¤¬¥·¥ó¥Ü¥ë 
67     #Mface ¤Ç¤¢¤ë¤è¤¦¤Ê¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òõ¤·¡¢¼¡¤Ë¤½¤ÎÃͤ˽¾¤Ã¤Æ 
68     M-text ¤òɽ¼¨¤¹¤ë¡£¤³¤ÎÃͤϥե§¡¼¥¹¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
69
70     M-text ¤¬¡¢#Mface 
71     ¤ò¥­¡¼¤È¤¹¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤òÊ£¿ô»ý¤Ã¤Æ¤ª¤ê¡¢¤«¤Ä¤½¤ì¤é¤ÎÃͤ¬¾×Æͤ·¤Ê¤¤¤Ê¤é¤Ð¡¢¥Õ¥§¡¼¥¹¾ðÊó¤ÏÁȤ߹ç¤ï¤µ¤ì¤ÆÍѤ¤¤é¤ì¤ë¡£
72
73     ¤¢¤ë¥Æ¥­¥¹¥È°À­¤¬¤É¤Î¥Õ¥§¡¼¥¹¤Ë¤è¤Ã¤Æ¤â»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¥Õ¥§¡¼¥¹¤ÎÃͤ¬ÍѤ¤¤é¤ì¤ë¡£  */
74
75 /*=*/
76
77 #if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
78 /*** @addtogroup m17nInternal
79      @{ */
80
81 #include <stdio.h>
82 #include <stdlib.h>
83 #include <string.h>
84 #include <ctype.h>
85
86 #include "config.h"
87 #include "m17n-gui.h"
88 #include "m17n-misc.h"
89 #include "internal.h"
90 #include "charset.h"
91 #include "symbol.h"
92 #include "plist.h"
93 #include "mtext.h"
94 #include "textprop.h"
95 #include "internal-gui.h"
96 #include "face.h"
97 #include "font.h"
98 #include "fontset.h"
99
100 static M17NObjectArray face_table;
101
102 MSymbol Mlatin;
103
104 static MSymbol M_face_prop_index;
105
106 static MPlist *hline_prop_list;
107 static MPlist *box_prop_list;
108
109 /** Special hook function pointer that does nothing.  */
110 static MFaceHookFunc noop_hook;
111
112 /**  */
113 static MFaceHLineProp *
114 get_hline_create (MFaceHLineProp *prop)
115 {
116   MPlist *plist;
117   MFaceHLineProp *hline;
118
119   if (prop->width == 0)
120     return MPLIST_VAL (hline_prop_list);
121   MPLIST_DO (plist, MPLIST_NEXT (hline_prop_list))
122     {
123       hline = MPLIST_VAL (plist);
124       if (prop->type == hline->type
125           && prop->width == hline->width
126           && prop->color == hline->color)
127         return hline;
128     }
129   MSTRUCT_MALLOC (hline, MERROR_FACE);
130   *hline = *prop;
131   mplist_push (plist, Mt, hline);
132   return hline;
133 }
134
135 static MFaceBoxProp *
136 get_box_create (MFaceBoxProp *prop)
137 {
138   MPlist *plist;
139   MFaceBoxProp *box;
140
141   if (prop->width == 0)
142     return MPLIST_VAL (box_prop_list);
143   MPLIST_DO (plist, MPLIST_NEXT (box_prop_list))
144     {
145       box = MPLIST_VAL (plist);
146       if (prop->width == box->width
147           && prop->color_top == box->color_top
148           && prop->color_bottom == box->color_bottom
149           && prop->color_left == box->color_left
150           && prop->color_right == box->color_right
151           && prop->inner_hmargin == box->inner_hmargin
152           && prop->inner_vmargin == box->inner_vmargin
153           && prop->outer_hmargin == box->inner_hmargin
154           && prop->inner_vmargin == box->inner_vmargin)
155         return box;
156     }
157   MSTRUCT_MALLOC (box, MERROR_FACE);
158   *box = *prop;
159   mplist_push (plist, Mt, box);
160   return box;
161 }
162
163 /** From FRAME->realized_face_list, find a realized face based on
164     FACE.  */
165
166 static MRealizedFace *
167 find_realized_face (MFrame *frame, MFace *face, MFont *font)
168 {
169   MPlist *plist;
170
171   MPLIST_DO (plist, frame->realized_face_list)
172     {
173       MRealizedFace *rface = MPLIST_VAL (plist);
174
175       if (memcmp (rface->face.property, face->property,
176                   sizeof face->property) == 0
177           && (rface->font
178               ? (font && ! memcmp (rface->font, font, sizeof (MFont)))
179               : ! font))
180         return rface;
181     }
182   return NULL;
183 }
184
185 static void
186 free_face (void *object)
187 {
188   MFace *face = (MFace *) object;
189
190   if (face->property[MFACE_FONTSET])
191     M17N_OBJECT_UNREF (face->property[MFACE_FONTSET]);
192   M17N_OBJECT_UNREF (face->frame_list);
193   M17N_OBJECT_UNREGISTER (face_table, face);
194   free (object);
195 }
196
197
198 static MPlist *
199 serialize_hline (MPlist *plist, MFaceHLineProp *hline)
200 {
201   if (hline->width > 0)
202     {
203       MPlist *pl = mplist ();
204
205       mplist_add (pl, Minteger, (void *) hline->type);
206       mplist_add (pl, Minteger, (void *) hline->width);
207       mplist_add (pl, Msymbol, hline->color);
208       plist = mplist_add (plist, Mplist, pl);
209       M17N_OBJECT_UNREF (pl);
210     }
211   return plist;
212 }
213
214 static MPlist *
215 serialize_box (MPlist *plist, MFaceBoxProp *box)
216 {
217   if (box->width > 0)
218     {
219       MPlist *pl = mplist ();
220
221       mplist_add (pl, Minteger, (void *) box->width);
222       mplist_add (pl, Minteger, (void *) box->inner_hmargin);
223       mplist_add (pl, Minteger, (void *) box->inner_vmargin);
224       mplist_add (pl, Minteger, (void *) box->outer_hmargin);
225       mplist_add (pl, Minteger, (void *) box->outer_vmargin);
226       mplist_add (pl, Msymbol, box->color_top);
227       mplist_add (pl, Msymbol, box->color_bottom);
228       mplist_add (pl, Msymbol, box->color_left);
229       mplist_add (pl, Msymbol, box->color_right);
230       plist = mplist_add (plist, Mplist, pl);
231       M17N_OBJECT_UNREF (pl);
232     }
233   return plist;
234 }
235
236 static MPlist *
237 serialize_face (void *val)
238 {
239   MFace *face = val;
240   MPlist *plist = mplist (), *pl = plist;
241   int i;
242   struct {
243     MSymbol *key;
244     MSymbol *type;
245     MPlist *(*func) (MPlist *plist, void *val);
246   } serializer[MFACE_PROPERTY_MAX]
247       = { { &Mfoundry,          &Msymbol },
248           { &Mfamily,           &Msymbol },
249           { &Mweight,           &Msymbol },
250           { &Mstyle,            &Msymbol },
251           { &Mstretch,          &Msymbol },
252           { &Madstyle,          &Msymbol },
253           { &Msize,             &Minteger },
254           { &Mfontset,          NULL },
255           { &Mforeground,       &Msymbol },
256           { &Mbackground,       &Msymbol },
257           { &Mhline,            NULL },
258           { &Mbox,              NULL },
259           { &Mvideomode,        &Msymbol },
260           { NULL,               NULL}, /* MFACE_HOOK_FUNC */
261           { NULL,               NULL}, /* MFACE_HOOK_ARG */
262           { &Mratio,            &Minteger } };
263   
264   for (i = 0; i < MFACE_PROPERTY_MAX; i++)
265     if (face->property[i] && serializer[i].key)
266       {
267         pl = mplist_add (pl, Msymbol, *serializer[i].key);
268         if (serializer[i].type)
269           pl = mplist_add (pl, *serializer[i].type, face->property[i]);
270         else if (i == MFACE_FONTSET)
271           pl = mplist_add (pl, Msymbol, mfontset_name ((MFontset *)
272                                                        face->property[i]));
273         else if (i == MFACE_HLINE)
274           pl = serialize_hline (pl, (MFaceHLineProp *) face->property[i]);
275         else if (i == MFACE_BOX)
276           pl = serialize_box (pl, (MFaceBoxProp *) face->property[i]);
277       }
278
279   return plist;
280 }
281
282 static void *
283 deserialize_hline (MPlist *plist)
284 {
285   MFaceHLineProp hline, *hline_ret;
286
287   if (! MPLIST_INTEGER_P (plist))
288     MERROR (MERROR_FACE, NULL);
289   hline.type = MPLIST_INTEGER_P (plist);
290   plist = MPLIST_NEXT (plist);
291   if (! MPLIST_INTEGER_P (plist))
292     MERROR (MERROR_FACE, NULL);
293   hline.width = MPLIST_INTEGER_P (plist);
294   plist = MPLIST_NEXT (plist);
295   if (! MPLIST_SYMBOL_P (plist))
296     MERROR (MERROR_FACE, NULL);
297   hline.color = MPLIST_SYMBOL (plist);
298   MSTRUCT_MALLOC (hline_ret, MERROR_FACE);
299   *hline_ret = hline;
300   return hline_ret;
301 }
302
303 static void *
304 deserialize_box (MPlist *plist)
305 {
306   MFaceBoxProp box, *box_ret;
307
308   if (! MPLIST_INTEGER_P (plist))
309     MERROR (MERROR_FACE, NULL);
310   box.width = MPLIST_INTEGER (plist);
311   plist = MPLIST_NEXT (plist);
312   if (! MPLIST_INTEGER_P (plist))
313     MERROR (MERROR_FACE, NULL);
314   box.inner_hmargin = MPLIST_INTEGER (plist);
315   plist = MPLIST_NEXT (plist);
316   if (! MPLIST_INTEGER_P (plist))
317     MERROR (MERROR_FACE, NULL);
318   box.inner_vmargin = MPLIST_INTEGER (plist);
319   plist = MPLIST_NEXT (plist);
320   if (! MPLIST_INTEGER_P (plist))
321     MERROR (MERROR_FACE, NULL);
322   box.outer_hmargin = MPLIST_INTEGER (plist);
323   plist = MPLIST_NEXT (plist);
324   if (! MPLIST_INTEGER_P (plist))
325     MERROR (MERROR_FACE, NULL);
326   box.outer_vmargin = MPLIST_INTEGER (plist);
327   plist = MPLIST_NEXT (plist);
328   if (! MPLIST_SYMBOL_P (plist))
329     MERROR (MERROR_FACE, NULL);
330   box.color_top = MPLIST_SYMBOL (plist);
331   plist = MPLIST_NEXT (plist);
332   if (! MPLIST_SYMBOL_P (plist))
333     MERROR (MERROR_FACE, NULL);
334   box.color_bottom = MPLIST_SYMBOL (plist);
335   plist = MPLIST_NEXT (plist);
336   if (! MPLIST_SYMBOL_P (plist))
337     MERROR (MERROR_FACE, NULL);
338   box.color_left = MPLIST_SYMBOL (plist);
339   plist = MPLIST_NEXT (plist);
340   if (! MPLIST_SYMBOL_P (plist))
341     MERROR (MERROR_FACE, NULL);
342   box.color_right = MPLIST_SYMBOL (plist);
343   MSTRUCT_MALLOC (box_ret, MERROR_FACE);
344   *box_ret = box;
345   return box_ret;
346 }
347
348 static void *
349 deserialize_face (MPlist *plist)
350 {
351   MFace *face = mface ();
352
353   MPLIST_DO (plist, plist)
354     {
355       MSymbol key;
356       int index;
357       void *val;
358
359       if (! MPLIST_SYMBOL_P (plist))
360         break;
361       key = MPLIST_SYMBOL (plist);
362       index = (int) msymbol_get (key, M_face_prop_index) - 1;
363       plist = MPLIST_NEXT (plist);
364       if (MPLIST_TAIL_P (plist))
365         break;
366       if (index < 0 || index >= MFACE_PROPERTY_MAX)
367         continue;
368       if (key == Mfoundry || key == Mfamily || key == Mweight || key == Mstyle
369           || key == Mstretch || key == Madstyle
370           || key == Mforeground || key == Mbackground || key == Mvideomode)
371         {
372           if (! MPLIST_SYMBOL_P (plist))
373             continue;
374           val = MPLIST_VAL (plist);
375         }
376       else if (key == Msize || key == Mratio)
377         {
378           if (! MPLIST_INTEGER_P (plist))
379             continue;
380           val = MPLIST_VAL (plist);
381         }
382       else if (key == Mfontset)
383         {
384           if (! MPLIST_SYMBOL_P (plist))
385             continue;
386           val = mfontset (MSYMBOL_NAME (MPLIST_SYMBOL (plist)));
387         }
388       else if (key == Mhline)
389         {
390           if (! MPLIST_PLIST_P (plist))
391             continue;
392           val = deserialize_hline (MPLIST_PLIST (plist));
393         }
394       else if (key == Mbox)
395         {
396           if (! MPLIST_PLIST_P (plist))
397             continue;
398           val = deserialize_box (MPLIST_PLIST (plist));
399         }
400       face->property[index] = val;
401     }
402   return face;
403 }
404
405 static MGlyphString work_gstring;
406
407 \f
408
409 /* Internal API */
410
411 MFace *mface__default;
412
413 int
414 mface__init ()
415 {
416   int i;
417   MFaceHLineProp *hline;
418   MFaceBoxProp *box;
419
420   M17N_OBJECT_ADD_ARRAY (face_table, "Face");
421   Mface = msymbol_as_managing_key ("face");
422   msymbol_put (Mface, Mtext_prop_serializer, (void *) serialize_face);
423   msymbol_put (Mface, Mtext_prop_deserializer, (void *) deserialize_face);
424
425   Mforeground = msymbol ("foreground");
426   Mbackground = msymbol ("background");
427   Mvideomode = msymbol ("videomode");
428   Mnormal = msymbol ("normal");
429   Mreverse = msymbol ("reverse");
430   Mratio = msymbol ("ratio");
431   Mhline = msymbol ("hline");
432   Mbox = msymbol ("box");
433   Mhook_func = msymbol ("hook-func");
434   Mhook_arg = msymbol ("hook-arg");
435
436   Mlatin = msymbol ("latin");
437   M_face_prop_index = msymbol ("  face-prop-index");
438
439   {
440     struct {
441       /* Pointer to the key symbol of the face property.  */
442       MSymbol *key;
443       /* Index (enum face_property) of the face property. */
444       int index;
445     } mface_prop_data[MFACE_PROPERTY_MAX] =
446         { { &Mfoundry,          MFACE_FOUNDRY },
447           { &Mfamily,           MFACE_FAMILY },
448           { &Mweight,           MFACE_WEIGHT },
449           { &Mstyle,            MFACE_STYLE },
450           { &Mstretch,          MFACE_STRETCH },
451           { &Madstyle,          MFACE_ADSTYLE },
452           { &Msize,             MFACE_SIZE },
453           { &Mfontset,          MFACE_FONTSET },
454           { &Mforeground,       MFACE_FOREGROUND },
455           { &Mbackground,       MFACE_BACKGROUND },
456           { &Mhline,            MFACE_HLINE },
457           { &Mbox,              MFACE_BOX },
458           { &Mvideomode,        MFACE_VIDEOMODE },
459           { &Mhook_func,        MFACE_HOOK_FUNC },
460           { &Mhook_arg,         MFACE_HOOK_ARG },
461           { &Mratio,            MFACE_RATIO },
462         };
463
464     for (i = 0; i < MFACE_PROPERTY_MAX; i++)
465       /* We add one to distinguish it from no-property.  */
466       msymbol_put (*mface_prop_data[i].key, M_face_prop_index,
467                    (void *) (mface_prop_data[i].index + 1));
468   }
469
470   hline_prop_list = mplist ();
471   MSTRUCT_CALLOC (hline, MERROR_FACE);
472   mplist_push (hline_prop_list, Mt, hline);
473   box_prop_list = mplist ();
474   MSTRUCT_CALLOC (box, MERROR_FACE);
475   mplist_push (box_prop_list, Mt, box);
476
477   mface__default = mface ();
478   mface__default->property[MFACE_FOUNDRY] = msymbol ("misc");
479   mface__default->property[MFACE_FAMILY] = msymbol ("fixed");
480   mface__default->property[MFACE_WEIGHT] = msymbol ("medium");
481   mface__default->property[MFACE_STYLE] = msymbol ("r");
482   mface__default->property[MFACE_STRETCH] = msymbol ("normal");
483   mface__default->property[MFACE_ADSTYLE] = msymbol ("");
484   mface__default->property[MFACE_SIZE] = (void *) 120;
485   mface__default->property[MFACE_FONTSET] = mfontset (NULL);
486   mface__default->property[MFACE_FOREGROUND] = msymbol ("black");
487   mface__default->property[MFACE_BACKGROUND] = msymbol ("white");
488   mface__default->property[MFACE_HLINE] = hline;
489   mface__default->property[MFACE_BOX] = box;
490   mface__default->property[MFACE_VIDEOMODE] = Mnormal;
491   mface__default->property[MFACE_HOOK_FUNC] = (void *) noop_hook;
492
493   mface_normal_video = mface ();
494   mface_normal_video->property[MFACE_VIDEOMODE] = (void *) Mnormal;
495
496   mface_reverse_video = mface ();
497   mface_reverse_video->property[MFACE_VIDEOMODE] = (void *) Mreverse;
498
499   {
500     MFaceHLineProp hline_prop;
501
502     hline_prop.type = MFACE_HLINE_UNDER;
503     hline_prop.width = 1;
504     hline_prop.color = Mnil;
505     mface_underline = mface ();
506     mface_put_prop (mface_underline, Mhline, &hline_prop);
507   }
508
509   mface_medium = mface ();
510   mface_medium->property[MFACE_WEIGHT] = (void *) msymbol ("medium");
511   mface_bold = mface ();
512   mface_bold->property[MFACE_WEIGHT] = (void *) msymbol ("bold");
513   mface_italic = mface ();
514   mface_italic->property[MFACE_STYLE] = (void *) msymbol ("i");
515   mface_bold_italic = mface_copy (mface_bold);
516   mface_bold_italic->property[MFACE_STYLE]
517     = mface_italic->property[MFACE_STYLE];
518
519   mface_xx_small = mface ();
520   mface_xx_small->property[MFACE_RATIO] = (void *) 50;
521   mface_x_small = mface ();
522   mface_x_small->property[MFACE_RATIO] = (void *) 67;
523   mface_small = mface ();
524   mface_small->property[MFACE_RATIO] = (void *) 75;
525   mface_normalsize = mface ();
526   mface_normalsize->property[MFACE_RATIO] = (void *) 100;
527   mface_large = mface ();
528   mface_large->property[MFACE_RATIO] = (void *) 120;
529   mface_x_large = mface ();
530   mface_x_large->property[MFACE_RATIO] = (void *) 150;
531   mface_xx_large = mface ();
532   mface_xx_large->property[MFACE_RATIO] = (void *) 200;
533
534   mface_black = mface ();
535   mface_black->property[MFACE_FOREGROUND] = (void *) msymbol ("black");
536   mface_white = mface ();
537   mface_white->property[MFACE_FOREGROUND] = (void *) msymbol ("white");
538   mface_red = mface ();
539   mface_red->property[MFACE_FOREGROUND] = (void *) msymbol ("red");
540   mface_green = mface ();
541   mface_green->property[MFACE_FOREGROUND] = (void *) msymbol ("green");
542   mface_blue = mface ();
543   mface_blue->property[MFACE_FOREGROUND] = (void *) msymbol ("blue");
544   mface_cyan = mface ();
545   mface_cyan->property[MFACE_FOREGROUND] = (void *) msymbol ("cyan");
546   mface_yellow = mface ();
547   mface_yellow->property[MFACE_FOREGROUND] = (void *) msymbol ("yellow");
548   mface_magenta = mface ();
549   mface_magenta->property[MFACE_FOREGROUND] = (void *) msymbol ("magenta");
550
551   work_gstring.glyphs = malloc (sizeof (MGlyph) * 2);
552   work_gstring.size = 2;
553   work_gstring.used = 0;
554   work_gstring.inc = 1;
555   return 0;
556 }
557
558 void
559 mface__fini ()
560 {
561   MPlist *plist;
562
563   M17N_OBJECT_UNREF (mface__default);
564   M17N_OBJECT_UNREF (mface_normal_video);
565   M17N_OBJECT_UNREF (mface_reverse_video);
566   M17N_OBJECT_UNREF (mface_underline);
567   M17N_OBJECT_UNREF (mface_medium);
568   M17N_OBJECT_UNREF (mface_bold);
569   M17N_OBJECT_UNREF (mface_italic);
570   M17N_OBJECT_UNREF (mface_bold_italic);
571   M17N_OBJECT_UNREF (mface_xx_small);
572   M17N_OBJECT_UNREF (mface_x_small);
573   M17N_OBJECT_UNREF (mface_small);
574   M17N_OBJECT_UNREF (mface_normalsize);
575   M17N_OBJECT_UNREF (mface_large);
576   M17N_OBJECT_UNREF (mface_x_large);
577   M17N_OBJECT_UNREF (mface_xx_large);
578   M17N_OBJECT_UNREF (mface_black);
579   M17N_OBJECT_UNREF (mface_white);
580   M17N_OBJECT_UNREF (mface_red);
581   M17N_OBJECT_UNREF (mface_green);
582   M17N_OBJECT_UNREF (mface_blue);
583   M17N_OBJECT_UNREF (mface_cyan);
584   M17N_OBJECT_UNREF (mface_yellow);
585   M17N_OBJECT_UNREF (mface_magenta);
586
587   MPLIST_DO (plist, hline_prop_list)
588     free (MPLIST_VAL (plist));
589   M17N_OBJECT_UNREF (hline_prop_list);
590   MPLIST_DO (plist, box_prop_list)
591     free (MPLIST_VAL (plist));
592   M17N_OBJECT_UNREF (box_prop_list);
593
594   free (work_gstring.glyphs);
595 }
596
597 /** Return a face realized from NUM number of base faces pointed by
598     FACES on the frame FRAME.  If SIZE is nonzero, it specifies the
599     maximum font size.  */
600
601 MRealizedFace *
602 mface__realize (MFrame *frame, MFace **faces, int num, int size, MFont *font)
603 {
604   MRealizedFace *rface;
605   MRealizedFont *rfont;
606   MFace merged_face = *(frame->face);
607   void **props;
608   int i, j;
609   MFaceHookFunc func;
610
611   if (num == 0 && frame->rface && ! font)
612     return frame->rface;
613
614   for (i = 0; i < MFACE_PROPERTY_MAX; i++)
615     for (j = num - 1; j >= 0; j--)
616       if (faces[j]->property[i])
617         {
618           merged_face.property[i] = faces[j]->property[i];
619           break;
620         }
621   if (font)
622     {
623       for (i = 0; i <= MFACE_ADSTYLE; i++)
624         if (font->property[i])
625           merged_face.property[i] = FONT_PROPERTY (font, i);
626       if (font->size)
627         merged_face.property[MFACE_SIZE] = (void *) font->size;
628     }
629
630   if (! mplist_find_by_value (frame->face->frame_list, frame))
631     mplist_push (frame->face->frame_list, Mt, frame);
632   for (i = 0; i < num; i++)
633     if (! mplist_find_by_value (faces[i]->frame_list, frame))
634       mplist_push (faces[i]->frame_list, Mt, frame);
635
636   if (merged_face.property[MFACE_RATIO])
637     {
638       int font_size = (int) merged_face.property[MFACE_SIZE];
639
640       font_size *= (int) merged_face.property[MFACE_RATIO];
641       font_size /= 100;
642       merged_face.property[MFACE_SIZE] = (void *) font_size;
643       merged_face.property[MFACE_RATIO] = 0;
644     }
645
646   merged_face.property[MFACE_FOUNDRY] = Mnil;
647   rface = find_realized_face (frame, &merged_face, font);
648   if (rface)
649     return rface;
650
651   MSTRUCT_CALLOC (rface, MERROR_FACE);
652   mplist_push (frame->realized_face_list, Mt, rface);
653   rface->frame = frame;
654   rface->face = merged_face;
655   if (font)
656     {
657       rface->font = mfont ();
658       *rface->font = *font;
659     }
660   props = merged_face.property;
661   rface->rfontset = mfont__realize_fontset (frame,
662                                             (MFontset *) props[MFACE_FONTSET],
663                                             &merged_face, font);
664   num = 0;
665   rfont = NULL;
666   if (! font)
667     {
668       MFont spec;
669
670       mfont__set_spec_from_face (&spec, &merged_face);
671       mfont_put_prop (&spec, Mregistry, Miso8859_1);
672       spec.source = MFONT_SOURCE_X;
673       font = mfont__select (frame, &spec, 0);
674       if (! font)
675         {
676           mfont_put_prop (&spec, Mregistry, Municode_bmp);
677           spec.source = MFONT_SOURCE_FT;
678           font = mfont__select (frame, &spec, 0);
679         }
680       if (font)
681         rfont = mfont__open (frame, font, &spec);
682     }
683   if (! rfont)
684     rfont = mfont__lookup_fontset (rface->rfontset, NULL, &num,
685                                    Mlatin, Mnil, Mnil, size, 0);
686   if (rfont)
687     {
688       rface->rfont = rfont;
689       rface->layouter = rfont->layouter;
690       work_gstring.glyphs[0].rface = rface;
691       work_gstring.glyphs[0].code = MCHAR_INVALID_CODE;
692       mfont__get_metric (&work_gstring, 0, 1);
693       rface->ascent = work_gstring.glyphs[0].ascent;
694       rface->descent = work_gstring.glyphs[0].descent;
695       work_gstring.glyphs[0].code
696         = mfont__encode_char (frame, (MFont *) rfont, NULL, ' ');
697       if (work_gstring.glyphs[0].code != MCHAR_INVALID_CODE)
698         {
699           mfont__get_metric (&work_gstring, 0, 1);
700           rface->space_width = work_gstring.glyphs[0].width;
701         }
702       else
703         rface->space_width = rfont->spec.size / 10;
704     }
705   else
706     {
707       rface->rfont = NULL;
708       rface->space_width = frame->space_width;
709     }
710
711   rface->hline = (MFaceHLineProp *) props[MFACE_HLINE];
712   if (rface->hline && rface->hline->width == 0)
713     rface->hline = NULL;
714   rface->box = (MFaceBoxProp *) props[MFACE_BOX];
715   if (rface->box && rface->box->width == 0)
716     rface->box = NULL;
717   rface->ascii_rface = rface;
718   (*frame->driver->realize_face) (rface);
719
720   func = (MFaceHookFunc) rface->face.property[MFACE_HOOK_FUNC];
721   if (func && func != noop_hook)
722     (func) (&(rface->face), rface->info, rface->face.property[MFACE_HOOK_ARG]);
723
724   rface->non_ascii_list = mplist ();
725   if (rface->rfont)
726     {
727       MRealizedFace *nofont;
728
729       MSTRUCT_CALLOC (nofont, MERROR_FACE);
730       *nofont = *rface;
731       nofont->non_ascii_list = NULL;
732       nofont->rfont = NULL;
733       mplist_add (rface->non_ascii_list, Mt, nofont);
734     }
735
736   return rface;
737 }
738
739
740 MGlyph *
741 mface__for_chars (MSymbol script, MSymbol language, MSymbol charset,
742                   MGlyph *from_g, MGlyph *to_g, int size)
743 {
744   MRealizedFont *rfont;
745   MSymbol layouter;
746   int num = to_g - from_g;
747   int i;
748
749   rfont = from_g->rface->rfont;
750   if (script == Mlatin)
751     {
752       for (i = 0; i < num; i++)
753         {
754           unsigned code = mfont__encode_char (rfont->frame, (MFont *) rfont,
755                                               NULL, from_g[i].c);
756           if (code == MCHAR_INVALID_CODE)
757             break;
758           from_g[i].code = code;
759         }
760       if (i == num)
761         return to_g;
762     }
763
764   rfont = mfont__lookup_fontset (from_g->rface->rfontset, from_g, &num,
765                                  script, language, charset, size, 0);
766   if (rfont)
767     layouter = rfont->layouter;
768   else
769     {
770       from_g->code = MCHAR_INVALID_CODE;
771       num = 1;
772       rfont = NULL;
773       layouter = Mnil;
774     }
775   
776   to_g = from_g + num;
777   while (from_g < to_g)
778     {
779       MGlyph *g = from_g;
780       MRealizedFace *rface = from_g++->rface;
781
782       while (from_g < to_g && rface == from_g->rface) from_g++;
783       if (rface->rfont != rfont
784           || rface->layouter != layouter)
785         {
786           MPlist *plist = mplist_find_by_value (rface->non_ascii_list, rfont);
787           MRealizedFace *new = NULL;
788
789           while (plist)
790             {
791               new = MPLIST_VAL (plist);
792               if (new->layouter == layouter)
793                 break;
794               plist = mplist_find_by_value (MPLIST_NEXT (plist), rfont);
795             }
796           if (! plist)
797             {
798               MSTRUCT_MALLOC (new, MERROR_FACE);
799               mplist_push (rface->non_ascii_list, Mt, new);
800               *new = *rface;
801               new->rfont = rfont;
802               new->layouter = layouter;
803               new->non_ascii_list = NULL;
804               if (rfont)
805                 {
806                   new->ascent = rfont->ascent;
807                   new->descent = rfont->descent;
808                 }
809             }
810           while (g < from_g)
811             g++->rface = new;
812         }
813     }
814   return to_g;
815 }
816
817
818 void
819 mface__free_realized (MRealizedFace *rface)
820 {
821   MPlist *plist;
822
823   MPLIST_DO (plist, rface->non_ascii_list)
824     free (MPLIST_VAL (plist));
825   M17N_OBJECT_UNREF (rface->non_ascii_list);
826   if (rface->font)
827     free (rface->font);
828   free (rface);
829 }
830
831 void
832 mface__update_frame_face (MFrame *frame)
833 {
834   frame->rface = NULL;
835   frame->rface = mface__realize (frame, NULL, 0, 0, NULL);
836   frame->space_width = frame->rface->space_width;
837   frame->ascent = frame->rface->ascent;
838   frame->descent = frame->rface->descent;
839 }
840
841 /*** @} */
842 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
843
844 \f
845 /* External API  */
846 /*** @addtogroup m17nFace */
847 /*** @{ */
848 /*=*/
849
850 /***en @name Variables: Keys of face property */
851 /***ja @name ÊÑ¿ô: ¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼  */
852 /*** @{ */
853 /*=*/
854
855 /***en
856     @brief Key of a face property specifying foreground color.
857
858     The variable #Mforeground is used as a key of face property.  The
859     property value must be a symbol whose name is a color name, or
860     #Mnil.
861
862     #Mnil means that the face does not specify a foreground color.
863     Otherwise, the foreground of an M-text is drawn by the specified
864     color.  */
865 /***ja
866     @brief Á°·Ê¿§¤ò»ØÄꤹ¤ë¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
867
868     ÊÑ¿ô #Mforeground ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
869     ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¿§Ì¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤« #Mnil ¤Ç¤¢¤ë¡£
870
871     #Mnil ¤Î¾ì¹ç¡¢Á°·Ê¿§¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð M-text 
872     ¤ÎÁ°·Ê¤Ï»ØÄꤵ¤ì¤¿¿§¤Çɽ¼¨¤µ¤ì¤ë¡£  */
873
874 MSymbol Mforeground;
875
876 /***en
877     @brief Key of a face property specifying background color.
878
879     The variable #Mbackground is used as a key of face property.  The
880     property value must be a symbol whose name is a color name, or
881     #Mnil.
882
883     #Mnil means that the face does not specify a background color.
884     Otherwise, the background of an M-text is drawn by the specified
885     color.  */
886 /***ja
887     @brief ÇØ·Ê¿§¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
888
889     ÊÑ¿ô #Mbackground ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
890     ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¿§Ì¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤« #Mnil ¤Ç¤¢¤ë¡£
891
892     #Mnil ¤Î¾ì¹ç¡¢ÇØ·Ê¿§¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð M-text 
893     ¤ÎÇطʤϻØÄꤵ¤ì¤¿¿§¤Çɽ¼¨¤µ¤ì¤ë¡£  */
894
895 MSymbol Mbackground;
896
897 /***en
898     @brief Key of a face property specifying video mode.
899
900     The variable #Mvideomode is used as a key of face property.  The
901     property value must be #Mnormal, #Mreverse, or #Mnil.
902
903     #Mnormal means that an M-text is drawn in normal video mode
904     (i.e. the foreground is drawn by foreground color, the background
905     is drawn by background color).
906
907     #Mreverse means that an M-text is drawn in reverse video mode
908     (i.e. the foreground is drawn by background color, the background
909     is drawn by foreground color).
910
911     #Mnil means that the face does not specify a video mode.  */
912 /***ja
913     @brief ¥Ó¥Ç¥ª¥â¡¼¥É¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
914
915     ÊÑ¿ô #Mvideomode ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢
916     #Mnormal, #Mreverse, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
917
918     #Mnormal ¤Î¾ì¹ç¤Ï¡¢M-text 
919     ¤òɸ½à¤Î¥Ó¥Ç¥ª¥â¡¼¥É¡ÊÁ°·Ê¤òÁ°·Ê¿§¤Ç¡¢ÇطʤòÇØ·Ê¿§¤Ç¡Ë¤Çɽ¼¨¤¹¤ë¡£
920
921     #Mreverse ¤Î¾ì¹ç¤Ï¥ê¥Ð¡¼¥¹¥Ó¥Ç¥ª¥â¡¼¥É¤Ç¡ÊÁ°·Ê¤òÇØ·Ê¿§¤Ç¡¢ÇطʤòÁ°·Ê¿§¤Ç¡Ëɽ¼¨¤¹¤ë¡£
922
923     #Mnil ¤Î¾ì¹ç¤Ï¥Ó¥Ç¥ª¥â¡¼¥É¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
924     */
925
926 MSymbol Mvideomode;
927
928 /***en
929     @brief Key of a face property specifying font size ratio.
930
931     The variable #Mratio is used as a key of face property.  The value
932     RATIO must be an integer.
933
934     The value 0 means that the face does not specify a font size
935     ratio.  Otherwise, an M-text is drawn by a font of size (FONTSIZE
936     * RATIO / 100) where FONTSIZE is a font size specified by the face
937     property #Msize.  */
938 /***ja
939     @brief ¥Õ¥©¥ó¥È¤Î¥µ¥¤¥º¤ÎÈæΨ¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
940
941     ÊÑ¿ô #Mratio ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃÍ RATIO 
942     ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
943
944     Ãͤ¬0¤Ê¤é¤Ð¡¢¥Õ¥©¥ó¥È¥µ¥¤¥º¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¡¢M-text 
945     ¤Ï(FONTSIZE * RATIO / 100) ¤È¤¤¤¦¥µ¥¤¥º¤Î¥Õ¥©¥ó¥È¤Çɽ¼¨¤µ¤ì¤ë¡£
946     FONTSIZE ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼#Msize ¤Ç»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Ç¤¢¤ë¡£ */
947
948 MSymbol Mratio;
949
950 /***en
951     @brief Key of a face property specifying horizontal line.
952
953     The variable #Mhline is used as a key of face property.  The value
954     must be a pointer to an object of type #MFaceHLineProp, or @c
955     NULL.
956
957     The value @c NULL means that the face does not specify this
958     property.  Otherwise, an M-text is drawn with a horizontal line by
959     a way specified by the object that the value points to.  */
960 /***ja
961     @brief ¿åÊ¿Àþ¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
962
963     ÊÑ¿ô #Mhline ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
964     #MFaceHLineProp ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
965
966     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¤³¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
967     ¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÃͤ¬»Ø¤¹¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ØÄꤵ¤ì¤¿¤è¤¦¤Ë¿åÊ¿Àþ¤òÉղ䷤ƠM-text 
968     ¤òɽ¼¨¤¹¤ë¡£*/
969
970 MSymbol Mhline;
971
972 /***en
973     @brief Key of a face property specifying box.
974
975     The variable #Mbox is used as a key of face property.  The value
976     must be a pointer to an object of type #MFaceBoxProp, or @c NULL.
977
978     The value @c NULL means that the face does not specify a box.
979     Otherwise, an M-text is drawn with a surrounding box by a way
980     specified by the object that the value points to.  */
981 /***ja
982     @brief °Ï¤ßÏȤò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
983
984     ÊÑ¿ô #Mbox ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
985     #MFaceBoxProp ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
986
987     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¤³¤Î¥Õ¥§¡¼¥¹¤Ï°Ï¤ßÏȤò»ØÄꤷ¤Æ¤¤¤Ê¤¤¡£
988     ¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÃͤ¬»Ø¤¹¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ØÄꤵ¤ì¤¿¤è¤¦¤Ë°Ï¤ßÏȤòÉղ䷤Ơ
989     M-text ¤òɽ¼¨¤¹¤ë¡£*/
990
991 MSymbol Mbox;
992
993 /***en
994     @brief Key of a face property specifying fontset.
995
996     The variable #Mfontset is used as a key of face property.  The
997     value must be a pointer to an object of type #Mfontset, or @c
998     NULL.
999
1000     The value @c NULL means that the face does not specify a fontset.
1001     Otherwise, an M-text is drawn with a font selected from what
1002     specified in the fontset.  */
1003 /***ja
1004     @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
1005
1006     ÊÑ¿ô #Mfontset ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
1007     #Mfontset ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1008
1009     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
1010     ¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÃͤ¬»Ø¤¹¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ØÄꤵ¤ì¤¿¥Õ¥©¥ó¥È¥»¥Ã¥È¤«¤éÁª¤ó¤À¥Õ¥©¥ó¥È¤Ç 
1011     M-text ¤òɽ¼¨¤¹¤ë¡£*/
1012     
1013 MSymbol Mfontset;
1014
1015 /***en
1016     @brief Key of a face property specifying hook.
1017
1018     The variable #Mhook_func is used as a key of face property.  The
1019     value must be a function of type #MFaceHookFunc, or @c NULL.
1020
1021     The value @c NULL means that the face does not specify a hook.
1022     Otherwise, the specified function is called before the face is
1023     realized.  */
1024 /***ja
1025     @brief ¥Õ¥Ã¥¯¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
1026
1027     ÊÑ¿ô #Mhook_func ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
1028     #MFaceHookFunc ·¿¤Î´Ø¿ô¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1029
1030     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¥Õ¥Ã¥¯¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
1031     ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¥Õ¥§¡¼¥¹¤ò¼Â¸½¤¹¤ëÁ°¤Ë»ØÄꤵ¤ì¤¿´Ø¿ô¤¬¸Æ¤Ð¤ì¤ë¡£      */
1032 MSymbol Mhook_func;
1033
1034 /***en
1035     @brief Key of a face property specifying argument of hook.
1036
1037     The variable #Mhook_arg is used as a key of face property.  The
1038     value can be anything that is passed a hook function specified by
1039     the face property #Mhook_func.  */
1040 /***ja
1041     @brief ¥Õ¥Ã¥¯¤Î°ú¿ô¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
1042
1043     ÊÑ¿ô #Mhook_arg ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1044     Ãͤϲ¿¤Ç¤â¤è¤¯¡¢¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£ #Mhook_func ¤Ç»ØÄꤵ¤ì¤ë´Ø¿ô¤ËÅϤµ¤ì¤ë¡£ */
1045 MSymbol Mhook_arg;
1046
1047 /*** @} */
1048 /*=*/
1049
1050 /*** @ingroup m17nFace */
1051 /***en @name Variables: Possible values of #Mvideomode property of face */
1052 /***ja @name ÊÑ¿ô¡§  ¥Õ¥§¡¼¥¹¤Î #Mvideomode ¥×¥í¥Ñ¥Æ¥£¤Î²Äǽ¤ÊÃÍ */
1053 /*** @{ */
1054 /*=*/
1055
1056 /***en
1057     See the documentation of the variable #Mvideomode.  */ 
1058 /***ja
1059     ÊÑ¿ô #Mvideomode ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£  */ 
1060 MSymbol Mnormal;
1061 MSymbol Mreverse;
1062 /*** @} */
1063 /*=*/
1064
1065 /*** @ingroup m17nFace */
1066 /***en @name Variables: Predefined faces  */
1067 /***ja @name ÊÑ¿ô: ÄêµÁºÑ¤ß¥Õ¥§¡¼¥¹  */
1068 /*** @{ */
1069 /*=*/
1070
1071 /***en
1072     @brief Normal video face.
1073
1074     The variable #mface_normal_video points to a face that has the
1075     #Mvideomode property with value #Mnormal.  The other properties
1076     are not specified.  An M-text drawn with this face appear normal
1077     colors (i.e. the foreground is drawn by foreground color, and
1078     background is drawn by background color).  */
1079 /***ja
1080     @brief É¸½à¥Ó¥Ç¥ª¥Õ¥§¡¼¥¹.
1081
1082     ÊÑ¿ô #mface_normal_video ¤Ï #Mvideomode ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ #Mnormal 
1083     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1084     ¤³¤Î¥Õ¥§¡¼¥¹¤Çɽ¼¨¤µ¤ì¤ëM-text 
1085     ¤Ïɸ½à¤Î¿§ (¤¹¤Ê¤ï¤ÁÁ°·Ê¤ÏÁ°·Ê¿§¡¢ÇطʤÏÇØ·Ê¿§¡Ë¤ÇÉÁ¤«¤ì¤ë¡£  */
1086
1087 MFace *mface_normal_video;
1088
1089 /***en
1090     @brief Reverse video face.
1091
1092     The variable #mface_reverse_video points to a face that has the
1093     #Mvideomode property with value #Mreverse.  The other properties
1094     are not specified.  An M-text drawn with this face appear in
1095     reversed colors (i.e. the foreground is drawn by background
1096     color, and background is drawn by foreground color).  */
1097 /***ja
1098     @brief ¥ê¥Ð¡¼¥¹¥Ó¥Ç¥ª¥Õ¥§¡¼¥¹.
1099
1100     ÊÑ¿ô #mface_reverse_video ¤Ï #Mvideomode ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 
1101     #Mreverse ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1102     ¤³¤Î¥Õ¥§¡¼¥¹¤Çɽ¼¨¤µ¤ì¤ëM-text 
1103     ¤ÏÁ°·Ê¿§¤ÈÇØ·Ê¿§¤¬Æþ¤ìÂؤï¤Ã¤Æ (¤¹¤Ê¤ï¤ÁÁ°·Ê¤ÏÇØ·Ê¿§¡¢ÇطʤÏÁ°·Ê¿§¡ËÉÁ¤«¤ì¤ë¡£  */
1104
1105 MFace *mface_reverse_video;
1106
1107 /***en
1108     @brief Underline face.
1109
1110     The variable #mface_underline points to a face that has the
1111     #Mhline property with value a pointer to an object of type
1112     #MFaceHLineProp.  The members of the object are as follows:
1113
1114 @verbatim
1115     member  value
1116     -----   -----
1117     type    MFACE_HLINE_UNDER
1118     width   1
1119     color   Mnil
1120 @endverbatim
1121
1122     The other properties are not specified.  An M-text that has this
1123     face is drawn with an underline.  */ 
1124 /***ja
1125     @brief ²¼Àþ¥Õ¥§¡¼¥¹.
1126
1127     ÊÑ¿ô #mface_underline ¤Ï #Mhline ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ #MFaceHLineProp 
1128     ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥ó¥Ð¤Ï°Ê²¼¤ÎÄ̤ꡣ
1129
1130 @verbatim
1131     ¥á¥ó¥Ð  ÃÍ
1132     -----   -----
1133     type    MFACE_HLINE_UNDER
1134     width   1
1135     color   Mnil
1136 @endverbatim
1137
1138     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ï²¼ÀþÉÕ¤­¤Çɽ¼¨¤µ¤ì¤ë¡£*/ 
1139
1140 MFace *mface_underline;
1141
1142 /***en
1143     @brief Medium face.
1144
1145     The variable #mface_medium points to a face that has the #Mweight
1146     property with value a symbol of name "medium".  The other
1147     properties are not specified.  An M-text that has this face is
1148     drawn with a font of medium weight.  */
1149 /***ja
1150     @brief ¥ß¥Ç¥£¥¢¥à¥Õ¥§¡¼¥¹.
1151
1152     ÊÑ¿ô #mface_medium ¤Ï #Mweight ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "medium" 
1153     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1154     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text
1155     ¤Ï¡¢¥ß¥Ç¥£¥¢¥à¥¦¥§¥¤¥È¤Î¥Õ¥©¥ó¥È¤Çɽ¼¨¤µ¤ì¤ë¡£  */
1156 MFace *mface_medium;
1157
1158 /***en
1159     @brief Bold face.
1160
1161     The variable #mface_bold points to a face that has the #Mweight
1162     property with value a symbol of name "bold".  The other properties
1163     are not specified.  An M-text that has this face is drawn with a
1164     font of bold weight.  */
1165 /***ja
1166     @brief ¥Ü¡¼¥ë¥É¥Õ¥§¡¼¥¹.
1167
1168     ÊÑ¿ô #mface_bold ¤Ï #Mweight ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "bold" 
1169     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1170     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1171     ¤Ï¡¢¥Ü¡¼¥ë¥É¥Õ¥©¥ó¥È¤Çɽ¼¨¤µ¤ì¤ë¡£    */
1172
1173 MFace *mface_bold;
1174
1175 /***en
1176     @brief Italic face.
1177
1178     The variable #mface_italic points to a face that has the #Mstyle
1179     property with value a symbol of name "italic".  The other
1180     properties are not specified.  An M-text that has this face is
1181     drawn with a font of italic style.  */
1182 /***ja
1183     @brief ¥¤¥¿¥ê¥Ã¥¯¥Õ¥§¡¼¥¹.
1184
1185     ÊÑ¿ô #mface_italic ¤Ï #Mstyle ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "italic" 
1186     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1187     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text
1188     ¤Ï¡¢¥¤¥¿¥ê¥Ã¥¯ÂΤÇɽ¼¨¤µ¤ì¤ë¡£    */
1189
1190 MFace *mface_italic;
1191
1192 /***en
1193     @brief Bold italic face.
1194
1195     The variable #mface_bold_italic points to a face that has the
1196     #Mweight property with value a symbol of name "bold", and #Mstyle
1197     property with value a symbol of name "italic".  The other
1198     properties are not specified.  An M-text that has this face is
1199     drawn with a font of bold weight and italic style.  */
1200 /***ja
1201     @brief ¥Ü¡¼¥ë¥É¥¤¥¿¥ê¥Ã¥¯¥Õ¥§¡¼¥¹.
1202
1203     ÊÑ¿ô #mface_bold_italic ¤Ï¡¢#Mweight ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "bold" 
1204     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¤«¤Ä #Mstyle ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "italic" 
1205     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1206     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1207     ¤Ï¡¢¥Ü¡¼¥ë¥É¥¤¥¿¥ê¥Ã¥¯ÂΤÇɽ¼¨¤µ¤ì¤ë¡£    */
1208
1209 MFace *mface_bold_italic;
1210
1211 /***en
1212     @brief Smallest face.
1213
1214     The variable #mface_xx_small points to a face that has the #Mratio
1215     property with value 50.  The other properties are not specified.
1216     An M-text that has this face is drawn with a font whose size is
1217     50% of a normal font.  */
1218 /***ja
1219     @brief ºÇ¾®¤Î¥Õ¥§¡¼¥¹.
1220
1221     ÊÑ¿ô #mface_xx_small ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 50 
1222     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1223     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 50% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1224      */
1225
1226 MFace *mface_xx_small;
1227
1228 /***en
1229     @brief Smaller face.
1230
1231     The variable #mface_x_small points to a face that has the #Mratio
1232     property with value 66.  The other properties are not specified.
1233     An M-text that has this face is drawn with a font whose size is
1234     66% of a normal font.  */
1235 /***ja
1236     @brief ¤è¤ê¾®¤µ¤¤¥Õ¥§¡¼¥¹.
1237
1238     ÊÑ¿ô #mface_x_small ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 66 
1239     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1240     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 66% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1241      */
1242
1243 MFace *mface_x_small;
1244
1245 /***en
1246     @brief Small face.
1247
1248     The variable #mface_x_small points to a face that has the #Mratio
1249     property with value 75.  The other properties are not specified.
1250     An M-text that has this face is drawn with a font whose size is
1251     75% of a normal font.  */
1252 /***ja
1253     @brief ¾®¤µ¤¤¥Õ¥§¡¼¥¹.
1254
1255     ÊÑ¿ô #mface_small ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 75 
1256     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1257     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 75% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1258      */
1259
1260 MFace *mface_small;
1261
1262 /***en
1263     @brief Normalsize face.
1264
1265     The variable #mface_normalsize points to a face that has the
1266     #Mratio property with value 100.  The other properties are not
1267     specified.  An M-text that has this face is drawn with a font
1268     whose size is the same as a normal font.  */
1269 /***ja
1270     @brief É¸½à¤ÎÂ礭¤µ¤Î¥Õ¥§¡¼¥¹.
1271
1272     ÊÑ¿ô #mface_normalsize ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 100 
1273     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1274     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤ÈƱ¤¸Â礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1275      */
1276
1277 MFace *mface_normalsize;
1278
1279 /***en
1280     @brief Large face.
1281
1282     The variable #mface_large points to a face that has the #Mratio
1283     property with value 120.  The other properties are not specified.
1284     An M-text that has this face is drawn with a font whose size is
1285     120% of a normal font.  */
1286 /***ja
1287     @brief Â礭¤¤¥Õ¥§¡¼¥¹.
1288
1289     ÊÑ¿ô #mface_large ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 120 
1290     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1291     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 120% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1292      */
1293
1294 MFace *mface_large;
1295
1296 /***en
1297     @brief Larger face.
1298
1299     The variable #mface_x_large points to a face that has the #Mratio
1300     property with value 150.  The other properties are not specified.
1301     An M-text that has this face is drawn with a font whose size is
1302     150% of a normal font.  */
1303 /***ja
1304     @brief ¤â¤Ã¤ÈÂ礭¤¤¥Õ¥§¡¼¥¹.
1305
1306     ÊÑ¿ô #mface_x_large ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 150 
1307     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1308     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 150% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1309      */
1310
1311 MFace *mface_x_large;
1312
1313 /***en
1314     @brief Largest face.
1315
1316     The variable #mface_xx_large points to a face that has the #Mratio
1317     property with value 200.  The other properties are not specified.
1318     An M-text that has this face is drawn with a font whose size is
1319     200% of a normal font.  */
1320 /***ja
1321     @brief ºÇÂç¤Î¥Õ¥§¡¼¥¹.
1322
1323     ÊÑ¿ô #mface_xx_large ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 200 
1324     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1325     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 200% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1326      */
1327
1328 MFace *mface_xx_large;
1329
1330 /***en
1331     @brief Black face.
1332
1333     The variable #mface_black points to a face that has the
1334     #Mforeground property with value a symbol of name "black".  The
1335     other properties are not specified.  An M-text that has this face
1336     is drawn with black foreground.  */
1337 /***ja 
1338     @brief ¹õ¥Õ¥§¡¼¥¹.
1339
1340     ÊÑ¿ô #mface_black ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "black" 
1341     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1342     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1343     ¤ÏÁ°·Ê¿§¤È¤·¤Æ¹õ¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£     */
1344
1345 MFace *mface_black;
1346
1347 /***en
1348     @brief White face.
1349
1350     The variable #mface_white points to a face that has the
1351     #Mforeground property with value a symbol of name "white".  The
1352     other properties are not specified.  An M-text that has this face
1353     is drawn with white foreground.  */
1354 /***ja
1355     @brief Çò¥Õ¥§¡¼¥¹.
1356
1357     ÊÑ¿ô #mface_white ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "white" 
1358     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1359     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1360     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÇò¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£     */
1361
1362 MFace *mface_white;
1363
1364 /***en
1365     @brief Red face.
1366
1367     The variable #mface_red points to a face that has the
1368     #Mforeground property with value a symbol of name "red".  The
1369     other properties are not specified.  An M-text that has this face
1370     is drawn with red foreground.  */
1371 /***ja
1372     @brief ÀÖ¥Õ¥§¡¼¥¹.
1373
1374     ÊÑ¿ô #mface_red ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "red" 
1375     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1376     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1377     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÀÖ¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1378
1379 MFace *mface_red;
1380
1381 /***en
1382     @brief Green face.
1383
1384     The variable #mface_green points to a face that has the
1385     #Mforeground property with value a symbol of name "green".  The
1386     other properties are not specified.  An M-text that has this face
1387     is drawn with green foreground.  */
1388 /***ja
1389     @brief ÎÐ¥Õ¥§¡¼¥¹.
1390
1391     ÊÑ¿ô #mface_green ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "green" 
1392     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1393     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1394     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÎФòÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1395
1396 MFace *mface_green;
1397
1398 /***en
1399     @brief Blue face.
1400
1401     The variable #mface_blue points to a face that has the
1402     #Mforeground property with value a symbol of name "blue".  The
1403     other properties are not specified.  An M-text that has this face
1404     is drawn with blue foreground.  */
1405 /***ja
1406     @brief ÀÄ¥Õ¥§¡¼¥¹.
1407
1408     ÊÑ¿ô #mface_blue ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "blue" 
1409     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1410     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1411     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÀĤòÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1412
1413 MFace *mface_blue;
1414
1415 /***en
1416     @brief Cyan face.
1417
1418     The variable #mface_cyan points to a face that has the
1419     #Mforeground property with value a symbol of name "cyan".  The
1420     other properties are not specified.  An M-text that has this face
1421     is drawn with cyan foreground.  */
1422 /***ja
1423     @brief ¥·¥¢¥ó¥Õ¥§¡¼¥¹.
1424
1425     ÊÑ¿ô #mface_cyan ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "cyan"
1426     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1427     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1428     ¤ÏÁ°·Ê¿§¤È¤·¤Æ¥·¥¢¥ó¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1429
1430 MFace *mface_cyan;
1431
1432 /***en
1433     @brief yellow face.
1434
1435     The variable #mface_yellow points to a face that has the
1436     #Mforeground property with value a symbol of name "yellow".  The
1437     other properties are not specified.  An M-text that has this face
1438     is drawn with yellow foreground.  */
1439
1440 /***ja
1441     @brief ²«¥Õ¥§¡¼¥¹.
1442
1443     ÊÑ¿ô #mface_yellow ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "yellow" 
1444     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1445     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1446     ¤ÏÁ°·Ê¿§¤È¤·¤Æ²«¿§¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1447
1448 MFace *mface_yellow;
1449
1450 /***en
1451     @brief Magenta face.
1452
1453     The variable #mface_magenta points to a face that has the
1454     #Mforeground property with value a symbol of name "magenta".  The
1455     other properties are not specified.  An M-text that has this face
1456     is drawn with magenta foreground.  */
1457
1458 /***ja
1459     @brief ¥Þ¥¼¥ó¥¿¥Õ¥§¡¼¥¹.
1460
1461     ÊÑ¿ô #mface_magenta ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ 
1462     "magenta" ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1463     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1464     ¤ÏÁ°·Ê¿§¤È¤·¤Æ¥Þ¥¼¥ó¥¿¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1465
1466 MFace *mface_magenta;
1467
1468 /*** @} */
1469 /*=*/
1470
1471 /***en @name Variables: The other symbols for face handling.  */
1472 /***ja @name ÊÑ¿ô: ¥Õ¥§¡¼¥¹¤ò¼è¤ê°·¤¦¤¿¤á¤Î¤½¤Î¾¤Î¥·¥ó¥Ü¥ë  */
1473 /*** @{ */
1474 /*=*/
1475
1476 /***en
1477     @brief Key of a text property specifying a face.
1478
1479     The variable #Mface is a symbol of name <tt>"face"</tt>.  A text
1480     property whose key is this symbol must have a pointer to an object
1481     of type #MFace.  This is a managing key.  */
1482
1483 /***ja
1484     @brief ¥Õ¥§¡¼¥¹¤ò»ØÄꤹ¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼.
1485
1486     ÊÑ¿ô #Mface ¤Ï <tt>"face"</tt> 
1487     ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£¤³¤Î¥·¥ó¥Ü¥ë¤ò¥­¡¼¤È¤¹¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ï¡¢
1488     #MFace ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤¿¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
1489     ¤³¤ì¤Ï´ÉÍý¥­¡¼¤Ç¤¢¤ë¡£  */
1490
1491 MSymbol Mface;
1492 /*=*/
1493 /*** @} */
1494 /*=*/
1495
1496 /***en
1497     @brief Create a new face.
1498
1499     The mface () function creates a new face object that specifies no
1500     property.
1501
1502     @return
1503     This function returns a pointer to the created face.  */
1504
1505 /***ja
1506     @brief ¿·¤·¤¤¥Õ¥§¡¼¥¹¤ò¤Ä¤¯¤ë.
1507
1508     ´Ø¿ô mface () 
1509     ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥§¡¼¥¹¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
1510
1511     @return
1512     ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥§¡¼¥¹¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£  */
1513
1514 MFace *
1515 mface ()
1516 {
1517   MFace *face;
1518
1519   M17N_OBJECT (face, free_face, MERROR_FACE);
1520   face->frame_list = mplist ();
1521   M17N_OBJECT_REGISTER (face_table, face);
1522   return face;
1523 }
1524
1525 /*=*/
1526
1527 /***en
1528     @brief Make a copy of a face.
1529
1530     The mface_copy () function makes a copy of $FACE and returns a
1531     pointer to the created copy.  */
1532
1533 /***ja
1534     @brief ¥Õ¥§¡¼¥¹¤Î¥³¥Ô¡¼¤òºî¤ë.
1535
1536     ´Ø¿ô mface_copy () ¤Ï¥Õ¥§¡¼¥¹ $FACE 
1537     ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤Î¥³¥Ô¡¼¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£  */
1538
1539 MFace *
1540 mface_copy (MFace *face)
1541 {
1542   MFace *copy;
1543
1544   MSTRUCT_CALLOC (copy, MERROR_FACE);
1545   *copy = *face;
1546   copy->control.ref_count = 1;
1547   M17N_OBJECT_REGISTER (face_table, copy);
1548   copy->frame_list = mplist ();
1549   if (copy->property[MFACE_FONTSET])
1550     M17N_OBJECT_REF (copy->property[MFACE_FONTSET]);
1551   return copy;
1552 }
1553
1554 /*=*/
1555 /***en
1556     @brief Compare faces.
1557
1558     The mface_equal () function compares faces $FACE1 and $FACE2.
1559
1560     @return If two faces have the same property values, return 1.
1561     Otherwise return 0.  */
1562
1563 int
1564 mface_equal (MFace *face1, MFace *face2)
1565 {
1566   MFaceHLineProp *hline1, *hline2;
1567   MFaceBoxProp *box1, *box2;
1568   int i;
1569
1570   if (face1 == face2)
1571     return 1;
1572   if (memcmp (face1->property, face2->property, sizeof face1->property) == 0)
1573     return 1;
1574   for (i = MFACE_FOUNDRY; i <= MFACE_BACKGROUND; i++)
1575     if (face1->property[i] != face2->property[i])
1576       return 0;
1577   for (i = MFACE_VIDEOMODE; i <= MFACE_RATIO; i++)
1578     if (face1->property[i] != face2->property[i])
1579       return 0;
1580   hline1 = (MFaceHLineProp *) face1->property[MFACE_HLINE];
1581   hline2 = (MFaceHLineProp *) face2->property[MFACE_HLINE];
1582   if (hline1 != hline2)
1583     {
1584       if (! hline1 || ! hline2)
1585         return 0;
1586       if (memcmp (hline1, hline2, sizeof (MFaceHLineProp)) != 0)
1587         return 0;
1588     }
1589   box1 = (MFaceBoxProp *) face1->property[MFACE_BOX];
1590   box2 = (MFaceBoxProp *) face2->property[MFACE_BOX];
1591   if (box1 != box2)
1592     {
1593       if (! box1 || ! box2)
1594         return 0;
1595       if (memcmp (box1, box2, sizeof (MFaceBoxProp)) != 0)
1596         return 0;
1597     }
1598   return 1;
1599 }
1600
1601
1602 /*=*/
1603 /***en
1604     @brief Merge faces.
1605
1606     The mface_merge () functions merges the properties of face $SRC
1607     into $DST.
1608
1609     @return
1610     This function returns $DST.  */
1611
1612 /***ja
1613     @brief ¥Õ¥§¡¼¥¹¤òÅý¹ç¤¹¤ë.
1614
1615     ´Ø¿ô mface_merge () ¤Ï¡¢¥Õ¥§¡¼¥¹ $SRC ¤Î¥×¥í¥Ñ¥Æ¥£¤ò¥Õ¥§¡¼¥¹ $DST 
1616     ¤ËÅý¹ç¤¹¤ë¡£
1617
1618     @return
1619     ¤³¤Î´Ø¿ô¤Ï $DST ¤òÊÖ¤¹¡£  */
1620
1621 MFace *
1622 mface_merge (MFace *dst, MFace *src)
1623 {
1624   int i;
1625   MPlist *plist;
1626
1627   for (i = 0; i < MFACE_PROPERTY_MAX; i++)
1628     if (src->property[i])
1629       {
1630         if (i == MFACE_FONTSET)
1631           {
1632             M17N_OBJECT_UNREF (dst->property[i]);
1633             M17N_OBJECT_REF (src->property[i]);
1634           }
1635         dst->property[i] = src->property[i];
1636       }
1637
1638   MPLIST_DO (plist, dst->frame_list)
1639     {
1640       MFrame *frame = MPLIST_VAL (plist);
1641
1642       frame->tick++;
1643       if (dst == frame->face)
1644         mface__update_frame_face (frame);
1645     }
1646
1647   return dst;
1648 }
1649
1650 /*=*/
1651
1652 /***en
1653     @brief Make a face from a font.
1654
1655     The mface_from_font () function return a newly created face while
1656     reflecting the properties of $FONT in its properties.   */
1657
1658 /***ja
1659     @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥§¡¼¥¹¤òºî¤ë.
1660
1661     ´Ø¿ô mface_from_font () ¤Ï¥Õ¥©¥ó¥È $FONT 
1662     ¤Î¥×¥í¥Ñ¥Æ¥£¤ò¥×¥í¥Ñ¥Æ¥£¤È¤·¤Æ»ý¤Ä¿·¤·¤¤¥Õ¥§¡¼¥¹¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£  */
1663
1664 MFace *
1665 mface_from_font (MFont *font)
1666 {
1667   MFace *face = mface ();
1668
1669   face->property[MFACE_FOUNDRY] = mfont_get_prop (font, Mfoundry);
1670   face->property[MFACE_FAMILY] = mfont_get_prop (font, Mfamily);
1671   face->property[MFACE_WEIGHT] = mfont_get_prop (font, Mweight);
1672   face->property[MFACE_STYLE] = mfont_get_prop (font, Mstyle);
1673   face->property[MFACE_STRETCH] = mfont_get_prop (font, Mstretch);
1674   face->property[MFACE_ADSTYLE] = mfont_get_prop (font, Madstyle);
1675   face->property[MFACE_SIZE] = mfont_get_prop (font, Msize);
1676   return face;
1677 }
1678
1679 /*=*/
1680
1681 /***en
1682     @brief Get the value of a face property.
1683
1684     The mface_get_prop () function returns the value of the face
1685     property whose key is $KEY in face $FACE.  $KEY must be one of the
1686     followings:
1687
1688         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1689         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1690         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
1691
1692     @return
1693     The actual type of the returned value depends of $KEY.  See
1694     documentation of the above keys.  If an error is detected, it
1695     returns @c NULL and assigns an error code to the external variable
1696     #merror_code.  */
1697
1698 /***ja
1699     @brief ¥Õ¥§¡¼¥¹¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
1700
1701     ´Ø¿ô mface_get_prop () ¤Ï¡¢¥Õ¥§¡¼¥¹ $FACE 
1702     ¤¬»ý¤Ä¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤ÎÆâ¡¢¥­¡¼¤¬ $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£
1703     $KEY ¤Ï²¼µ­¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
1704
1705         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1706         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1707         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
1708
1709     @return 
1710     Ìá¤êÃͤη¿¤Ï $KEY ¤Ë°Í¸¤¹¤ë¡£¾åµ­¤Î¥­¡¼¤ÎÀâÌÀ¤ò»²¾È¤¹¤ë¤³¤È¡£
1711     ¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï @c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code 
1712     ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£  */
1713
1714 /***
1715     @seealso
1716     mface_put_prop ()
1717
1718     @errors
1719     @c MERROR_FACE  */
1720
1721 void *
1722 mface_get_prop (MFace *face, MSymbol key)
1723 {
1724   int index = (int) msymbol_get (key, M_face_prop_index) - 1;
1725
1726   if (index < 0)
1727     MERROR (MERROR_FACE, NULL);
1728   return face->property[index];
1729 }
1730
1731 /*=*/
1732
1733 /***en
1734     @brief Set a value of a face property.
1735
1736     The mface_put_prop () function assigns $VAL to the property whose
1737     key is $KEY in face $FACE.  $KEY must be one the followings:
1738
1739         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1740         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1741         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
1742
1743     Among them, font related properties (#Mfoundry through #Msize) are
1744     used as the default values when a font in the fontset of $FACE
1745     does not specify those values.
1746
1747     The actual type of the returned value depends of $KEY.  See
1748     documentation of the above keys.
1749
1750     @return
1751     If the operation was successful, mface_put_prop () returns 0.
1752     Otherwise it returns -1 and assigns an error code to the external
1753     variable #merror_code.  */
1754
1755 /***ja
1756     @brief ¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤹ¤ë.
1757
1758     ´Ø¿ô mface_put_prop () ¤Ï¡¢¥Õ¥§¡¼¥¹ $FACE Æâ¤Ç¥­¡¼¤¬ $KEY 
1759     ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY 
1760     ¤Ï°Ê²¼¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1761
1762         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1763         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1764         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg.
1765
1766     ¤³¤ì¤é¤Î¤¦¤Á¤Î¡¢¥Õ¥©¥ó¥È´ØÏ¢¤Î¥×¥í¥Ñ¥Æ¥£ (#Mfamily ¤«¤é #Msize 
1767     ¤Þ¤Ç) ¤Ï¡¢¥Õ¥§¡¼¥¹¤Î¥Õ¥©¥ó¥È¥»¥Ã¥ÈÃæ¤Î¥Õ¥©¥ó¥È¤Ë´Ø¤¹¤ë¥Ç¥Õ¥©¥ë¥ÈÃͤȤʤꡢ¸Ä¡¹¤Î¥Õ¥©¥ó¥È¤¬Ãͤò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤ËÍѤ¤¤é¤ì¤ë¡£
1768
1769     Ìá¤êÃͤη¿¤Ï $KEY ¤Ë°Í¸¤¹¤ë¡£¾åµ­¤Î¥­¡¼¤ÎÀâÌÀ¤ò»²¾È¤¹¤ë¤³¤È¡£
1770
1771     @return
1772     ½èÍý¤¬À®¸ù¤·¤¿¾ì¹ç¡¢mface_put_prop () ¤Ï 0 ¤òÊÖ¤¹¡£¼ºÇÔ¤·¤¿¾ì¹ç¤Ï 
1773     -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£  */
1774
1775 /***
1776     @seealso
1777     mface_get_prop ()
1778
1779     @errors
1780     @c MERROR_FACE  */
1781
1782 int
1783 mface_put_prop (MFace *face, MSymbol key, void *val)
1784 {
1785   int index = (int) msymbol_get (key, M_face_prop_index) - 1;
1786   MPlist *plist;
1787
1788   if (index < 0)
1789     MERROR (MERROR_FACE, -1);
1790   if (key == Mfontset)
1791     {
1792       if (face->property[index])
1793         M17N_OBJECT_UNREF (face->property[index]);
1794       M17N_OBJECT_REF (val);
1795     }
1796   else if (key == Mhline)
1797     val = get_hline_create (val);
1798   else if (key == Mbox)
1799     val = get_box_create (val);
1800
1801   if (face->property[index] == val)
1802     return 0;
1803   face->property[index] = val;
1804
1805   MPLIST_DO (plist, face->frame_list)
1806     {
1807       MFrame *frame = MPLIST_VAL (plist);
1808
1809       frame->tick++;
1810       if (face == frame->face)
1811         mface__update_frame_face (frame);
1812     }
1813
1814   return 0;
1815 }
1816
1817 /*=*/
1818
1819 /***en
1820     @brief Update a face.
1821
1822     The mface_update () function update face $FACE on frame $FRAME by
1823     calling a hook function of $FACE (if any).  */
1824
1825 /***ja
1826     @brief ¥Õ¥§¡¼¥¹¤ò¹¹¿·¤¹¤ë.
1827
1828     ´Ø¿ô mface_update () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥Õ¥§¡¼¥¹ $FACE ¤ò $FACE 
1829     ¤Î¥Õ¥Ã¥¯´Ø¿ô¤ò¡Ê¤¢¤ì¤Ð¡Ë¸Æ¤ó¤Ç¹¹¿·¤¹¤ë¡£  */
1830
1831 void
1832 mface_update (MFrame *frame, MFace *face)
1833 {
1834   MFaceHookFunc func = (MFaceHookFunc) face->property[MFACE_HOOK_FUNC];
1835   MPlist *rface_list;
1836   MRealizedFace *rface;
1837
1838   if (func && func != noop_hook)
1839     {
1840       MPLIST_DO (rface_list, frame->realized_face_list)
1841         {
1842           rface = MPLIST_VAL (rface_list);
1843           if ((MFaceHookFunc) rface->face.property[MFACE_HOOK_FUNC] == func)
1844             (func) (&(rface->face), rface->face.property[MFACE_HOOK_ARG],
1845                     rface->info);
1846         }
1847     }
1848 }
1849 /*=*/
1850
1851 /*** @} */
1852 /*=*/
1853
1854 /*** @addtogroup m17nDebug */
1855 /*** @{  */
1856 /*=*/
1857
1858 /***en
1859     @brief Dump a face.
1860
1861     The mdebug_dump_face () function prints face $FACE in a human readable
1862     way to the stderr.  $INDENT specifies how many columns to indent
1863     the lines but the first one.
1864
1865     @return
1866     This function returns $FACE.  */
1867
1868 /***ja
1869     @brief ¥Õ¥§¡¼¥¹¤ò¥À¥ó¥×¤¹¤ë.
1870
1871     ´Ø¿ô mdebug_dump_face () ¤Ï¥Õ¥§¡¼¥¹ $FACE ¤ò stderr 
1872     ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
1873
1874     @return
1875     ¤³¤Î´Ø¿ô¤Ï $FACE ¤òÊÖ¤¹¡£  */
1876
1877 MFace *
1878 mdebug_dump_face (MFace *face, int indent)
1879 {
1880   char *prefix = (char *) alloca (indent + 1);
1881   MFont spec;
1882
1883   memset (prefix, 32, indent);
1884   prefix[indent] = 0;
1885   mfont__set_spec_from_face (&spec, face);
1886   fprintf (stderr, "(face font:\"");
1887   mdebug_dump_font (&spec);
1888   fprintf (stderr, "\"\n %s  fore:%s back:%s", prefix,
1889            msymbol_name ((MSymbol) face->property[MFACE_FOREGROUND]),
1890            msymbol_name ((MSymbol) face->property[MFACE_BACKGROUND]));
1891   if (face->property[MFACE_FONTSET])
1892     fprintf (stderr, " non-default-fontset");
1893   fprintf (stderr, " hline:%s", face->property[MFACE_HLINE] ? "yes" : "no");
1894   fprintf (stderr, " box:%s)", face->property[MFACE_BOX] ? "yes" : "no");
1895   return face;
1896 }
1897
1898 /*** @} */
1899
1900 /*
1901   Local Variables:
1902   coding: euc-japan
1903   End:
1904 */