1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-04 02:51:31 -08:00

Improve support for shaping Egyptian Hieroglyphs

* src/composite.c (composition_gstring_lookup_cache): Renamed from
gstring_lookup_cache and made external.  All callers changed.
* src/composite.h (composition_gstring_lookup_cache): Add
prototype.
* src/font.c (Ffont_shape_gstring): Call
composition_gstring_lookup_cache and return the cached composition
if it is already in the cache.

* lisp/language/misc-lang.el (egyptian-shape-grouping): New
function.
(composition-function-table): Use egyptian-shape-grouping in
setting up compositions for Egyptian Hieroglyphs.  Fix the
composition setup for horizontal and vertical joiners.
This commit is contained in:
Eli Zaretskii 2020-10-25 18:05:37 +02:00
parent 7276723630
commit 8164f3e1ab
4 changed files with 52 additions and 10 deletions

View file

@ -149,11 +149,50 @@ thin (i.e. 1-dot width) space."
;; Hieroglyphs in "quadrats", as directed by the format controls, ;; Hieroglyphs in "quadrats", as directed by the format controls,
;; which specify how the hieroglyphs should be joined horizontally and ;; which specify how the hieroglyphs should be joined horizontally and
;; vertically. ;; vertically.
(set-char-table-range (defun egyptian-shape-grouping (gstring direction)
composition-function-table (if (= (lgstring-char gstring 0) #x13437)
'(#x13000 . #x1343F) (let ((nchars (lgstring-char-len gstring))
(list (vector "[\U00013000-\U0001343F]+" (i 1)
0 'compose-gstring-for-graphic))) (nesting 1)
ch)
;; Find where this group ends.
(while (and (< i nchars) (> nesting 0))
(setq ch (lgstring-char gstring i))
(cond
((= ch #x13437)
(setq nesting (1+ nesting)))
((= ch #x13438)
(setq nesting (1- nesting))))
(setq i (1+ i)))
(when (zerop nesting)
;; Make a new gstring from the characters that constitute a
;; complete nested group.
(let ((new-header (make-vector (1+ i) nil))
(new-gstring (make-vector (+ i 2) nil)))
(aset new-header 0 (lgstring-font gstring))
(dotimes (j i)
(aset new-header (1+ j) (lgstring-char gstring j))
(lgstring-set-glyph new-gstring j (lgstring-glyph gstring j)))
(lgstring-set-header new-gstring new-header)
(font-shape-gstring new-gstring direction))))))
(let ((hieroglyph "[\U00013000-\U0001342F]"))
;; HORIZONTAL/VERTICAL JOINER and INSERT AT.../OVERLAY controls
(set-char-table-range
composition-function-table
'(#x13430 . #x13436)
(list (vector (concat hieroglyph "[\U00013430-\U00013436]" hieroglyph)
;; We use font-shape-gstring so that, if the font
;; doesn't support these controls, the glyphs are
;; displayed individually, and not as a single
;; grapheme cluster.
1 'font-shape-gstring)))
;; Grouping controls
(set-char-table-range
composition-function-table
#x13437
(list (vector "\U00013437[\U00013000-\U0001343F]+"
0 'egyptian-shape-grouping))))
(provide 'misc-lang) (provide 'misc-lang)

View file

@ -637,10 +637,8 @@ compose_text (ptrdiff_t start, ptrdiff_t end, Lisp_Object components,
static Lisp_Object gstring_hash_table; static Lisp_Object gstring_hash_table;
static Lisp_Object gstring_lookup_cache (Lisp_Object); Lisp_Object
composition_gstring_lookup_cache (Lisp_Object header)
static Lisp_Object
gstring_lookup_cache (Lisp_Object header)
{ {
struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table);
ptrdiff_t i = hash_lookup (h, header, NULL); ptrdiff_t i = hash_lookup (h, header, NULL);
@ -1781,7 +1779,7 @@ should be ignored. */)
header = fill_gstring_header (frompos, frombyte, header = fill_gstring_header (frompos, frombyte,
topos, font_object, string); topos, font_object, string);
gstring = gstring_lookup_cache (header); gstring = composition_gstring_lookup_cache (header);
if (! NILP (gstring)) if (! NILP (gstring))
return gstring; return gstring;

View file

@ -330,6 +330,7 @@ extern int composition_update_it (struct composition_it *,
ptrdiff_t, ptrdiff_t, Lisp_Object); ptrdiff_t, ptrdiff_t, Lisp_Object);
extern ptrdiff_t composition_adjust_point (ptrdiff_t, ptrdiff_t); extern ptrdiff_t composition_adjust_point (ptrdiff_t, ptrdiff_t);
extern Lisp_Object composition_gstring_lookup_cache (Lisp_Object);
INLINE_HEADER_END INLINE_HEADER_END

View file

@ -4461,6 +4461,10 @@ GSTRING. */)
signal_error ("Invalid glyph-string: ", gstring); signal_error ("Invalid glyph-string: ", gstring);
if (! NILP (LGSTRING_ID (gstring))) if (! NILP (LGSTRING_ID (gstring)))
return gstring; return gstring;
Lisp_Object cached_gstring =
composition_gstring_lookup_cache (LGSTRING_HEADER (gstring));
if (! NILP (cached_gstring))
return cached_gstring;
font_object = LGSTRING_FONT (gstring); font_object = LGSTRING_FONT (gstring);
CHECK_FONT_OBJECT (font_object); CHECK_FONT_OBJECT (font_object);
font = XFONT_OBJECT (font_object); font = XFONT_OBJECT (font_object);