From 2b770d91ce6fa5a5c6333a8f897eb860ec236ea7 Mon Sep 17 00:00:00 2001 From: Declan Tsien Date: Sat, 13 Apr 2024 14:12:30 +0800 Subject: [PATCH] Move funcs in wrfont.c to Rust crate font and turn them to lisp --- Cargo.lock | 3 +++ configure.ac | 5 +--- crates/font/Cargo.toml | 3 +++ crates/font/src/fns.rs | 53 ++++++++++++++++++++++++++++++++++++++++++ crates/font/src/lib.rs | 15 ++++++++---- src/wrfont.c | 50 --------------------------------------- src/wrgui.h | 3 --- 7 files changed, 70 insertions(+), 62 deletions(-) create mode 100644 crates/font/src/fns.rs delete mode 100644 src/wrfont.c diff --git a/Cargo.lock b/Cargo.lock index 79c2c242b40..0446163939a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1190,7 +1190,10 @@ dependencies = [ "font-index", "font-loader", "fxhash", + "lazy_static", "libc", + "lisp-macros", + "lisp-util", "log", "parking_lot", "swash", diff --git a/configure.ac b/configure.ac index a054f2f1d77..e775329f018 100644 --- a/configure.ac +++ b/configure.ac @@ -7293,9 +7293,6 @@ if test "${HAVE_HARFBUZZ}" = "yes" ; then FONT_OBJ="$FONT_OBJ hbfont.o" fi -if test "${with_webrender}" = "yes" ; then - FONT_OBJ="$FONT_OBJ wrfont.o" -fi AC_SUBST([XMENU_OBJ]) AC_SUBST([XOBJ]) AC_SUBST([FONT_OBJ]) @@ -7959,7 +7956,7 @@ AC_SUBST(CARGO_FEATURES) dnl Rust sources which has Lisp symbols definitions AS_ECHO(["Collecting Rust sources..."]) -RUST_CRATES_SOURCES=`(ABS_TOP_SRCDIR=$(pwd) cargo run -p codegen --bin print-source ${CARGO_FEATURES} 2>/dev/null)` +RUST_CRATES_SOURCES=`(ABS_TOP_SRCDIR=$(pwd) cargo run -p codegen --bin print-source ${CARGO_FEATURES})` AS_ECHO(["Collecting Rust sources...done"]) AC_SUBST(RUST_CRATES_SOURCES) diff --git a/crates/font/Cargo.toml b/crates/font/Cargo.toml index 86768886464..f5470a8d841 100644 --- a/crates/font/Cargo.toml +++ b/crates/font/Cargo.toml @@ -9,6 +9,9 @@ build = "../codegen/etc/build.rs" [dependencies] webrender_api.workspace = true emacs-sys.path = "../emacs-sys" +lisp-macros.path = "../lisp-macros" +lisp-util.path = "../lisp-util" +lazy_static = "1.4" log.workspace = true libc.workspace = true parking_lot.workspace = true diff --git a/crates/font/src/fns.rs b/crates/font/src/fns.rs new file mode 100644 index 00000000000..fed929ebf41 --- /dev/null +++ b/crates/font/src/fns.rs @@ -0,0 +1,53 @@ +use emacs_sys::bindings::globals; +use emacs_sys::bindings::CHECK_SYMBOL; +use emacs_sys::bindings::CONSP; +use emacs_sys::bindings::XCAR; +use emacs_sys::bindings::XCDR; +use emacs_sys::globals::Qnil; +use emacs_sys::lisp::LispObject; +use lisp_macros::lisp_fn; + +/// Convert emacs script name to OTF 4-letter script code. +/// See `otf-script-alist'. +#[lisp_fn(min = "1")] +pub fn script_to_otf(script: LispObject) -> LispObject { + use emacs_sys::bindings::Frassq; + unsafe { CHECK_SYMBOL(script) }; + let otf = unsafe { Frassq(script, globals.Votf_script_alist) }; + if otf.is_cons() { + let otf = otf.force_cons(); + return otf.car(); + } + Qnil +} + +/// Convert a font registry. +/// See `registry-script-alist'. +#[lisp_fn(min = "1")] +pub fn registry_to_script(reg: LispObject) -> LispObject { + unsafe { CHECK_SYMBOL(reg) }; + + use emacs_sys::bindings::strncmp; + use emacs_sys::bindings::SBYTES; + use emacs_sys::bindings::SSDATA; + use emacs_sys::bindings::SYMBOL_NAME; + + let mut rsa = unsafe { globals.Vregistry_script_alist }; + let mut r; + while unsafe { CONSP(rsa) } { + r = unsafe { XCAR(XCAR(rsa)) }; + if !unsafe { + strncmp( + SSDATA(r), + SSDATA(SYMBOL_NAME(reg)), + SBYTES(r).try_into().unwrap(), + ) != 0 + } { + return unsafe { XCDR(XCAR(rsa)) }; + } + rsa = unsafe { XCDR(rsa) }; + } + return Qnil; +} + +include!(concat!(env!("OUT_DIR"), "/fns_exports.rs")); diff --git a/crates/font/src/lib.rs b/crates/font/src/lib.rs index 93ecdfcf1ba..53bcc370853 100644 --- a/crates/font/src/lib.rs +++ b/crates/font/src/lib.rs @@ -1,13 +1,18 @@ +#![feature(concat_idents)] + #[macro_use] extern crate emacs_sys; +extern crate lisp_macros; +#[macro_use] +extern crate lisp_util; mod cache; +mod fns; use emacs_sys::bindings::assq_no_quit; use emacs_sys::bindings::font_put_extra; +use emacs_sys::bindings::globals; use emacs_sys::bindings::make_fixnum; -use emacs_sys::bindings::registry_to_otf; -use emacs_sys::bindings::script_to_otf; use emacs_sys::bindings::AREF; use emacs_sys::bindings::CONSP; use emacs_sys::bindings::SYMBOLP; @@ -295,7 +300,7 @@ impl From for OptionalScript { let key = XCAR(tmp); let val = XCDR(tmp); if key.eq(QCscript) && SYMBOLP(val) { - let otf_script = script_to_otf(val); + let otf_script = Fscript_to_otf(val); if otf_script.is_not_nil() { return Some(otf_script.into()); } @@ -319,7 +324,8 @@ impl From for OptionalScript { let reg = spec_or_entity.aref(font_property_index::FONT_REGISTRY_INDEX); if reg.is_symbol() { - let otf_script = unsafe { registry_to_otf(reg) }; + let script = Fregistry_to_script(reg); + let otf_script = Fscript_to_otf(script); return Some(otf_script.into()); } @@ -671,7 +677,6 @@ extern "C" fn otf_capability(_font: *mut font) -> LispObject { pub extern "C" fn shape(lgstring: LispObject, direction: LispObject) -> LispObject { use core::ops::Range; use emacs_sys::bindings::font_metrics as FontMetrics; - use emacs_sys::bindings::globals; use emacs_sys::bindings::CHECK_FONT_GET_OBJECT; use emacs_sys::globals::QL2R; use emacs_sys::globals::QR2L; diff --git a/src/wrfont.c b/src/wrfont.c deleted file mode 100644 index f216afa26cd..00000000000 --- a/src/wrfont.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Font support for Haiku windowing - -Copyright (C) 2021-2023 Free Software Foundation, Inc. - -This file is part of GNU Emacs. - -GNU Emacs is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at -your option) any later version. - -GNU Emacs is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Emacs. If not, see . */ - -#include - -#include "lisp.h" - -/* Convert emacs script name to OTF 4-letter script code. */ -Lisp_Object -script_to_otf (Lisp_Object script) -{ - Lisp_Object otf = Frassq (script, Votf_script_alist); - return CONSP (otf) - ? SYMBOL_NAME (XCAR ((otf))) - : Qnil; -} - -/* Convert a font registry. */ -Lisp_Object -registry_to_otf (Lisp_Object reg) -{ - Lisp_Object otf, r, rsa = Vregistry_script_alist; - while (CONSP (rsa)) - { - r = XCAR (XCAR (rsa)); - if (!strncmp (SSDATA (r), SSDATA (SYMBOL_NAME (reg)), SBYTES (r))) - { - otf = script_to_otf (XCDR (XCAR (rsa))); - return otf; - } - rsa = XCDR (rsa); - } - return Qnil; -} diff --git a/src/wrgui.h b/src/wrgui.h index a32c3687a83..7eb219eb833 100644 --- a/src/wrgui.h +++ b/src/wrgui.h @@ -148,7 +148,4 @@ struct wr_bitmap_record int height, width, depth; }; -extern Lisp_Object script_to_otf (Lisp_Object otf); -extern Lisp_Object registry_to_otf (Lisp_Object reg); - #endif /* EMACS_WRGUI_H */