X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/8546720e6f25eb988e8215de6678798053031440..70c60eb2f9e5120f609ba5b6f2d82eef26d21c15:/src/ftfont.c diff --git a/src/ftfont.c b/src/ftfont.c index 06ba6d7fe2..7858a31be2 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -39,7 +39,7 @@ along with GNU Emacs. If not, see . */ #include "ftfont.h" /* Symbolic type of this font-driver. */ -Lisp_Object Qfreetype; +static Lisp_Object Qfreetype; /* Fontconfig's generic families and their aliases. */ static Lisp_Object Qmonospace, Qsans_serif, Qserif, Qmono, Qsans, Qsans__serif; @@ -160,11 +160,13 @@ static struct static Lisp_Object get_adstyle_property (FcPattern *p) { - unsigned char *str, *end; + FcChar8 *fcstr; + char *str, *end; Lisp_Object adstyle; - if (FcPatternGetString (p, FC_STYLE, 0, (FcChar8 **) &str) != FcResultMatch) + if (FcPatternGetString (p, FC_STYLE, 0, &fcstr) != FcResultMatch) return Qnil; + str = (char *) fcstr; for (end = str; *end && *end != ' '; end++); if (*end) { @@ -189,19 +191,20 @@ static Lisp_Object ftfont_pattern_entity (FcPattern *p, Lisp_Object extra) { Lisp_Object key, cache, entity; - unsigned char *file, *str; + FcChar8 *str; + char *file; int idx; int numeric; double dbl; FcBool b; - if (FcPatternGetString (p, FC_FILE, 0, (FcChar8 **) &file) != FcResultMatch) + if (FcPatternGetString (p, FC_FILE, 0, &str) != FcResultMatch) return Qnil; if (FcPatternGetInteger (p, FC_INDEX, 0, &idx) != FcResultMatch) return Qnil; - key = Fcons (make_unibyte_string ((char *) file, strlen ((char *) file)), - make_number (idx)); + file = (char *) str; + key = Fcons (make_unibyte_string (file, strlen (file)), make_number (idx)); cache = ftfont_lookup_cache (key, FTFONT_CACHE_FOR_ENTITY); entity = XCAR (cache); if (! NILP (entity)) @@ -211,6 +214,10 @@ ftfont_pattern_entity (FcPattern *p, Lisp_Object extra) for (i = 0; i < FONT_OBJLIST_INDEX; i++) ASET (val, i, AREF (entity, i)); + + ASET (val, FONT_EXTRA_INDEX, Fcopy_sequence (extra)); + font_put_extra (val, QCfont_entity, key); + return val; } entity = font_make_entity (); @@ -219,10 +226,16 @@ ftfont_pattern_entity (FcPattern *p, Lisp_Object extra) ASET (entity, FONT_TYPE_INDEX, Qfreetype); ASET (entity, FONT_REGISTRY_INDEX, Qiso10646_1); - if (FcPatternGetString (p, FC_FOUNDRY, 0, (FcChar8 **) &str) == FcResultMatch) - ASET (entity, FONT_FOUNDRY_INDEX, font_intern_prop (str, strlen (str), 1)); - if (FcPatternGetString (p, FC_FAMILY, 0, (FcChar8 **) &str) == FcResultMatch) - ASET (entity, FONT_FAMILY_INDEX, font_intern_prop (str, strlen (str), 1)); + if (FcPatternGetString (p, FC_FOUNDRY, 0, &str) == FcResultMatch) + { + char *s = (char *) str; + ASET (entity, FONT_FOUNDRY_INDEX, font_intern_prop (s, strlen (s), 1)); + } + if (FcPatternGetString (p, FC_FAMILY, 0, &str) == FcResultMatch) + { + char *s = (char *) str; + ASET (entity, FONT_FAMILY_INDEX, font_intern_prop (s, strlen (s), 1)); + } if (FcPatternGetInteger (p, FC_WEIGHT, 0, &numeric) == FcResultMatch) { if (numeric >= FC_WEIGHT_REGULAR && numeric < FC_WEIGHT_MEDIUM) @@ -673,7 +686,10 @@ ftfont_get_open_type_spec (Lisp_Object otf_spec) if (NILP (val)) continue; len = Flength (val); - spec->features[i] = malloc (sizeof (int) * XINT (len)); + spec->features[i] = + (min (PTRDIFF_MAX, SIZE_MAX) / sizeof (int) < XINT (len) + ? 0 + : malloc (sizeof (int) * XINT (len))); if (! spec->features[i]) { if (i > 0 && spec->features[0]) @@ -806,7 +822,7 @@ ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **ots goto err; for (chars = XCDR (chars); CONSP (chars); chars = XCDR (chars)) if (CHARACTERP (XCAR (chars)) - && ! FcCharSetAddChar (charset, XUINT (XCAR (chars)))) + && ! FcCharSetAddChar (charset, XFASTINT (XCAR (chars)))) goto err; } } @@ -1603,7 +1619,6 @@ ftfont_get_metrics (MFLTFont *font, MFLTGlyphString *gstring, if (g->code != FONT_INVALID_CODE) { FT_Glyph_Metrics *m; - int lbearing, rbearing, ascent, descent, xadv; if (FT_Load_Glyph (ft_face, g->code, FT_LOAD_DEFAULT) != 0) abort (); @@ -1753,15 +1768,10 @@ static OTF_GlyphString otf_gstring; static void setup_otf_gstring (int size) { - if (otf_gstring.size == 0) - { - otf_gstring.glyphs = (OTF_Glyph *) xmalloc (sizeof (OTF_Glyph) * size); - otf_gstring.size = size; - } - else if (otf_gstring.size < size) + if (otf_gstring.size < size) { - otf_gstring.glyphs = xrealloc (otf_gstring.glyphs, - sizeof (OTF_Glyph) * size); + otf_gstring.glyphs = xnrealloc (otf_gstring.glyphs, + size, sizeof (OTF_Glyph)); otf_gstring.size = size; } otf_gstring.used = size; @@ -1858,7 +1868,6 @@ ftfont_drive_otf (MFLTFont *font, { MFLTGlyph *g; int min_from, max_to; - int j; int feature_idx = otfg->positioning_type >> 4; g = out->glyphs + out->used; @@ -2378,8 +2387,8 @@ static Lisp_Object ftfont_shape_by_flt (Lisp_Object lgstring, struct font *font, FT_Face ft_face, OTF *otf, FT_Matrix *matrix) { - EMACS_UINT len = LGSTRING_GLYPH_LEN (lgstring); - EMACS_UINT i; + EMACS_INT len = LGSTRING_GLYPH_LEN (lgstring); + EMACS_INT i; struct MFLTFontFT flt_font_ft; MFLT *flt = NULL; int with_variation_selector = 0; @@ -2405,7 +2414,10 @@ ftfont_shape_by_flt (Lisp_Object lgstring, struct font *font, if (CHAR_VARIATION_SELECTOR_P (c)) with_variation_selector++; } + len = i; + lint_assume (len <= TYPE_MAXIMUM (EMACS_INT) - 2); + if (with_variation_selector) { setup_otf_gstring (len); @@ -2435,17 +2447,19 @@ ftfont_shape_by_flt (Lisp_Object lgstring, struct font *font, } } + if (INT_MAX / 2 < len) + memory_full (SIZE_MAX); + if (gstring.allocated == 0) { - gstring.allocated = len * 2; gstring.glyph_size = sizeof (MFLTGlyph); - gstring.glyphs = xmalloc (sizeof (MFLTGlyph) * gstring.allocated); + gstring.glyphs = xnmalloc (len * 2, sizeof (MFLTGlyph)); + gstring.allocated = len * 2; } else if (gstring.allocated < len * 2) { + gstring.glyphs = xnrealloc (gstring.glyphs, len * 2, sizeof (MFLTGlyph)); gstring.allocated = len * 2; - gstring.glyphs = xrealloc (gstring.glyphs, - sizeof (MFLTGlyph) * gstring.allocated); } memset (gstring.glyphs, 0, sizeof (MFLTGlyph) * len); for (i = 0; i < len; i++) @@ -2494,9 +2508,11 @@ ftfont_shape_by_flt (Lisp_Object lgstring, struct font *font, int result = mflt_run (&gstring, 0, len, &flt_font_ft.flt_font, flt); if (result != -2) break; - gstring.allocated += gstring.allocated; - gstring.glyphs = xrealloc (gstring.glyphs, - sizeof (MFLTGlyph) * gstring.allocated); + if (INT_MAX / 2 < gstring.allocated) + memory_full (SIZE_MAX); + gstring.glyphs = xnrealloc (gstring.glyphs, + gstring.allocated, 2 * sizeof (MFLTGlyph)); + gstring.allocated *= 2; } if (gstring.used > LGSTRING_GLYPH_LEN (lgstring)) return Qnil;