36ce285b2695b363b249e7aed5ea5683928f9baa
[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   MFont adjusted;
611
612   if (num == 0 && frame->rface && ! font)
613     return frame->rface;
614
615   for (i = 0; i < MFACE_PROPERTY_MAX; i++)
616     for (j = num - 1; j >= 0; j--)
617       if (faces[j]->property[i])
618         {
619           merged_face.property[i] = faces[j]->property[i];
620           break;
621         }
622   if (font)
623     {
624       for (i = 0; i <= MFACE_ADSTYLE; i++)
625         if (font->property[i])
626           merged_face.property[i] = FONT_PROPERTY (font, i);
627       if (font->size)
628         {
629           if (font->size < 0)
630             {
631               double pt = - font->size;
632
633               adjusted = *font;
634               adjusted.size = pt * frame->dpi / 72.27 + 0.5;
635               font = &adjusted;
636             }
637           merged_face.property[MFACE_SIZE] = (void *) font->size;
638         }
639     }
640
641   if (! mplist_find_by_value (frame->face->frame_list, frame))
642     mplist_push (frame->face->frame_list, Mt, frame);
643   for (i = 0; i < num; i++)
644     if (! mplist_find_by_value (faces[i]->frame_list, frame))
645       mplist_push (faces[i]->frame_list, Mt, frame);
646
647   if ((int) merged_face.property[MFACE_SIZE] < 0
648       || (merged_face.property[MFACE_RATIO]
649           && (int) merged_face.property[MFACE_RATIO] != 100))
650     {
651       double font_size = (int) merged_face.property[MFACE_SIZE];
652       int ifont_size;
653
654       if (font_size < 0)
655         font_size = - font_size * frame->dpi / 72.27;
656       if (merged_face.property[MFACE_RATIO]
657           && (int) merged_face.property[MFACE_RATIO] != 100)
658         {
659           font_size *= (int) merged_face.property[MFACE_RATIO];
660           font_size /= 100;
661           merged_face.property[MFACE_RATIO] = 0;
662         }
663       ifont_size = font_size + 0.5;
664       merged_face.property[MFACE_SIZE] = (void *) ifont_size;
665     }
666
667   merged_face.property[MFACE_FOUNDRY] = Mnil;
668   rface = find_realized_face (frame, &merged_face, font);
669   if (rface)
670     return rface;
671
672   MSTRUCT_CALLOC (rface, MERROR_FACE);
673   mplist_push (frame->realized_face_list, Mt, rface);
674   rface->frame = frame;
675   rface->face = merged_face;
676   if (font)
677     {
678       rface->font = mfont ();
679       *rface->font = *font;
680     }
681   props = merged_face.property;
682   rface->rfontset = mfont__realize_fontset (frame,
683                                             (MFontset *) props[MFACE_FONTSET],
684                                             &merged_face, font);
685   num = 0;
686   rfont = NULL;
687   if (! font)
688     {
689       MFont spec;
690
691       mfont__set_spec_from_face (&spec, &merged_face);
692       mfont_put_prop (&spec, Mregistry, Miso8859_1);
693       spec.source = MFONT_SOURCE_X;
694       font = mfont__select (frame, &spec, 0);
695       if (! font)
696         {
697           mfont_put_prop (&spec, Mregistry, Municode_bmp);
698           spec.source = MFONT_SOURCE_FT;
699           font = mfont__select (frame, &spec, 0);
700         }
701       if (font)
702         rfont = mfont__open (frame, font, &spec);
703     }
704   if (! rfont)
705     rfont = mfont__lookup_fontset (rface->rfontset, NULL, &num,
706                                    Mlatin, Mnil, Mnil, size, 0);
707   if (rfont)
708     {
709       rface->rfont = rfont;
710       rface->layouter = rfont->layouter;
711       work_gstring.glyphs[0].rface = rface;
712       work_gstring.glyphs[0].code = MCHAR_INVALID_CODE;
713       mfont__get_metric (&work_gstring, 0, 1);
714       rface->ascent = work_gstring.glyphs[0].ascent;
715       rface->descent = work_gstring.glyphs[0].descent;
716       work_gstring.glyphs[0].code
717         = mfont__encode_char (frame, (MFont *) rfont, NULL, ' ');
718       if (work_gstring.glyphs[0].code != MCHAR_INVALID_CODE)
719         {
720           mfont__get_metric (&work_gstring, 0, 1);
721           rface->space_width = work_gstring.glyphs[0].width;
722         }
723       else
724         rface->space_width = rfont->spec.size / 10;
725     }
726   else
727     {
728       rface->rfont = NULL;
729       rface->space_width = frame->space_width;
730     }
731
732   rface->hline = (MFaceHLineProp *) props[MFACE_HLINE];
733   if (rface->hline && rface->hline->width == 0)
734     rface->hline = NULL;
735   rface->box = (MFaceBoxProp *) props[MFACE_BOX];
736   if (rface->box && rface->box->width == 0)
737     rface->box = NULL;
738   rface->ascii_rface = rface;
739   (*frame->driver->realize_face) (rface);
740
741   func = (MFaceHookFunc) rface->face.property[MFACE_HOOK_FUNC];
742   if (func && func != noop_hook)
743     (func) (&(rface->face), rface->info, rface->face.property[MFACE_HOOK_ARG]);
744
745   rface->non_ascii_list = mplist ();
746   if (rface->rfont)
747     {
748       MRealizedFace *nofont;
749
750       MSTRUCT_CALLOC (nofont, MERROR_FACE);
751       *nofont = *rface;
752       nofont->non_ascii_list = NULL;
753       nofont->rfont = NULL;
754       mplist_add (rface->non_ascii_list, Mt, nofont);
755     }
756
757   return rface;
758 }
759
760
761 MGlyph *
762 mface__for_chars (MSymbol script, MSymbol language, MSymbol charset,
763                   MGlyph *from_g, MGlyph *to_g, int size)
764 {
765   MRealizedFont *rfont;
766   MSymbol layouter;
767   int num = to_g - from_g;
768   int i;
769
770   rfont = from_g->rface->rfont;
771   if (script == Mlatin)
772     {
773       for (i = 0; i < num; i++)
774         {
775           unsigned code = mfont__encode_char (rfont->frame, (MFont *) rfont,
776                                               NULL, from_g[i].c);
777           if (code == MCHAR_INVALID_CODE)
778             break;
779           from_g[i].code = code;
780         }
781       if (i == num)
782         return to_g;
783     }
784
785   rfont = mfont__lookup_fontset (from_g->rface->rfontset, from_g, &num,
786                                  script, language, charset, size, 0);
787   if (rfont)
788     layouter = rfont->layouter;
789   else
790     {
791       from_g->code = MCHAR_INVALID_CODE;
792       num = 1;
793       rfont = NULL;
794       layouter = Mnil;
795     }
796   
797   to_g = from_g + num;
798   while (from_g < to_g)
799     {
800       MGlyph *g = from_g;
801       MRealizedFace *rface = from_g++->rface;
802
803       while (from_g < to_g && rface == from_g->rface) from_g++;
804       if (rface->rfont != rfont
805           || rface->layouter != layouter)
806         {
807           MPlist *plist = mplist_find_by_value (rface->non_ascii_list, rfont);
808           MRealizedFace *new = NULL;
809
810           while (plist)
811             {
812               new = MPLIST_VAL (plist);
813               if (new->layouter == layouter)
814                 break;
815               plist = mplist_find_by_value (MPLIST_NEXT (plist), rfont);
816             }
817           if (! plist)
818             {
819               MSTRUCT_MALLOC (new, MERROR_FACE);
820               mplist_push (rface->non_ascii_list, Mt, new);
821               *new = *rface;
822               new->rfont = rfont;
823               new->layouter = layouter;
824               new->non_ascii_list = NULL;
825               if (rfont)
826                 {
827                   new->ascent = rfont->ascent;
828                   new->descent = rfont->descent;
829                 }
830             }
831           while (g < from_g)
832             g++->rface = new;
833         }
834     }
835   return to_g;
836 }
837
838
839 void
840 mface__free_realized (MRealizedFace *rface)
841 {
842   MPlist *plist;
843
844   MPLIST_DO (plist, rface->non_ascii_list)
845     free (MPLIST_VAL (plist));
846   M17N_OBJECT_UNREF (rface->non_ascii_list);
847   if (rface->font)
848     free (rface->font);
849   free (rface);
850 }
851
852 void
853 mface__update_frame_face (MFrame *frame)
854 {
855   frame->rface = NULL;
856   frame->rface = mface__realize (frame, NULL, 0, 0, NULL);
857   frame->space_width = frame->rface->space_width;
858   frame->ascent = frame->rface->ascent;
859   frame->descent = frame->rface->descent;
860 }
861
862 /*** @} */
863 #endif /* !FOR_DOXYGEN || DOXYGEN_INTERNAL_MODULE */
864
865 \f
866 /* External API  */
867 /*** @addtogroup m17nFace */
868 /*** @{ */
869 /*=*/
870
871 /***en @name Variables: Keys of face property */
872 /***ja @name ÊÑ¿ô: ¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼  */
873 /*** @{ */
874 /*=*/
875
876 /***en
877     @brief Key of a face property specifying foreground color.
878
879     The variable #Mforeground 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 foreground color.
884     Otherwise, the foreground of an M-text is drawn by the specified
885     color.  */
886 /***ja
887     @brief Á°·Ê¿§¤ò»ØÄꤹ¤ë¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
888
889     ÊÑ¿ô #Mforeground ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
890     ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¿§Ì¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤« #Mnil ¤Ç¤¢¤ë¡£
891
892     #Mnil ¤Î¾ì¹ç¡¢Á°·Ê¿§¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð M-text 
893     ¤ÎÁ°·Ê¤Ï»ØÄꤵ¤ì¤¿¿§¤Çɽ¼¨¤µ¤ì¤ë¡£  */
894
895 MSymbol Mforeground;
896
897 /***en
898     @brief Key of a face property specifying background color.
899
900     The variable #Mbackground is used as a key of face property.  The
901     property value must be a symbol whose name is a color name, or
902     #Mnil.
903
904     #Mnil means that the face does not specify a background color.
905     Otherwise, the background of an M-text is drawn by the specified
906     color.  */
907 /***ja
908     @brief ÇØ·Ê¿§¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
909
910     ÊÑ¿ô #Mbackground ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
911     ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢¿§Ì¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤« #Mnil ¤Ç¤¢¤ë¡£
912
913     #Mnil ¤Î¾ì¹ç¡¢ÇØ·Ê¿§¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð M-text 
914     ¤ÎÇطʤϻØÄꤵ¤ì¤¿¿§¤Çɽ¼¨¤µ¤ì¤ë¡£  */
915
916 MSymbol Mbackground;
917
918 /***en
919     @brief Key of a face property specifying video mode.
920
921     The variable #Mvideomode is used as a key of face property.  The
922     property value must be #Mnormal, #Mreverse, or #Mnil.
923
924     #Mnormal means that an M-text is drawn in normal video mode
925     (i.e. the foreground is drawn by foreground color, the background
926     is drawn by background color).
927
928     #Mreverse means that an M-text is drawn in reverse video mode
929     (i.e. the foreground is drawn by background color, the background
930     is drawn by foreground color).
931
932     #Mnil means that the face does not specify a video mode.  */
933 /***ja
934     @brief ¥Ó¥Ç¥ª¥â¡¼¥É¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
935
936     ÊÑ¿ô #Mvideomode ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£¥×¥í¥Ñ¥Æ¥£¤ÎÃͤϡ¢
937     #Mnormal, #Mreverse, #Mnil ¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
938
939     #Mnormal ¤Î¾ì¹ç¤Ï¡¢M-text 
940     ¤òɸ½à¤Î¥Ó¥Ç¥ª¥â¡¼¥É¡ÊÁ°·Ê¤òÁ°·Ê¿§¤Ç¡¢ÇطʤòÇØ·Ê¿§¤Ç¡Ë¤Çɽ¼¨¤¹¤ë¡£
941
942     #Mreverse ¤Î¾ì¹ç¤Ï¥ê¥Ð¡¼¥¹¥Ó¥Ç¥ª¥â¡¼¥É¤Ç¡ÊÁ°·Ê¤òÇØ·Ê¿§¤Ç¡¢ÇطʤòÁ°·Ê¿§¤Ç¡Ëɽ¼¨¤¹¤ë¡£
943
944     #Mnil ¤Î¾ì¹ç¤Ï¥Ó¥Ç¥ª¥â¡¼¥É¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
945     */
946
947 MSymbol Mvideomode;
948
949 /***en
950     @brief Key of a face property specifying font size ratio.
951
952     The variable #Mratio is used as a key of face property.  The value
953     RATIO must be an integer.
954
955     The value 0 means that the face does not specify a font size
956     ratio.  Otherwise, an M-text is drawn by a font of size (FONTSIZE
957     * RATIO / 100) where FONTSIZE is a font size specified by the face
958     property #Msize.  */
959 /***ja
960     @brief ¥Õ¥©¥ó¥È¤Î¥µ¥¤¥º¤ÎÈæΨ¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
961
962     ÊÑ¿ô #Mratio ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃÍ RATIO 
963     ¤ÏÀ°¿ôÃͤǤʤ¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
964
965     Ãͤ¬0¤Ê¤é¤Ð¡¢¥Õ¥©¥ó¥È¥µ¥¤¥º¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¡¢M-text 
966     ¤Ï(FONTSIZE * RATIO / 100) ¤È¤¤¤¦¥µ¥¤¥º¤Î¥Õ¥©¥ó¥È¤Çɽ¼¨¤µ¤ì¤ë¡£
967     FONTSIZE ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼#Msize ¤Ç»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Ç¤¢¤ë¡£ */
968
969 MSymbol Mratio;
970
971 /***en
972     @brief Key of a face property specifying horizontal line.
973
974     The variable #Mhline is used as a key of face property.  The value
975     must be a pointer to an object of type #MFaceHLineProp, or @c
976     NULL.
977
978     The value @c NULL means that the face does not specify this
979     property.  Otherwise, an M-text is drawn with a horizontal line by
980     a way specified by the object that the value points to.  */
981 /***ja
982     @brief ¿åÊ¿Àþ¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
983
984     ÊÑ¿ô #Mhline ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
985     #MFaceHLineProp ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
986
987     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¤³¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
988     ¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÃͤ¬»Ø¤¹¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ØÄꤵ¤ì¤¿¤è¤¦¤Ë¿åÊ¿Àþ¤òÉղ䷤ƠM-text 
989     ¤òɽ¼¨¤¹¤ë¡£*/
990
991 MSymbol Mhline;
992
993 /***en
994     @brief Key of a face property specifying box.
995
996     The variable #Mbox is used as a key of face property.  The value
997     must be a pointer to an object of type #MFaceBoxProp, or @c NULL.
998
999     The value @c NULL means that the face does not specify a box.
1000     Otherwise, an M-text is drawn with a surrounding box by a way
1001     specified by the object that the value points to.  */
1002 /***ja
1003     @brief °Ï¤ßÏȤò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
1004
1005     ÊÑ¿ô #Mbox ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
1006     #MFaceBoxProp ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1007
1008     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¤³¤Î¥Õ¥§¡¼¥¹¤Ï°Ï¤ßÏȤò»ØÄꤷ¤Æ¤¤¤Ê¤¤¡£
1009     ¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÃͤ¬»Ø¤¹¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ØÄꤵ¤ì¤¿¤è¤¦¤Ë°Ï¤ßÏȤòÉղ䷤Ơ
1010     M-text ¤òɽ¼¨¤¹¤ë¡£*/
1011
1012 MSymbol Mbox;
1013
1014 /***en
1015     @brief Key of a face property specifying fontset.
1016
1017     The variable #Mfontset is used as a key of face property.  The
1018     value must be a pointer to an object of type #Mfontset, or @c
1019     NULL.
1020
1021     The value @c NULL means that the face does not specify a fontset.
1022     Otherwise, an M-text is drawn with a font selected from what
1023     specified in the fontset.  */
1024 /***ja
1025     @brief ¥Õ¥©¥ó¥È¥»¥Ã¥È¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
1026
1027     ÊÑ¿ô #Mfontset ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
1028     #Mfontset ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1029
1030     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
1031     ¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÃͤ¬»Ø¤¹¥ª¥Ö¥¸¥§¥¯¥È¤Ë»ØÄꤵ¤ì¤¿¥Õ¥©¥ó¥È¥»¥Ã¥È¤«¤éÁª¤ó¤À¥Õ¥©¥ó¥È¤Ç 
1032     M-text ¤òɽ¼¨¤¹¤ë¡£*/
1033     
1034 MSymbol Mfontset;
1035
1036 /***en
1037     @brief Key of a face property specifying hook.
1038
1039     The variable #Mhook_func is used as a key of face property.  The
1040     value must be a function of type #MFaceHookFunc, or @c NULL.
1041
1042     The value @c NULL means that the face does not specify a hook.
1043     Otherwise, the specified function is called before the face is
1044     realized.  */
1045 /***ja
1046     @brief ¥Õ¥Ã¥¯¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
1047
1048     ÊÑ¿ô #Mhook_func ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£ÃͤϠ
1049     #MFaceHookFunc ·¿¤Î´Ø¿ô¤« @c NULL ¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1050
1051     Ãͤ¬ @c NULL ¤Ê¤é¤Ð¡¢¥Õ¥Ã¥¯¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¡£
1052     ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¥Õ¥§¡¼¥¹¤ò¼Â¸½¤¹¤ëÁ°¤Ë»ØÄꤵ¤ì¤¿´Ø¿ô¤¬¸Æ¤Ð¤ì¤ë¡£      */
1053 MSymbol Mhook_func;
1054
1055 /***en
1056     @brief Key of a face property specifying argument of hook.
1057
1058     The variable #Mhook_arg is used as a key of face property.  The
1059     value can be anything that is passed a hook function specified by
1060     the face property #Mhook_func.  */
1061 /***ja
1062     @brief ¥Õ¥Ã¥¯¤Î°ú¿ô¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¡¼¤Î¥­¡¼.
1063
1064     ÊÑ¿ô #Mhook_arg ¤Ï¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
1065     Ãͤϲ¿¤Ç¤â¤è¤¯¡¢¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£ #Mhook_func ¤Ç»ØÄꤵ¤ì¤ë´Ø¿ô¤ËÅϤµ¤ì¤ë¡£ */
1066 MSymbol Mhook_arg;
1067
1068 /*** @} */
1069 /*=*/
1070
1071 /*** @ingroup m17nFace */
1072 /***en @name Variables: Possible values of #Mvideomode property of face */
1073 /***ja @name ÊÑ¿ô¡§  ¥Õ¥§¡¼¥¹¤Î #Mvideomode ¥×¥í¥Ñ¥Æ¥£¤Î²Äǽ¤ÊÃÍ */
1074 /*** @{ */
1075 /*=*/
1076
1077 /***en
1078     See the documentation of the variable #Mvideomode.  */ 
1079 /***ja
1080     ÊÑ¿ô #Mvideomode ¤ÎÀâÌÀ¤ò»²¾È¤Î¤³¤È¡£  */ 
1081 MSymbol Mnormal;
1082 MSymbol Mreverse;
1083 /*** @} */
1084 /*=*/
1085
1086 /*** @ingroup m17nFace */
1087 /***en @name Variables: Predefined faces  */
1088 /***ja @name ÊÑ¿ô: ÄêµÁºÑ¤ß¥Õ¥§¡¼¥¹  */
1089 /*** @{ */
1090 /*=*/
1091
1092 /***en
1093     @brief Normal video face.
1094
1095     The variable #mface_normal_video points to a face that has the
1096     #Mvideomode property with value #Mnormal.  The other properties
1097     are not specified.  An M-text drawn with this face appear normal
1098     colors (i.e. the foreground is drawn by foreground color, and
1099     background is drawn by background color).  */
1100 /***ja
1101     @brief É¸½à¥Ó¥Ç¥ª¥Õ¥§¡¼¥¹.
1102
1103     ÊÑ¿ô #mface_normal_video ¤Ï #Mvideomode ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ #Mnormal 
1104     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1105     ¤³¤Î¥Õ¥§¡¼¥¹¤Çɽ¼¨¤µ¤ì¤ëM-text 
1106     ¤Ïɸ½à¤Î¿§ (¤¹¤Ê¤ï¤ÁÁ°·Ê¤ÏÁ°·Ê¿§¡¢ÇطʤÏÇØ·Ê¿§¡Ë¤ÇÉÁ¤«¤ì¤ë¡£  */
1107
1108 MFace *mface_normal_video;
1109
1110 /***en
1111     @brief Reverse video face.
1112
1113     The variable #mface_reverse_video points to a face that has the
1114     #Mvideomode property with value #Mreverse.  The other properties
1115     are not specified.  An M-text drawn with this face appear in
1116     reversed colors (i.e. the foreground is drawn by background
1117     color, and background is drawn by foreground color).  */
1118 /***ja
1119     @brief ¥ê¥Ð¡¼¥¹¥Ó¥Ç¥ª¥Õ¥§¡¼¥¹.
1120
1121     ÊÑ¿ô #mface_reverse_video ¤Ï #Mvideomode ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 
1122     #Mreverse ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1123     ¤³¤Î¥Õ¥§¡¼¥¹¤Çɽ¼¨¤µ¤ì¤ëM-text 
1124     ¤ÏÁ°·Ê¿§¤ÈÇØ·Ê¿§¤¬Æþ¤ìÂؤï¤Ã¤Æ (¤¹¤Ê¤ï¤ÁÁ°·Ê¤ÏÇØ·Ê¿§¡¢ÇطʤÏÁ°·Ê¿§¡ËÉÁ¤«¤ì¤ë¡£  */
1125
1126 MFace *mface_reverse_video;
1127
1128 /***en
1129     @brief Underline face.
1130
1131     The variable #mface_underline points to a face that has the
1132     #Mhline property with value a pointer to an object of type
1133     #MFaceHLineProp.  The members of the object are as follows:
1134
1135 @verbatim
1136     member  value
1137     -----   -----
1138     type    MFACE_HLINE_UNDER
1139     width   1
1140     color   Mnil
1141 @endverbatim
1142
1143     The other properties are not specified.  An M-text that has this
1144     face is drawn with an underline.  */ 
1145 /***ja
1146     @brief ²¼Àþ¥Õ¥§¡¼¥¹.
1147
1148     ÊÑ¿ô #mface_underline ¤Ï #Mhline ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ #MFaceHLineProp 
1149     ·¿¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥ó¥Ð¤Ï°Ê²¼¤ÎÄ̤ꡣ
1150
1151 @verbatim
1152     ¥á¥ó¥Ð  ÃÍ
1153     -----   -----
1154     type    MFACE_HLINE_UNDER
1155     width   1
1156     color   Mnil
1157 @endverbatim
1158
1159     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ï²¼ÀþÉÕ¤­¤Çɽ¼¨¤µ¤ì¤ë¡£*/ 
1160
1161 MFace *mface_underline;
1162
1163 /***en
1164     @brief Medium face.
1165
1166     The variable #mface_medium points to a face that has the #Mweight
1167     property with value a symbol of name "medium".  The other
1168     properties are not specified.  An M-text that has this face is
1169     drawn with a font of medium weight.  */
1170 /***ja
1171     @brief ¥ß¥Ç¥£¥¢¥à¥Õ¥§¡¼¥¹.
1172
1173     ÊÑ¿ô #mface_medium ¤Ï #Mweight ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "medium" 
1174     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1175     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text
1176     ¤Ï¡¢¥ß¥Ç¥£¥¢¥à¥¦¥§¥¤¥È¤Î¥Õ¥©¥ó¥È¤Çɽ¼¨¤µ¤ì¤ë¡£  */
1177 MFace *mface_medium;
1178
1179 /***en
1180     @brief Bold face.
1181
1182     The variable #mface_bold points to a face that has the #Mweight
1183     property with value a symbol of name "bold".  The other properties
1184     are not specified.  An M-text that has this face is drawn with a
1185     font of bold weight.  */
1186 /***ja
1187     @brief ¥Ü¡¼¥ë¥É¥Õ¥§¡¼¥¹.
1188
1189     ÊÑ¿ô #mface_bold ¤Ï #Mweight ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "bold" 
1190     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1191     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1192     ¤Ï¡¢¥Ü¡¼¥ë¥É¥Õ¥©¥ó¥È¤Çɽ¼¨¤µ¤ì¤ë¡£    */
1193
1194 MFace *mface_bold;
1195
1196 /***en
1197     @brief Italic face.
1198
1199     The variable #mface_italic points to a face that has the #Mstyle
1200     property with value a symbol of name "italic".  The other
1201     properties are not specified.  An M-text that has this face is
1202     drawn with a font of italic style.  */
1203 /***ja
1204     @brief ¥¤¥¿¥ê¥Ã¥¯¥Õ¥§¡¼¥¹.
1205
1206     ÊÑ¿ô #mface_italic ¤Ï #Mstyle ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "italic" 
1207     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1208     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text
1209     ¤Ï¡¢¥¤¥¿¥ê¥Ã¥¯ÂΤÇɽ¼¨¤µ¤ì¤ë¡£    */
1210
1211 MFace *mface_italic;
1212
1213 /***en
1214     @brief Bold italic face.
1215
1216     The variable #mface_bold_italic points to a face that has the
1217     #Mweight property with value a symbol of name "bold", and #Mstyle
1218     property with value a symbol of name "italic".  The other
1219     properties are not specified.  An M-text that has this face is
1220     drawn with a font of bold weight and italic style.  */
1221 /***ja
1222     @brief ¥Ü¡¼¥ë¥É¥¤¥¿¥ê¥Ã¥¯¥Õ¥§¡¼¥¹.
1223
1224     ÊÑ¿ô #mface_bold_italic ¤Ï¡¢#Mweight ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "bold" 
1225     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¤«¤Ä #Mstyle ¥×¥í¥Ñ¥Æ¥¤¤ÎÃͤ¬ "italic" 
1226     ¤È¤¤¤¦Ì¾Á°¤ò¤â¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1227     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1228     ¤Ï¡¢¥Ü¡¼¥ë¥É¥¤¥¿¥ê¥Ã¥¯ÂΤÇɽ¼¨¤µ¤ì¤ë¡£    */
1229
1230 MFace *mface_bold_italic;
1231
1232 /***en
1233     @brief Smallest face.
1234
1235     The variable #mface_xx_small points to a face that has the #Mratio
1236     property with value 50.  The other properties are not specified.
1237     An M-text that has this face is drawn with a font whose size is
1238     50% of a normal font.  */
1239 /***ja
1240     @brief ºÇ¾®¤Î¥Õ¥§¡¼¥¹.
1241
1242     ÊÑ¿ô #mface_xx_small ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 50 
1243     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1244     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 50% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1245      */
1246
1247 MFace *mface_xx_small;
1248
1249 /***en
1250     @brief Smaller face.
1251
1252     The variable #mface_x_small points to a face that has the #Mratio
1253     property with value 66.  The other properties are not specified.
1254     An M-text that has this face is drawn with a font whose size is
1255     66% of a normal font.  */
1256 /***ja
1257     @brief ¤è¤ê¾®¤µ¤¤¥Õ¥§¡¼¥¹.
1258
1259     ÊÑ¿ô #mface_x_small ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 66 
1260     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1261     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 66% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1262      */
1263
1264 MFace *mface_x_small;
1265
1266 /***en
1267     @brief Small face.
1268
1269     The variable #mface_x_small points to a face that has the #Mratio
1270     property with value 75.  The other properties are not specified.
1271     An M-text that has this face is drawn with a font whose size is
1272     75% of a normal font.  */
1273 /***ja
1274     @brief ¾®¤µ¤¤¥Õ¥§¡¼¥¹.
1275
1276     ÊÑ¿ô #mface_small ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 75 
1277     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1278     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 75% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1279      */
1280
1281 MFace *mface_small;
1282
1283 /***en
1284     @brief Normalsize face.
1285
1286     The variable #mface_normalsize points to a face that has the
1287     #Mratio property with value 100.  The other properties are not
1288     specified.  An M-text that has this face is drawn with a font
1289     whose size is the same as a normal font.  */
1290 /***ja
1291     @brief É¸½à¤ÎÂ礭¤µ¤Î¥Õ¥§¡¼¥¹.
1292
1293     ÊÑ¿ô #mface_normalsize ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 100 
1294     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1295     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤ÈƱ¤¸Â礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1296      */
1297
1298 MFace *mface_normalsize;
1299
1300 /***en
1301     @brief Large face.
1302
1303     The variable #mface_large points to a face that has the #Mratio
1304     property with value 120.  The other properties are not specified.
1305     An M-text that has this face is drawn with a font whose size is
1306     120% of a normal font.  */
1307 /***ja
1308     @brief Â礭¤¤¥Õ¥§¡¼¥¹.
1309
1310     ÊÑ¿ô #mface_large ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 120 
1311     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1312     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 120% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1313      */
1314
1315 MFace *mface_large;
1316
1317 /***en
1318     @brief Larger face.
1319
1320     The variable #mface_x_large points to a face that has the #Mratio
1321     property with value 150.  The other properties are not specified.
1322     An M-text that has this face is drawn with a font whose size is
1323     150% of a normal font.  */
1324 /***ja
1325     @brief ¤â¤Ã¤ÈÂ礭¤¤¥Õ¥§¡¼¥¹.
1326
1327     ÊÑ¿ô #mface_x_large ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 150 
1328     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1329     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 150% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1330      */
1331
1332 MFace *mface_x_large;
1333
1334 /***en
1335     @brief Largest face.
1336
1337     The variable #mface_xx_large points to a face that has the #Mratio
1338     property with value 200.  The other properties are not specified.
1339     An M-text that has this face is drawn with a font whose size is
1340     200% of a normal font.  */
1341 /***ja
1342     @brief ºÇÂç¤Î¥Õ¥§¡¼¥¹.
1343
1344     ÊÑ¿ô #mface_xx_large ¤Ï¡¢#Mratio ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤ¬ 200 
1345     ¤Ç¤¢¤ë¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£
1346     ¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text ¤Ïɸ½à¥Õ¥©¥ó¥È¤Î 200% ¤ÎÂ礭¤µ¤Î¥Õ¥©¥ó¥È¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£
1347      */
1348
1349 MFace *mface_xx_large;
1350
1351 /***en
1352     @brief Black face.
1353
1354     The variable #mface_black points to a face that has the
1355     #Mforeground property with value a symbol of name "black".  The
1356     other properties are not specified.  An M-text that has this face
1357     is drawn with black foreground.  */
1358 /***ja 
1359     @brief ¹õ¥Õ¥§¡¼¥¹.
1360
1361     ÊÑ¿ô #mface_black ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "black" 
1362     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1363     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1364     ¤ÏÁ°·Ê¿§¤È¤·¤Æ¹õ¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£     */
1365
1366 MFace *mface_black;
1367
1368 /***en
1369     @brief White face.
1370
1371     The variable #mface_white points to a face that has the
1372     #Mforeground property with value a symbol of name "white".  The
1373     other properties are not specified.  An M-text that has this face
1374     is drawn with white foreground.  */
1375 /***ja
1376     @brief Çò¥Õ¥§¡¼¥¹.
1377
1378     ÊÑ¿ô #mface_white ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "white" 
1379     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1380     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1381     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÇò¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£     */
1382
1383 MFace *mface_white;
1384
1385 /***en
1386     @brief Red face.
1387
1388     The variable #mface_red points to a face that has the
1389     #Mforeground property with value a symbol of name "red".  The
1390     other properties are not specified.  An M-text that has this face
1391     is drawn with red foreground.  */
1392 /***ja
1393     @brief ÀÖ¥Õ¥§¡¼¥¹.
1394
1395     ÊÑ¿ô #mface_red ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "red" 
1396     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1397     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1398     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÀÖ¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1399
1400 MFace *mface_red;
1401
1402 /***en
1403     @brief Green face.
1404
1405     The variable #mface_green points to a face that has the
1406     #Mforeground property with value a symbol of name "green".  The
1407     other properties are not specified.  An M-text that has this face
1408     is drawn with green foreground.  */
1409 /***ja
1410     @brief ÎÐ¥Õ¥§¡¼¥¹.
1411
1412     ÊÑ¿ô #mface_green ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "green" 
1413     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1414     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1415     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÎФòÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1416
1417 MFace *mface_green;
1418
1419 /***en
1420     @brief Blue face.
1421
1422     The variable #mface_blue points to a face that has the
1423     #Mforeground property with value a symbol of name "blue".  The
1424     other properties are not specified.  An M-text that has this face
1425     is drawn with blue foreground.  */
1426 /***ja
1427     @brief ÀÄ¥Õ¥§¡¼¥¹.
1428
1429     ÊÑ¿ô #mface_blue ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "blue" 
1430     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1431     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1432     ¤ÏÁ°·Ê¿§¤È¤·¤ÆÀĤòÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1433
1434 MFace *mface_blue;
1435
1436 /***en
1437     @brief Cyan face.
1438
1439     The variable #mface_cyan points to a face that has the
1440     #Mforeground property with value a symbol of name "cyan".  The
1441     other properties are not specified.  An M-text that has this face
1442     is drawn with cyan foreground.  */
1443 /***ja
1444     @brief ¥·¥¢¥ó¥Õ¥§¡¼¥¹.
1445
1446     ÊÑ¿ô #mface_cyan ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "cyan"
1447     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1448     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1449     ¤ÏÁ°·Ê¿§¤È¤·¤Æ¥·¥¢¥ó¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1450
1451 MFace *mface_cyan;
1452
1453 /***en
1454     @brief yellow face.
1455
1456     The variable #mface_yellow points to a face that has the
1457     #Mforeground property with value a symbol of name "yellow".  The
1458     other properties are not specified.  An M-text that has this face
1459     is drawn with yellow foreground.  */
1460
1461 /***ja
1462     @brief ²«¥Õ¥§¡¼¥¹.
1463
1464     ÊÑ¿ô #mface_yellow ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ "yellow" 
1465     ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1466     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1467     ¤ÏÁ°·Ê¿§¤È¤·¤Æ²«¿§¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1468
1469 MFace *mface_yellow;
1470
1471 /***en
1472     @brief Magenta face.
1473
1474     The variable #mface_magenta points to a face that has the
1475     #Mforeground property with value a symbol of name "magenta".  The
1476     other properties are not specified.  An M-text that has this face
1477     is drawn with magenta foreground.  */
1478
1479 /***ja
1480     @brief ¥Þ¥¼¥ó¥¿¥Õ¥§¡¼¥¹.
1481
1482     ÊÑ¿ô #mface_magenta ¤Ï¡¢#Mforeground ¥×¥í¥Ñ¥Æ¥£¤ÎÃͤȤ·¤Æ 
1483     "magenta" ¤È¤¤¤¦Ì¾Á°¤Î¥·¥ó¥Ü¥ë¤ò»ý¤Ä¤è¤¦¤Ê¥Õ¥§¡¼¥¹¤ò»Ø¤¹¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¡£
1484     Â¾¤Î¥×¥í¥Ñ¥Æ¥£¤Ï»ØÄꤵ¤ì¤Ê¤¤¡£¤³¤Î¥Õ¥§¡¼¥¹¤ò»ý¤Ä M-text 
1485     ¤ÏÁ°·Ê¿§¤È¤·¤Æ¥Þ¥¼¥ó¥¿¤òÍѤ¤¤Æɽ¼¨¤µ¤ì¤ë¡£  */
1486
1487 MFace *mface_magenta;
1488
1489 /*** @} */
1490 /*=*/
1491
1492 /***en @name Variables: The other symbols for face handling.  */
1493 /***ja @name ÊÑ¿ô: ¥Õ¥§¡¼¥¹¤ò¼è¤ê°·¤¦¤¿¤á¤Î¤½¤Î¾¤Î¥·¥ó¥Ü¥ë  */
1494 /*** @{ */
1495 /*=*/
1496
1497 /***en
1498     @brief Key of a text property specifying a face.
1499
1500     The variable #Mface is a symbol of name <tt>"face"</tt>.  A text
1501     property whose key is this symbol must have a pointer to an object
1502     of type #MFace.  This is a managing key.  */
1503
1504 /***ja
1505     @brief ¥Õ¥§¡¼¥¹¤ò»ØÄꤹ¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Î¥­¡¼.
1506
1507     ÊÑ¿ô #Mface ¤Ï <tt>"face"</tt> 
1508     ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£¤³¤Î¥·¥ó¥Ü¥ë¤ò¥­¡¼¤È¤¹¤ë¥Æ¥­¥¹¥È¥×¥í¥Ñ¥Æ¥£¤Ï¡¢
1509     #MFace ·¿¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò»ý¤¿¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
1510     ¤³¤ì¤Ï´ÉÍý¥­¡¼¤Ç¤¢¤ë¡£  */
1511
1512 MSymbol Mface;
1513 /*=*/
1514 /*** @} */
1515 /*=*/
1516
1517 /***en
1518     @brief Create a new face.
1519
1520     The mface () function creates a new face object that specifies no
1521     property.
1522
1523     @return
1524     This function returns a pointer to the created face.  */
1525
1526 /***ja
1527     @brief ¿·¤·¤¤¥Õ¥§¡¼¥¹¤ò¤Ä¤¯¤ë.
1528
1529     ´Ø¿ô mface () 
1530     ¤Ï¥×¥í¥Ñ¥Æ¥£¤ò°ìÀÚ»ý¤¿¤Ê¤¤¿·¤·¤¤¥Õ¥§¡¼¥¹¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¡£
1531
1532     @return
1533     ¤³¤Î´Ø¿ô¤Ïºî¤Ã¤¿¥Õ¥§¡¼¥¹¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£  */
1534
1535 MFace *
1536 mface ()
1537 {
1538   MFace *face;
1539
1540   M17N_OBJECT (face, free_face, MERROR_FACE);
1541   face->frame_list = mplist ();
1542   M17N_OBJECT_REGISTER (face_table, face);
1543   return face;
1544 }
1545
1546 /*=*/
1547
1548 /***en
1549     @brief Make a copy of a face.
1550
1551     The mface_copy () function makes a copy of $FACE and returns a
1552     pointer to the created copy.  */
1553
1554 /***ja
1555     @brief ¥Õ¥§¡¼¥¹¤Î¥³¥Ô¡¼¤òºî¤ë.
1556
1557     ´Ø¿ô mface_copy () ¤Ï¥Õ¥§¡¼¥¹ $FACE 
1558     ¤Î¥³¥Ô¡¼¤òºî¤ê¡¢¤½¤Î¥³¥Ô¡¼¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤¹¡£  */
1559
1560 MFace *
1561 mface_copy (MFace *face)
1562 {
1563   MFace *copy;
1564
1565   MSTRUCT_CALLOC (copy, MERROR_FACE);
1566   *copy = *face;
1567   copy->control.ref_count = 1;
1568   M17N_OBJECT_REGISTER (face_table, copy);
1569   copy->frame_list = mplist ();
1570   if (copy->property[MFACE_FONTSET])
1571     M17N_OBJECT_REF (copy->property[MFACE_FONTSET]);
1572   return copy;
1573 }
1574
1575 /*=*/
1576 /***en
1577     @brief Compare faces.
1578
1579     The mface_equal () function compares faces $FACE1 and $FACE2.
1580
1581     @return If two faces have the same property values, return 1.
1582     Otherwise return 0.  */
1583
1584 int
1585 mface_equal (MFace *face1, MFace *face2)
1586 {
1587   MFaceHLineProp *hline1, *hline2;
1588   MFaceBoxProp *box1, *box2;
1589   int i;
1590
1591   if (face1 == face2)
1592     return 1;
1593   if (memcmp (face1->property, face2->property, sizeof face1->property) == 0)
1594     return 1;
1595   for (i = MFACE_FOUNDRY; i <= MFACE_BACKGROUND; i++)
1596     if (face1->property[i] != face2->property[i])
1597       return 0;
1598   for (i = MFACE_VIDEOMODE; i <= MFACE_RATIO; i++)
1599     if (face1->property[i] != face2->property[i])
1600       return 0;
1601   hline1 = (MFaceHLineProp *) face1->property[MFACE_HLINE];
1602   hline2 = (MFaceHLineProp *) face2->property[MFACE_HLINE];
1603   if (hline1 != hline2)
1604     {
1605       if (! hline1 || ! hline2)
1606         return 0;
1607       if (memcmp (hline1, hline2, sizeof (MFaceHLineProp)) != 0)
1608         return 0;
1609     }
1610   box1 = (MFaceBoxProp *) face1->property[MFACE_BOX];
1611   box2 = (MFaceBoxProp *) face2->property[MFACE_BOX];
1612   if (box1 != box2)
1613     {
1614       if (! box1 || ! box2)
1615         return 0;
1616       if (memcmp (box1, box2, sizeof (MFaceBoxProp)) != 0)
1617         return 0;
1618     }
1619   return 1;
1620 }
1621
1622
1623 /*=*/
1624 /***en
1625     @brief Merge faces.
1626
1627     The mface_merge () functions merges the properties of face $SRC
1628     into $DST.
1629
1630     @return
1631     This function returns $DST.  */
1632
1633 /***ja
1634     @brief ¥Õ¥§¡¼¥¹¤òÅý¹ç¤¹¤ë.
1635
1636     ´Ø¿ô mface_merge () ¤Ï¡¢¥Õ¥§¡¼¥¹ $SRC ¤Î¥×¥í¥Ñ¥Æ¥£¤ò¥Õ¥§¡¼¥¹ $DST 
1637     ¤ËÅý¹ç¤¹¤ë¡£
1638
1639     @return
1640     ¤³¤Î´Ø¿ô¤Ï $DST ¤òÊÖ¤¹¡£  */
1641
1642 MFace *
1643 mface_merge (MFace *dst, MFace *src)
1644 {
1645   int i;
1646   MPlist *plist;
1647
1648   for (i = 0; i < MFACE_PROPERTY_MAX; i++)
1649     if (src->property[i])
1650       {
1651         if (i == MFACE_FONTSET)
1652           {
1653             M17N_OBJECT_UNREF (dst->property[i]);
1654             M17N_OBJECT_REF (src->property[i]);
1655           }
1656         dst->property[i] = src->property[i];
1657       }
1658
1659   MPLIST_DO (plist, dst->frame_list)
1660     {
1661       MFrame *frame = MPLIST_VAL (plist);
1662
1663       frame->tick++;
1664       if (dst == frame->face)
1665         mface__update_frame_face (frame);
1666     }
1667
1668   return dst;
1669 }
1670
1671 /*=*/
1672
1673 /***en
1674     @brief Make a face from a font.
1675
1676     The mface_from_font () function return a newly created face while
1677     reflecting the properties of $FONT in its properties.   */
1678
1679 /***ja
1680     @brief ¥Õ¥©¥ó¥È¤«¤é¥Õ¥§¡¼¥¹¤òºî¤ë.
1681
1682     ´Ø¿ô mface_from_font () ¤Ï¥Õ¥©¥ó¥È $FONT 
1683     ¤Î¥×¥í¥Ñ¥Æ¥£¤ò¥×¥í¥Ñ¥Æ¥£¤È¤·¤Æ»ý¤Ä¿·¤·¤¤¥Õ¥§¡¼¥¹¤òºî¤ê¡¢¤½¤ì¤òÊÖ¤¹¡£  */
1684
1685 MFace *
1686 mface_from_font (MFont *font)
1687 {
1688   MFace *face = mface ();
1689
1690   face->property[MFACE_FOUNDRY] = mfont_get_prop (font, Mfoundry);
1691   face->property[MFACE_FAMILY] = mfont_get_prop (font, Mfamily);
1692   face->property[MFACE_WEIGHT] = mfont_get_prop (font, Mweight);
1693   face->property[MFACE_STYLE] = mfont_get_prop (font, Mstyle);
1694   face->property[MFACE_STRETCH] = mfont_get_prop (font, Mstretch);
1695   face->property[MFACE_ADSTYLE] = mfont_get_prop (font, Madstyle);
1696   face->property[MFACE_SIZE] = mfont_get_prop (font, Msize);
1697   return face;
1698 }
1699
1700 /*=*/
1701
1702 /***en
1703     @brief Get the value of a face property.
1704
1705     The mface_get_prop () function returns the value of the face
1706     property whose key is $KEY in face $FACE.  $KEY must be one of the
1707     followings:
1708
1709         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1710         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1711         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
1712
1713     @return
1714     The actual type of the returned value depends of $KEY.  See
1715     documentation of the above keys.  If an error is detected, it
1716     returns @c NULL and assigns an error code to the external variable
1717     #merror_code.  */
1718
1719 /***ja
1720     @brief ¥Õ¥§¡¼¥¹¤Î¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÆÀ¤ë.
1721
1722     ´Ø¿ô mface_get_prop () ¤Ï¡¢¥Õ¥§¡¼¥¹ $FACE 
1723     ¤¬»ý¤Ä¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤ÎÆâ¡¢¥­¡¼¤¬ $KEY ¤Ç¤¢¤ë¤â¤Î¤ÎÃͤòÊÖ¤¹¡£
1724     $KEY ¤Ï²¼µ­¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
1725
1726         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1727         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1728         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
1729
1730     @return 
1731     Ìá¤êÃͤη¿¤Ï $KEY ¤Ë°Í¸¤¹¤ë¡£¾åµ­¤Î¥­¡¼¤ÎÀâÌÀ¤ò»²¾È¤¹¤ë¤³¤È¡£
1732     ¥¨¥é¡¼¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï @c NULL ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code 
1733     ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£  */
1734
1735 /***
1736     @seealso
1737     mface_put_prop ()
1738
1739     @errors
1740     @c MERROR_FACE  */
1741
1742 void *
1743 mface_get_prop (MFace *face, MSymbol key)
1744 {
1745   int index = (int) msymbol_get (key, M_face_prop_index) - 1;
1746
1747   if (index < 0)
1748     MERROR (MERROR_FACE, NULL);
1749   return face->property[index];
1750 }
1751
1752 /*=*/
1753
1754 /***en
1755     @brief Set a value of a face property.
1756
1757     The mface_put_prop () function assigns $VAL to the property whose
1758     key is $KEY in face $FACE.  $KEY must be one the followings:
1759
1760         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1761         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1762         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg
1763
1764     Among them, font related properties (#Mfoundry through #Msize) are
1765     used as the default values when a font in the fontset of $FACE
1766     does not specify those values.
1767
1768     The actual type of the returned value depends of $KEY.  See
1769     documentation of the above keys.
1770
1771     @return
1772     If the operation was successful, mface_put_prop () returns 0.
1773     Otherwise it returns -1 and assigns an error code to the external
1774     variable #merror_code.  */
1775
1776 /***ja
1777     @brief ¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤ÎÃͤòÀßÄꤹ¤ë.
1778
1779     ´Ø¿ô mface_put_prop () ¤Ï¡¢¥Õ¥§¡¼¥¹ $FACE Æâ¤Ç¥­¡¼¤¬ $KEY 
1780     ¤Ç¤¢¤ë¥×¥í¥Ñ¥Æ¥£¤ÎÃͤò $VAL ¤ËÀßÄꤹ¤ë¡£$KEY 
1781     ¤Ï°Ê²¼¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡£
1782
1783         #Mforeground, #Mbackground, #Mvideomode, #Mhline, #Mbox,
1784         #Mfoundry, #Mfamily, #Mweight, #Mstyle, #Mstretch, #Madstyle,
1785         #Msize, #Mfontset, #Mratio, #Mhook_func, #Mhook_arg.
1786
1787     ¤³¤ì¤é¤Î¤¦¤Á¤Î¡¢¥Õ¥©¥ó¥È´ØÏ¢¤Î¥×¥í¥Ñ¥Æ¥£ (#Mfamily ¤«¤é #Msize 
1788     ¤Þ¤Ç) ¤Ï¡¢¥Õ¥§¡¼¥¹¤Î¥Õ¥©¥ó¥È¥»¥Ã¥ÈÃæ¤Î¥Õ¥©¥ó¥È¤Ë´Ø¤¹¤ë¥Ç¥Õ¥©¥ë¥ÈÃͤȤʤꡢ¸Ä¡¹¤Î¥Õ¥©¥ó¥È¤¬Ãͤò»ØÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç¤ËÍѤ¤¤é¤ì¤ë¡£
1789
1790     Ìá¤êÃͤη¿¤Ï $KEY ¤Ë°Í¸¤¹¤ë¡£¾åµ­¤Î¥­¡¼¤ÎÀâÌÀ¤ò»²¾È¤¹¤ë¤³¤È¡£
1791
1792     @return
1793     ½èÍý¤¬À®¸ù¤·¤¿¾ì¹ç¡¢mface_put_prop () ¤Ï 0 ¤òÊÖ¤¹¡£¼ºÇÔ¤·¤¿¾ì¹ç¤Ï 
1794     -1 ¤òÊÖ¤·¡¢³°ÉôÊÑ¿ô #merror_code ¤Ë¥¨¥é¡¼¥³¡¼¥É¤òÀßÄꤹ¤ë¡£  */
1795
1796 /***
1797     @seealso
1798     mface_get_prop ()
1799
1800     @errors
1801     @c MERROR_FACE  */
1802
1803 int
1804 mface_put_prop (MFace *face, MSymbol key, void *val)
1805 {
1806   int index = (int) msymbol_get (key, M_face_prop_index) - 1;
1807   MPlist *plist;
1808
1809   if (index < 0)
1810     MERROR (MERROR_FACE, -1);
1811   if (key == Mfontset)
1812     {
1813       if (face->property[index])
1814         M17N_OBJECT_UNREF (face->property[index]);
1815       M17N_OBJECT_REF (val);
1816     }
1817   else if (key == Mhline)
1818     val = get_hline_create (val);
1819   else if (key == Mbox)
1820     val = get_box_create (val);
1821
1822   if (face->property[index] == val)
1823     return 0;
1824   face->property[index] = val;
1825
1826   MPLIST_DO (plist, face->frame_list)
1827     {
1828       MFrame *frame = MPLIST_VAL (plist);
1829
1830       frame->tick++;
1831       if (face == frame->face)
1832         mface__update_frame_face (frame);
1833     }
1834
1835   return 0;
1836 }
1837
1838 /*=*/
1839
1840 /***en
1841     @brief Update a face.
1842
1843     The mface_update () function update face $FACE on frame $FRAME by
1844     calling a hook function of $FACE (if any).  */
1845
1846 /***ja
1847     @brief ¥Õ¥§¡¼¥¹¤ò¹¹¿·¤¹¤ë.
1848
1849     ´Ø¿ô mface_update () ¤Ï¥Õ¥ì¡¼¥à $FRAME ¤Î¥Õ¥§¡¼¥¹ $FACE ¤ò $FACE 
1850     ¤Î¥Õ¥Ã¥¯´Ø¿ô¤ò¡Ê¤¢¤ì¤Ð¡Ë¸Æ¤ó¤Ç¹¹¿·¤¹¤ë¡£  */
1851
1852 void
1853 mface_update (MFrame *frame, MFace *face)
1854 {
1855   MFaceHookFunc func = (MFaceHookFunc) face->property[MFACE_HOOK_FUNC];
1856   MPlist *rface_list;
1857   MRealizedFace *rface;
1858
1859   if (func && func != noop_hook)
1860     {
1861       MPLIST_DO (rface_list, frame->realized_face_list)
1862         {
1863           rface = MPLIST_VAL (rface_list);
1864           if ((MFaceHookFunc) rface->face.property[MFACE_HOOK_FUNC] == func)
1865             (func) (&(rface->face), rface->face.property[MFACE_HOOK_ARG],
1866                     rface->info);
1867         }
1868     }
1869 }
1870 /*=*/
1871
1872 /*** @} */
1873 /*=*/
1874
1875 /*** @addtogroup m17nDebug */
1876 /*** @{  */
1877 /*=*/
1878
1879 /***en
1880     @brief Dump a face.
1881
1882     The mdebug_dump_face () function prints face $FACE in a human readable
1883     way to the stderr.  $INDENT specifies how many columns to indent
1884     the lines but the first one.
1885
1886     @return
1887     This function returns $FACE.  */
1888
1889 /***ja
1890     @brief ¥Õ¥§¡¼¥¹¤ò¥À¥ó¥×¤¹¤ë.
1891
1892     ´Ø¿ô mdebug_dump_face () ¤Ï¥Õ¥§¡¼¥¹ $FACE ¤ò stderr 
1893     ¤Ë¿Í´Ö¤Ë²ÄÆɤʷÁ¤Ç°õºþ¤¹¤ë¡£ $INDENT ¤Ï£²¹ÔÌܰʹߤΥ¤¥ó¥Ç¥ó¥È¤ò»ØÄꤹ¤ë¡£
1894
1895     @return
1896     ¤³¤Î´Ø¿ô¤Ï $FACE ¤òÊÖ¤¹¡£  */
1897
1898 MFace *
1899 mdebug_dump_face (MFace *face, int indent)
1900 {
1901   char *prefix = (char *) alloca (indent + 1);
1902   MFont spec;
1903
1904   memset (prefix, 32, indent);
1905   prefix[indent] = 0;
1906   mfont__set_spec_from_face (&spec, face);
1907   fprintf (stderr, "(face font:\"");
1908   mdebug_dump_font (&spec);
1909   fprintf (stderr, "\"\n %s  fore:%s back:%s", prefix,
1910            msymbol_name ((MSymbol) face->property[MFACE_FOREGROUND]),
1911            msymbol_name ((MSymbol) face->property[MFACE_BACKGROUND]));
1912   if (face->property[MFACE_FONTSET])
1913     fprintf (stderr, " non-default-fontset");
1914   fprintf (stderr, " hline:%s", face->property[MFACE_HLINE] ? "yes" : "no");
1915   fprintf (stderr, " box:%s)", face->property[MFACE_BOX] ? "yes" : "no");
1916   return face;
1917 }
1918
1919 /*** @} */
1920
1921 /*
1922   Local Variables:
1923   coding: euc-japan
1924   End:
1925 */