]> git.eshelyaron.com Git - emacs.git/commitdiff
merge trunk
authorKenichi Handa <handa@etlken>
Fri, 9 Jul 2010 06:55:27 +0000 (15:55 +0900)
committerKenichi Handa <handa@etlken>
Fri, 9 Jul 2010 06:55:27 +0000 (15:55 +0900)
1  2 
src/font.c

diff --cc src/font.c
index e72030ad3b79c0c5168393d99f4f2197e5421b7c,42a61a5eccd90ea6edacef853b25d6594351b797..bf3c4b6c8c2a30e55c6ef5f35f71fa948c43a841
@@@ -4105,25 -4100,15 +4100,24 @@@ properties in TO.  */
  DEFUN ("font-get", Ffont_get, Sfont_get, 2, 2, 0,
         doc: /* Return the value of FONT's property KEY.
  FONT is a font-spec, a font-entity, or a font-object.
 -KEY must be one of these symbols:
 +KEY is any symbol, but these are reserved for specific meanings:
    :family, :weight, :slant, :width, :foundry, :adstyle, :registry,
 -  :size, :name, :script
 +  :size, :name, :script, :otf
  See the documentation of `font-spec' for their meanings.
 -If FONT is a font-entity or font-object, the value of :script may be
 -a list of scripts that are supported by the font.  */)
 +In addition, if FONT is a font-entity or a font-object, values of
 +:script and :otf are different from those of a font-spec as below:
 +
 +The value of :script may be a list of scripts that are supported by the font.
 +
 +The value of :otf is a cons (GSUB . GPOS) where GSUB and GPOS are lists
 +representing the OpenType features supported by the font by this form:
 +  ((SCRIPT (LANGSYS FEATURE ...) ...) ...)
 +SCRIPT, LANGSYS, and FEATURE are all symbols representing OpenType
 +Layout tags.  */)
-      (font, key)
-      Lisp_Object font, key;
+   (Lisp_Object font, Lisp_Object key)
  {
    int idx;
 +  Lisp_Object val;
  
    CHECK_FONT (font);
    CHECK_SYMBOL (key);
@@@ -4246,17 -4209,8 +4239,16 @@@ are to be displayed on.  If omitted, th
  #endif
  
  DEFUN ("font-put", Ffont_put, Sfont_put, 3, 3, 0,
 -       doc: /* Set one property of FONT-SPEC: give property PROP value VAL.  */)
 -  (Lisp_Object font_spec, Lisp_Object prop, Lisp_Object val)
 +       doc: /* Set one property of FONT: give property KEY value VAL.
 +FONT is a font-spec, a font-entity, or a font-object.
 +
 +If FONT is a font-spec, KEY can be any symbol.  But if KEY is the one
 +accepted by the function `font-spec' (which see), VAL must be what
 +allowed in `font-spec'.
 +
 +If FONT is a font-entity or a font-object, KEY must not be the one
 +accepted by `font-spec'.  */)
-      (font, prop, val)
-      Lisp_Object font, prop, val;
++  (Lisp_Object font, Lisp_Object prop, Lisp_Object val)
  {
    int idx;
  
@@@ -4828,94 -4758,18 +4807,94 @@@ If the font is not OpenType font, CAPAB
    return val;
  }
  
 -DEFUN ("get-font-glyphs", Fget_font_glyphs, Sget_font_glyphs, 2, 2, 0,
 -       doc: /* Return a vector of glyphs of FONT-OBJECT for drawing STRING.
 -Each element is a vector [GLYPH-CODE LBEARING RBEARING WIDTH ASCENT DESCENT].  */)
 -  (Lisp_Object font_object, Lisp_Object string)
 +DEFUN ("font-get-glyphs", Ffont_get_glyphs, Sfont_get_glyphs, 3, 4, 0,
 +       doc:
 +       /* Return a vector of FONT-OBJECT's glyphs for the specified characters.
 +FROM and TO are positions (integers or markers) specifying a region
 +of the current buffer.
 +If the optional fourth arg OBJECT is not nil, it is a string or a
 +vector containing the target characters.
 +
 +Each element is a vector containing information of a glyph in this format:
 +  [FROM-IDX TO-IDX C CODE WIDTH LBEARING RBEARING ASCENT DESCENT ADJUSTMENT]
 +where
 +  FROM is an index numbers of a character the glyph corresponds to.
 +  TO is the same as FROM.
 +  C is the character of the glyph.
 +  CODE is the glyph-code of C in FONT-OBJECT.
 +  WIDTH thru DESCENT are the metrics (in pixels) of the glyph.
 +  ADJUSTMENT is always nil.
 +If FONT-OBJECT doesn't have a glyph for a character,
 +the corresponding element is nil.  */)
-      (font_object, from, to, object)
-      Lisp_Object font_object, from, to, object;
++  (Lisp_Object font_object, Lisp_Object from, Lisp_Object to,
++   Lisp_Object object)
  {
    struct font *font;
 -  int i, len;
 -  Lisp_Object vec;
 +  int i, len, c;
 +  Lisp_Object *chars, vec;
 +  USE_SAFE_ALLOCA;
  
    CHECK_FONT_GET_OBJECT (font_object, font);
 -  CHECK_STRING (string);
 -  len = SCHARS (string);
 +  if (NILP (object))
 +    {
 +      EMACS_INT charpos, bytepos;
 +
 +      validate_region (&from, &to);
 +      if (EQ (from, to))
 +      return Qnil;
 +      len = XFASTINT (to) - XFASTINT (from);
 +      SAFE_ALLOCA_LISP (chars, len);
 +      charpos = XFASTINT (from);
 +      bytepos = CHAR_TO_BYTE (charpos);
 +      for (i = 0; charpos < XFASTINT (to); i++)
 +      {
 +        FETCH_CHAR_ADVANCE (c, charpos, bytepos);
 +        chars[i] = make_number (c);
 +      }
 +    }
 +  else if (STRINGP (object))
 +    {
 +      const unsigned char *p;
 +
 +      CHECK_NUMBER (from);
 +      CHECK_NUMBER (to);
 +      if (XINT (from) < 0 || XINT (from) > XINT (to)
 +        || XINT (to) > SCHARS (object))
 +      args_out_of_range_3 (object, from, to);
 +      if (EQ (from, to))
 +      return Qnil;
 +      len = XFASTINT (to) - XFASTINT (from);
 +      SAFE_ALLOCA_LISP (chars, len);
 +      p = SDATA (object);
 +      if (STRING_MULTIBYTE (object))
 +      for (i = 0; i < len; i++)
 +        {
 +          c = STRING_CHAR_ADVANCE (p);
 +          chars[i] = make_number (c);
 +        }
 +      else
 +      for (i = 0; i < len; i++)
 +        chars[i] = make_number (p[i]);
 +    }
 +  else
 +    {
 +      CHECK_VECTOR (object);
 +      CHECK_NUMBER (from);
 +      CHECK_NUMBER (to);
 +      if (XINT (from) < 0 || XINT (from) > XINT (to)
 +        || XINT (to) > ASIZE (object))
 +      args_out_of_range_3 (object, from, to);
 +      if (EQ (from, to))
 +      return Qnil;
 +      len = XFASTINT (to) - XFASTINT (from);
 +      for (i = 0; i < len; i++)
 +      {
 +        Lisp_Object elt = AREF (object, XFASTINT (from) + i);
 +        CHECK_CHARACTER (elt);
 +      }
 +      chars = &(AREF (object, XFASTINT (from)));
 +    }
 +
    vec = Fmake_vector (make_number (len), Qnil);
    for (i = 0; i < len; i++)
      {