mirror of
https://github.com/servo/servo.git
synced 2025-09-27 15:20:09 +01:00
Instead of doing font selection and text shaping in `canvas`, move this to `script`. This allows canvas to use the shared `Document` `FontContext`, which has access to web fonts. In addition, ensure that there is a font style accessible for `OffscreenCanvas` in workers. Testing: This causes a number of WPT tests to start to pass as web fonts are supported on canvas again. In addition, some start to fail as they expose other issues: - The lack of support for the `Context2D.fontStretch` property - Issues with zerosize gradient interpolation. - Differences between quoted and unquoted font family names. This seems like a timing issue with the way we are handling web fonts. The test seems to be expecting Local fonts to be available immediately (without waiting for them to load). This isn't how Servo works ATM. Seems like an issue with the test. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
69 lines
2.1 KiB
Rust
69 lines
2.1 KiB
Rust
/* 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_descriptor;
|
|
mod font_identifier;
|
|
mod font_template;
|
|
mod system_font_service_proxy;
|
|
|
|
use std::sync::Arc;
|
|
|
|
pub use font_descriptor::*;
|
|
pub use font_identifier::*;
|
|
pub use font_template::*;
|
|
use ipc_channel::ipc::IpcSharedMemory;
|
|
use malloc_size_of_derive::MallocSizeOf;
|
|
use range::{RangeIndex, int_range_index};
|
|
use serde::{Deserialize, Serialize};
|
|
pub use system_font_service_proxy::*;
|
|
|
|
int_range_index! {
|
|
#[derive(Deserialize, MallocSizeOf, Serialize)]
|
|
/// An index that refers to a byte offset in a text run. This could
|
|
/// the middle of a glyph.
|
|
struct ByteIndex(isize)
|
|
}
|
|
|
|
pub type StylesheetWebFontLoadFinishedCallback = Arc<dyn Fn(bool) + Send + Sync + 'static>;
|
|
|
|
/// A data structure to store data for fonts. Data is stored internally in an
|
|
/// [`IpcSharedMemory`] handle, so that it can be sent without serialization
|
|
/// across IPC channels.
|
|
#[derive(Clone, Deserialize, MallocSizeOf, Serialize)]
|
|
pub struct FontData(#[conditional_malloc_size_of] pub(crate) Arc<IpcSharedMemory>);
|
|
|
|
impl FontData {
|
|
pub fn from_bytes(bytes: &[u8]) -> Self {
|
|
Self(Arc::new(IpcSharedMemory::from_bytes(bytes)))
|
|
}
|
|
|
|
pub fn as_ipc_shared_memory(&self) -> Arc<IpcSharedMemory> {
|
|
self.0.clone()
|
|
}
|
|
}
|
|
|
|
impl AsRef<[u8]> for FontData {
|
|
fn as_ref(&self) -> &[u8] {
|
|
&self.0
|
|
}
|
|
}
|
|
|
|
/// Raw font data and an index
|
|
///
|
|
/// If the font data is of a TTC (TrueType collection) file, then the index of a specific font within
|
|
/// the collection. If the font data is for is single font then the index will always be 0.
|
|
#[derive(Deserialize, Clone, Serialize)]
|
|
pub struct FontDataAndIndex {
|
|
/// The raw font file data (.ttf, .otf, .ttc, etc)
|
|
pub data: FontData,
|
|
/// The index of the font within the file (0 if the file is not a ttc)
|
|
pub index: u32,
|
|
}
|
|
|
|
#[derive(Copy, Clone, PartialEq)]
|
|
pub enum FontDataError {
|
|
FailedToLoad,
|
|
}
|