aboutsummaryrefslogtreecommitdiffstats
path: root/components/fonts/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/fonts/lib.rs')
-rw-r--r--components/fonts/lib.rs89
1 files changed, 89 insertions, 0 deletions
diff --git a/components/fonts/lib.rs b/components/fonts/lib.rs
new file mode 100644
index 00000000000..305db5e53ef
--- /dev/null
+++ b/components/fonts/lib.rs
@@ -0,0 +1,89 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+#![deny(unsafe_code)]
+
+mod font;
+mod font_cache_thread;
+mod font_context;
+mod font_store;
+mod font_template;
+mod glyph;
+#[allow(unsafe_code)]
+pub mod platform;
+mod shaper;
+
+pub use font::*;
+pub use font_cache_thread::*;
+pub use font_context::*;
+pub use font_store::*;
+pub use font_template::*;
+pub use glyph::*;
+pub use shaper::*;
+use unicode_properties::{emoji, EmojiStatus, UnicodeEmoji};
+
+/// Whether or not font fallback selection prefers the emoji or text representation
+/// of a character. If `None` then either presentation is acceptable.
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum EmojiPresentationPreference {
+ None,
+ Text,
+ Emoji,
+}
+
+#[derive(Clone, Copy, Debug)]
+pub struct FallbackFontSelectionOptions {
+ pub character: char,
+ pub presentation_preference: EmojiPresentationPreference,
+}
+
+impl Default for FallbackFontSelectionOptions {
+ fn default() -> Self {
+ Self {
+ character: ' ',
+ presentation_preference: EmojiPresentationPreference::None,
+ }
+ }
+}
+
+impl FallbackFontSelectionOptions {
+ pub fn new(character: char, next_character: Option<char>) -> Self {
+ let presentation_preference = match next_character {
+ Some(next_character) if emoji::is_emoji_presentation_selector(next_character) => {
+ EmojiPresentationPreference::Emoji
+ },
+ Some(next_character) if emoji::is_text_presentation_selector(next_character) => {
+ EmojiPresentationPreference::Text
+ },
+ // We don't want to select emoji prsentation for any possible character that might be an emoji, because
+ // that includes characters such as '0' that are also used outside of emoji clusters. Instead, only
+ // select the emoji font for characters that explicitly have an emoji presentation (in the absence
+ // of the emoji presentation selectors above).
+ _ if matches!(
+ character.emoji_status(),
+ EmojiStatus::EmojiPresentation |
+ EmojiStatus::EmojiPresentationAndModifierBase |
+ EmojiStatus::EmojiPresentationAndEmojiComponent |
+ EmojiStatus::EmojiPresentationAndModifierAndEmojiComponent
+ ) =>
+ {
+ EmojiPresentationPreference::Emoji
+ },
+ _ if character.is_emoji_char() => EmojiPresentationPreference::Text,
+ _ => EmojiPresentationPreference::None,
+ };
+ Self {
+ character,
+ presentation_preference,
+ }
+ }
+}
+
+pub(crate) fn float_to_fixed(before: usize, f: f64) -> i32 {
+ ((1i32 << before) as f64 * f) as i32
+}
+
+pub(crate) fn fixed_to_float(before: usize, f: i32) -> f64 {
+ f as f64 * 1.0f64 / ((1i32 << before) as f64)
+}