diff options
| author | Dmitry Antipov | 2014-10-31 14:09:00 +0300 |
|---|---|---|
| committer | Dmitry Antipov | 2014-10-31 14:09:00 +0300 |
| commit | b645a03e5cd981e73bd278202bd47629895598fd (patch) | |
| tree | a9c75fea213ffcfa15f5a2c486b2d54b4d93553b /src | |
| parent | b77b92545557087ca7fe75c4bf79885354c58be4 (diff) | |
| download | emacs-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/ChangeLog | 5 | ||||
| -rw-r--r-- | src/font.c | 44 |
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 @@ | |||
| 1 | 2014-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 | |||
| 1 | 2014-10-30 Eli Zaretskii <eliz@gnu.org> | 6 | 2014-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 | |||
| 3948 | Lisp_Object | 3951 | Lisp_Object |
| 3949 | copy_font_spec (Lisp_Object font) | 3952 | copy_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 | ||