aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDmitry Antipov2014-10-31 14:09:00 +0300
committerDmitry Antipov2014-10-31 14:09:00 +0300
commitb645a03e5cd981e73bd278202bd47629895598fd (patch)
treea9c75fea213ffcfa15f5a2c486b2d54b4d93553b /src
parentb77b92545557087ca7fe75c4bf79885354c58be4 (diff)
downloademacs-b645a03e5cd981e73bd278202bd47629895598fd.tar.gz
emacs-b645a03e5cd981e73bd278202bd47629895598fd.zip
* font.c (copy_font_spec): Redesign to avoid Fcopy_alist
and unnecessary initialization. Adjust comments.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/font.c44
2 files changed, 31 insertions, 18 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 88445f3aff4..4337a3f1e67 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
12014-10-31 Dmitry Antipov <dmantipov@yandex.ru>
2
3 * font.c (copy_font_spec): Redesign to avoid Fcopy_alist
4 and unnecessary initialization. Adjust comments.
5
12014-10-30 Eli Zaretskii <eliz@gnu.org> 62014-10-30 Eli Zaretskii <eliz@gnu.org>
2 7
3 * bidi.c (bidi_cache_reset_to): Invalidate bidi_cache_last_idx by 8 * bidi.c (bidi_cache_reset_to): Invalidate bidi_cache_last_idx by
diff --git a/src/font.c b/src/font.c
index 08a25455cf8..70e63164a34 100644
--- a/src/font.c
+++ b/src/font.c
@@ -3944,29 +3944,37 @@ usage: (font-spec ARGS...) */)
3944 return spec; 3944 return spec;
3945} 3945}
3946 3946
3947/* Return a copy of FONT as a font-spec. */ 3947/* Return a copy of FONT as a font-spec. For the sake of speed, this code
3948 relies on an internal stuff exposed from alloc.c and should be handled
3949 with care. */
3950
3948Lisp_Object 3951Lisp_Object
3949copy_font_spec (Lisp_Object font) 3952copy_font_spec (Lisp_Object font)
3950{ 3953{
3951 Lisp_Object new_spec, tail, prev, extra; 3954 enum { font_spec_size = VECSIZE (struct font_spec) };
3952 int i; 3955 Lisp_Object new_spec, tail, *pcdr;
3956 struct font_spec *spec;
3953 3957
3954 CHECK_FONT (font); 3958 CHECK_FONT (font);
3955 new_spec = font_make_spec (); 3959
3956 for (i = 1; i < FONT_EXTRA_INDEX; i++) 3960 /* Make an uninitialized font-spec object. */
3957 ASET (new_spec, i, AREF (font, i)); 3961 spec = (struct font_spec *) allocate_vector (font_spec_size);
3958 extra = Fcopy_alist (AREF (font, FONT_EXTRA_INDEX)); 3962 XSETPVECTYPESIZE (spec, PVEC_FONT, FONT_SPEC_MAX,
3959 /* We must remove :font-entity property. */ 3963 font_spec_size - FONT_SPEC_MAX);
3960 for (prev = Qnil, tail = extra; CONSP (tail); prev = tail, tail = XCDR (tail)) 3964
3961 if (EQ (XCAR (XCAR (tail)), QCfont_entity)) 3965 spec->props[FONT_TYPE_INDEX] = spec->props[FONT_EXTRA_INDEX] = Qnil;
3962 { 3966
3963 if (NILP (prev)) 3967 /* Copy basic properties FONT_FOUNDRY_INDEX..FONT_AVGWIDTH_INDEX. */
3964 extra = XCDR (extra); 3968 memcpy (spec->props + 1, XVECTOR (font)->contents + 1,
3965 else 3969 (FONT_EXTRA_INDEX - 1) * word_size);
3966 XSETCDR (prev, XCDR (tail)); 3970
3967 break; 3971 /* Copy an alist of extra information but discard :font-entity property. */
3968 } 3972 pcdr = spec->props + FONT_EXTRA_INDEX;
3969 ASET (new_spec, FONT_EXTRA_INDEX, extra); 3973 for (tail = AREF (font, FONT_EXTRA_INDEX); CONSP (tail); tail = XCDR (tail))
3974 if (!EQ (XCAR (XCAR (tail)), QCfont_entity))
3975 *pcdr = Fcons (XCAR (tail), Qnil), pcdr = xcdr_addr (*pcdr);
3976
3977 XSETFONT (new_spec, spec);
3970 return new_spec; 3978 return new_spec;
3971} 3979}
3972 3980