X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/9d7693d74c4ec73c01d03d990d552e1480ec2739..fa8678ebb05c28c54f114727a0bec7453903dbf0:/src/font.h diff --git a/src/font.h b/src/font.h index 3ee579aba2..fb559154d8 100644 --- a/src/font.h +++ b/src/font.h @@ -1,5 +1,5 @@ /* font.h -- Interface definition for font handling. - Copyright (C) 2006-2013 Free Software Foundation, Inc. + Copyright (C) 2006-2014 Free Software Foundation, Inc. Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 National Institute of Advanced Industrial Science and Technology (AIST) Registration Number H13PRO009 @@ -25,6 +25,8 @@ along with GNU Emacs. If not, see . */ #include "ccl.h" #include "frame.h" +INLINE_HEADER_BEGIN + /* We have three types of Lisp objects related to font. FONT-SPEC @@ -117,7 +119,7 @@ enum font_property_index font. */ FONT_AVGWIDTH_INDEX, -#if 0 +#if false /* The following two members are to substitute for the above 6 members (FONT_WEIGHT_INDEX to FONT_AVGWIDTH_INDEX excluding FONT_SIZE_INDEX) if it is found that font-entities consumes too @@ -201,38 +203,47 @@ enum font_property_index ? (XINT (AREF ((font), FONT_WIDTH_INDEX)) >> 8) : -1) /* Return the symbolic weight value of FONT. */ #define FONT_WEIGHT_SYMBOLIC(font) \ - font_style_symbolic (font, FONT_WEIGHT_INDEX, 0) + font_style_symbolic (font, FONT_WEIGHT_INDEX, false) /* Return the symbolic slant value of FONT. */ #define FONT_SLANT_SYMBOLIC(font) \ - font_style_symbolic (font, FONT_SLANT_INDEX, 0) + font_style_symbolic (font, FONT_SLANT_INDEX, false) /* Return the symbolic width value of FONT. */ #define FONT_WIDTH_SYMBOLIC(font) \ - font_style_symbolic (font, FONT_WIDTH_INDEX, 0) + font_style_symbolic (font, FONT_WIDTH_INDEX, false) /* Return the face-weight corresponding to the weight of FONT. */ #define FONT_WEIGHT_FOR_FACE(font) \ - font_style_symbolic (font, FONT_WEIGHT_INDEX, 1) + font_style_symbolic (font, FONT_WEIGHT_INDEX, true) /* Return the face-slant corresponding to the slant of FONT. */ #define FONT_SLANT_FOR_FACE(font) \ - font_style_symbolic (font, FONT_SLANT_INDEX, 1) + font_style_symbolic (font, FONT_SLANT_INDEX, true) /* Return the face-swidth corresponding to the slant of FONT. */ #define FONT_WIDTH_FOR_FACE(font) \ - font_style_symbolic (font, FONT_WIDTH_INDEX, 1) + font_style_symbolic (font, FONT_WIDTH_INDEX, true) /* Return the numeric weight value corresponding ot the symbol NAME. */ #define FONT_WEIGHT_NAME_NUMERIC(name) \ - (font_style_to_value (FONT_WEIGHT_INDEX, (name), 0) >> 8) + (font_style_to_value (FONT_WEIGHT_INDEX, (name), false) >> 8) /* Return the numeric slant value corresponding ot the symbol NAME. */ #define FONT_SLANT_NAME_NUMERIC(name) \ - (font_style_to_value (FONT_SLANT_INDEX, (name), 0) >> 8) + (font_style_to_value (FONT_SLANT_INDEX, (name), false) >> 8) /* Return the numeric width value corresponding ot the symbol NAME. */ #define FONT_WIDTH_NAME_NUMERIC(name) \ - (font_style_to_value (FONT_WIDTH_INDEX, (name), 0) >> 8) + (font_style_to_value (FONT_WIDTH_INDEX, (name), false) >> 8) /* Set the font property PROP of FONT to VAL. PROP is one of style-related font property index (FONT_WEIGHT/SLANT/WIDTH_INDEX). VAL (integer or symbol) is the numeric or symbolic style value. */ #define FONT_SET_STYLE(font, prop, val) \ - ASET ((font), prop, make_number (font_style_to_value (prop, val, 1))) + ASET ((font), prop, make_number (font_style_to_value (prop, val, true))) + +#ifndef MSDOS +#define FONT_WIDTH(f) ((f)->max_width) +#else +#define FONT_WIDTH(f) 1 +#endif +#define FONT_HEIGHT(f) ((f)->height) +#define FONT_BASE(f) ((f)->ascent) +#define FONT_DESCENT(f) ((f)->descent) extern Lisp_Object QCspacing, QCdpi, QCscalable, QCotf, QClang, QCscript; extern Lisp_Object QCavgwidth, QCantialias, QCfont_entity; @@ -307,6 +318,10 @@ struct font /* Ascent and descent of the font (in pixels). */ int ascent, descent; + /* The following members makes sense on graphic displays only. */ + +#if defined (HAVE_WINDOW_SYSTEM) + /* Vertical pixel width of the underline. If is zero if that information is not in the font. */ int underline_thickness; @@ -369,12 +384,6 @@ struct font registered in char-table `use-default-ascent'. */ int default_ascent; - /* CCL program to calculate code points of the font. */ - struct ccl_program *font_encoder; - - /* Font-driver for the font. */ - struct font_driver *driver; - /* Charset to encode a character code into a glyph code of the font. -1 means that the font doesn't require this information to encode a character. */ @@ -385,6 +394,11 @@ struct font determine it. */ int repertory_charset; +#endif /* HAVE_WINDOW_SYSTEM */ + + /* Font-driver for the font. */ + struct font_driver *driver; + /* There are more members in this structure, but they are private to the font-driver. */ }; @@ -412,24 +426,23 @@ struct font_bitmap int left; int top; int advance; - void *extra; }; /* Predicates to check various font-related objects. */ -/* 1 iff X is one of font-spec, font-entity, and font-object. */ +/* True iff X is one of font-spec, font-entity, and font-object. */ #define FONTP(x) PSEUDOVECTORP (x, PVEC_FONT) -/* 1 iff X is font-spec. */ +/* True iff X is font-spec. */ #define FONT_SPEC_P(x) \ (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_SPEC_MAX) -/* 1 iff X is font-entity. */ +/* True iff X is font-entity. */ #define FONT_ENTITY_P(x) \ (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_ENTITY_MAX) -/* 1 iff X is font-object. */ +/* True iff X is font-object. */ #define FONT_OBJECT_P(x) \ (FONTP (x) && (ASIZE (x) & PSEUDOVECTOR_SIZE_MASK) == FONT_OBJECT_MAX) -/* 1 iff ENTITY can't be loaded. */ +/* True iff ENTITY can't be loaded. */ #define FONT_ENTITY_NOT_LOADABLE(entity) \ EQ (AREF (entity, FONT_OBJLIST_INDEX), Qt) @@ -441,27 +454,30 @@ struct font_bitmap /* Check macros for various font-related objects. */ #define CHECK_FONT(x) \ - do { if (! FONTP (x)) wrong_type_argument (Qfont, x); } while (0) + do { if (! FONTP (x)) wrong_type_argument (Qfont, x); } while (false) #define CHECK_FONT_SPEC(x) \ - do { if (! FONT_SPEC_P (x)) wrong_type_argument (Qfont_spec, x); } while (0) + do { if (! FONT_SPEC_P (x)) wrong_type_argument (Qfont_spec, x); } \ + while (false) #define CHECK_FONT_ENTITY(x) \ - do { if (! FONT_ENTITY_P (x)) wrong_type_argument (Qfont_entity, x); } while (0) + do { if (! FONT_ENTITY_P (x)) wrong_type_argument (Qfont_entity, x); } \ + while (false) #define CHECK_FONT_OBJECT(x) \ - do { if (! FONT_OBJECT_P (x)) wrong_type_argument (Qfont_object, x); } while (0) + do { if (! FONT_OBJECT_P (x)) wrong_type_argument (Qfont_object, x); } \ + while (false) #define CHECK_FONT_GET_OBJECT(x, font) \ do { \ CHECK_FONT_OBJECT (x); \ font = XFONT_OBJECT (x); \ - } while (0) + } while (false) #define XFONT_SPEC(p) \ - (eassert (FONT_SPEC_P (p)), (struct font_spec *) XUNTAG (p, Lisp_Vectorlike)) + (eassert (FONT_SPEC_P (p)), (struct font_spec *) SCM_SMOB_DATA (p)) #define XFONT_ENTITY(p) \ (eassert (FONT_ENTITY_P (p)), \ - (struct font_entity *) XUNTAG (p, Lisp_Vectorlike)) + (struct font_entity *) SCM_SMOB_DATA (p)) #define XFONT_OBJECT(p) \ - (eassert (FONT_OBJECT_P (p)), (struct font *) XUNTAG (p, Lisp_Vectorlike)) + (eassert (FONT_OBJECT_P (p)), (struct font *) SCM_SMOB_DATA (p)) #define XSETFONT(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_FONT)) /* Number of pt per inch (from the TeXbook). */ @@ -545,14 +561,12 @@ struct font_driver Lisp_Object (*open) (struct frame *f, Lisp_Object font_entity, int pixel_size); - /* Close FONT on frame F. */ - void (*close) (struct frame *f, struct font *font); + /* Close FONT. NOTE: this can be called by GC. */ + void (*close) (struct font *font); - /* Optional (if FACE->extra is not used). - Prepare FACE for displaying characters by FONT on frame F by - storing some data in FACE->extra. If successful, return 0. - Otherwise, return -1. */ - int (*prepare_face) (struct frame *f, struct face *face); + /* Prepare FACE for displaying characters by FONT on frame F by + storing some data in FACE->extra. */ + void (*prepare_face) (struct frame *f, struct face *face); /* Optional. Done FACE for displaying characters by FACE->font on frame F. */ @@ -575,6 +589,8 @@ struct font_driver unsigned *code, int nglyphs, struct font_metrics *metrics); +#ifdef HAVE_WINDOW_SYSTEM + /* Optional. Draw glyphs between FROM and TO of S->char2b at (X Y) pixel position of frame F with S->FACE and S->GC. If WITH_BACKGROUND, @@ -595,6 +611,8 @@ struct font_driver Free bitmap data in BITMAP. */ void (*free_bitmap) (struct font *font, struct font_bitmap *bitmap); +#endif /* HAVE_WINDOW_SYSTEM */ + /* Optional. Return an outline data for glyph-code CODE of FONT. The format of the outline data depends on the font-driver. */ @@ -773,6 +791,15 @@ extern int font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int bytes); extern void register_font_driver (struct font_driver *driver, struct frame *f); extern void free_font_driver_list (struct frame *f); +#ifdef ENABLE_CHECKING +extern bool valid_font_driver (struct font_driver *); +#else +INLINE bool +valid_font_driver (struct font_driver *d) +{ + return true; +} +#endif extern Lisp_Object font_update_drivers (struct frame *f, Lisp_Object list); extern Lisp_Object font_range (ptrdiff_t, ptrdiff_t, ptrdiff_t *, struct window *, struct face *, @@ -805,7 +832,8 @@ extern void syms_of_ftxfont (void); extern Lisp_Object Qxft; extern struct font_driver xftfont_driver; extern void syms_of_xftfont (void); -#elif defined HAVE_FREETYPE +#endif +#if defined HAVE_FREETYPE || defined HAVE_XFT extern struct font_driver ftxfont_driver; #endif #ifdef HAVE_BDFFONT @@ -821,6 +849,7 @@ extern void syms_of_w32font (void); extern Lisp_Object Qfontsize; extern struct font_driver nsfont_driver; extern void syms_of_nsfont (void); +extern void syms_of_macfont (void); #endif /* HAVE_NS */ #ifndef FONT_DEBUG @@ -836,12 +865,14 @@ extern void font_deferred_log (const char *, Lisp_Object, Lisp_Object); do { \ if (! EQ (Vfont_log, Qt)) \ font_add_log ((ACTION), (ARG), (RESULT)); \ - } while (0) + } while (false) #define FONT_DEFERRED_LOG(ACTION, ARG, RESULT) \ do { \ if (! EQ (Vfont_log, Qt)) \ font_deferred_log ((ACTION), (ARG), (RESULT)); \ - } while (0) + } while (false) + +INLINE_HEADER_END #endif /* not EMACS_FONT_H */