/* font.c -- font module.
- Copyright (C) 2003, 2004, 2005, 2006
+ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
National Institute of Advanced Industrial Science and Technology (AIST)
Registration Number H15PRO112
You should have received a copy of the GNU Lesser General Public
License along with the m17n library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
02111-1307, USA. */
/***en
When the key of a font property is @c Msize or @c Mresolution, its
value is an integer. Otherwise the value is a symbol.
- "The font property that belongs to font F and whose key is @c
- Mxxx" may be shortened to "the xxx property of F".
+ The notation "xxx property of F" means the font property that
+ belongs to font F and whose key is @c Mxxx.
The value of a foundry property is a symbol representing font
foundry information, e.g. adobe, misc, etc.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <ctype.h>
#include "m17n-gui.h"
#include "m17n-misc.h"
default_encoding.repertory_name = Mnil;
default_encoding.repertory_charset = NULL;
{
- char *path, *buf;
+ char *path, *buf = NULL;
int bufsize;
USE_SAFE_ALLOCA;
if (mfont__ft_init () < 0)
return -1;
#endif /* HAVE_FREETYPE */
- if (mfont__flt_init () < 0)
- return -1;
return 0;
}
MPlist *plist;
int i;
- mfont__flt_fini ();
#ifdef HAVE_FREETYPE
mfont__ft_fini ();
#endif /* HAVE_FREETYPE */
MSymbol
mfont__id (MFont *font)
{
- char *buf, *p;
+ char *buf = NULL, *p;
int i;
int file_len = (font->file == Mnil ? 0 : MSYMBOL_NAMELEN (font->file));
int capability_len = (font->capability == Mnil ? 0
MGlyph *from_g = MGLYPH (from), *to_g = MGLYPH (to), *g;
MRealizedFont *rfont = from_g->rface->rfont;
- for (g = from_g; g != to_g; g++)
- if (g->rface->rfont != rfont)
+ for (g = from_g; ; g++)
+ if (g == to_g || g->rface->rfont != rfont)
{
int idx = GLYPH_INDEX (g);
(rfont->driver->find_metric) (rfont, gstring, from, idx);
- from_g = g;
+ while (from_g < g)
+ {
+ from_g->g.xadv >>= 6;
+ from_g->g.yadv >>= 6;
+ from_g->g.xoff >>= 6;
+ from_g->g.yoff >>= 6;
+ from_g->g.ascent >>= 6;
+ from_g->g.descent >>= 6;
+ from_g->g.lbearing >>= 6;
+ from_g->g.rbearing >>= 6;
+ from_g++;
+ }
+ if (g == to_g)
+ break;
rfont = g->rface->rfont;
from = idx;
}
- (rfont->driver->find_metric) (rfont, gstring, from, GLYPH_INDEX (g));
}
+int
+mfont__get_glyph_id (MFLTFont *font, MFLTGlyphString *gstring,
+ int from, int to)
+{
+ MFont *mfont = (MFont *) ((MFLTFontForRealized *) font)->rfont;
+ MRealizedFont *rfont = ((MFLTFontForRealized *) font)->rfont;
+ MFontEncoding *encoding;
+ MFontDriver *driver = NULL;
+ MGlyph *glyphs = (MGlyph *) gstring->glyphs;
+ int result = 0;
+
+ encoding = mfont->encoding ? mfont->encoding : find_encoding (mfont);
+ for (; from < to; from++)
+ {
+ MGlyph *g = glyphs + from;
+
+ if (g->g.encoded)
+ continue;
+ if (mfont->source == MFONT_SOURCE_X && encoding->repertory_charset)
+ g->g.code = ENCODE_CHAR (encoding->repertory_charset, g->g.c);
+ else
+ {
+ unsigned code;
+
+ if (encoding->encoding_charset)
+ code = ENCODE_CHAR (encoding->encoding_charset, g->g.c);
+ else
+ code = g->g.code;
+
+ if (code != MCHAR_INVALID_CODE)
+ {
+ if (! driver)
+ {
+ if (mfont->type == MFONT_TYPE_REALIZED)
+ driver = rfont->driver;
+ else
+ {
+ driver = mplist_get (rfont->frame->font_driver_list,
+ mfont->source == MFONT_SOURCE_X
+ ? Mx : Mfreetype);
+ if (! driver)
+ MFATAL (MERROR_FONT);
+ }
+ }
+ g->g.code = (driver->encode_char) (rfont->frame, rfont->font,
+ mfont, code);
+ }
+ }
+ g->g.encoded = 1;
+ if (g->g.code == MCHAR_INVALID_CODE)
+ result = -1;
+ }
+ return result;
+}
+
+int
+mfont__get_metrics (MFLTFont *font, MFLTGlyphString *gstring,
+ int from, int to)
+{
+ MRealizedFont *rfont = ((MFLTFontForRealized *) font)->rfont;
+ MGlyphString gstr;
+
+ gstr.glyphs = (MGlyph *) gstring->glyphs;
+ (rfont->driver->find_metric) (rfont, &gstr, from, to);
+ return 0;
+}
/* KEY <= MFONT_REGISTRY */
/***ja
@brief ³«È¯¸µ¤ò»ØÄꤹ¤ë¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼.
- ÊÑ¿ô #Mfoundry ¤Ï <tt>"fonudry"</tt>
+ ÊÑ¿ô #Mfoundry ¤Ï <tt>"foundry"</tt>
¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ê¡¢¥Õ¥©¥ó¥È¥×¥í¥Ñ¥Æ¥£¤È¥Õ¥§¡¼¥¹¥×¥í¥Ñ¥Æ¥£¤Î¥¡¼¤È¤·¤ÆÍѤ¤¤é¤ì¤ë¡£
Ãͤϡ¢¥Õ¥©¥ó¥È¤Î³«È¯¸µÌ¾¤ò̾Á°¤È¤·¤Æ»ý¤Ä¥·¥ó¥Ü¥ë¤Ç¤¢¤ë¡£ */
/***en
@brief Symbol of name "x".
- The variable #Mx is to be used for a value of <type> member of the
- structure #MDrawGlyph to specify the type of <fontp> member is
+ The variable #Mx is to be used for a value of \<type\> member of the
+ structure #MDrawGlyph to specify the type of \<fontp\> member is
actually (XFontStruct *). */
/***ja
@brief "x" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
- ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
- ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
+ ÊÑ¿ô #Mx ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
+ ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XFontStruct *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹. */
MSymbol Mx;
/***en
@brief Symbol of name "freetype".
- The variable #Mfreetype is to be used for a value of <type> member
- of the structure #MDrawGlyph to specify the type of <fontp> member
+ The variable #Mfreetype is to be used for a value of \<type\> member
+ of the structure #MDrawGlyph to specify the type of \<fontp\> member
is actually FT_Face. */
/***ja
@brief "freetype" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
- ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
- ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
+ ÊÑ¿ô #Mfreetype ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
+ ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï FT_Face ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
MSymbol Mfreetype;
/***en
@brief Symbol of name "xft".
- The variable #Mxft is to be used for a value of <type> member of the
- structure #MDrawGlyph to specify the type of <fontp> member
+ The variable #Mxft is to be used for a value of \<type\> member of the
+ structure #MDrawGlyph to specify the type of \<fontp\> member
is actually (XftFont *). */
/***ja
@brief "xft" ¤È¤¤¤¦Ì¾Á°¤ò»ý¤Ä¥·¥ó¥Ü¥ë.
- ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð <type>
- ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð <fontp> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
+ ÊÑ¿ô #Mxft ¤Ï¹½Â¤ #MDrawGlyph ¤Î¥á¥ó¥Ð \<type\>
+ ¤ÎÃͤȤ·¤ÆÍѤ¤¤é¤ì¡¢¥á¥ó¥Ð \<fontp\> ¤Î·¿¤¬¼ÂºÝ¤Ë¤Ï (XftFont *) ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£ */
MSymbol Mxft;
If $FONT is a return value of mfont_find (), $KEY can also be one
of the following symbols:
- #Mfont_ascent, #Mfont_descent, #Mmax_advance.
+ @b Mfont_ascent, @b Mfont_descent, #Mmax_advance.
- @return If $KEY is @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle,
+ @return
+ If $KEY is @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle,
@c Mstretch, @c Madstyle, @c Mregistry, or @c Mspacing, this
function returns the corresponding value as a symbol. If the font
does not have $KEY property, it returns @c Mnil. If $KEY is @c
- Msize, @c Mresolution, #Mfont_ascent, Mfont_descent, or
+ Msize, @c Mresolution, @b Mfont_ascent, Mfont_descent, or
#Mmax_advance, this function returns the corresponding value as an
integer. If the font does not have $KEY property, it returns 0.
If $KEY is something else, it returns @c NULL and assigns an error
@c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c Mstretch,
@c Madstyle, @c Mregistry, @c Msize, @c Mresolution, @c Mspacing.
- @return $KEY ¤¬ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c
+ @return
+ $KEY ¤¬ @c Mfoundry, @c Mfamily, @c Mweight, @c Mstyle, @c
Mstretch, @c Madstyle, @c Mregistry, @c Mspacing ¤Î¤¤¤º¤ì¤«¤Ç¤¢¤ì¤Ð¡¢
ÁêÅö¤¹¤ëÃͤò¥·¥ó¥Ü¥ë¤È¤·¤ÆÊÖ¤¹¡£¥Õ¥©¥ó¥È¤¬¤½¤Î¥×¥í¥Ñ¥Æ¥£¤ò»ý¤¿¤Ê¤¤
¾ì¹ç¤Ë¤Ï@c Mnil ¤òÊÖ¤¹¡£$KEY ¤¬ @c Msize ¤¢¤ë¤¤¤Ï @c Mresolution ¤Î
The mfont_check () function checkes if $FONT can be used for
$SCRIPT and $LANGUAGE in $FONTSET on $FRAME.
- @return If the font is usable, return 1. Otherwise return 0.
+ @return
+ If the font is usable, return 1. Otherwise return 0.
*/
int
@brief Encapusulate a font.
The mfont_encapsulate () functions realizes a font by
- encapusulating data $DATA or type $DATA_TYPE on #FRAME. Currently
+ encapusulating data $DATA or type $DATA_TYPE on $FRAME. Currently
$DATA_TAPE is #Mfontconfig or #Mfreetype, and $DATA points to an
object of FcPattern or FT_Face respectively.