More docs refactor.

This commit is contained in:
Samuel Guerra 2024-02-13 00:18:45 -03:00
parent c95ff9da9c
commit a47f8b7996
6 changed files with 120 additions and 27 deletions

View File

@ -6,7 +6,6 @@
* Review docs.
- Do a full read, look for typos or failed links.
- Last reviewing `zero_ui::font`.
- Last reviewed `HYPHENATION`
# Publish

View File

@ -118,7 +118,7 @@ pub trait HyphenationDataSource: Send + 'static {
/// Represents a hyphenation data source that searches a directory.
///
/// The file names must follow a pattern that includes the [`hyphenation::Language`] display print, the pattern mut be defined
/// The file names must follow a pattern that includes the language display print, the pattern mut be defined
/// with a replacement `{lang}`. For example the file `dir/en-us.bincode` is matched by `"{lang}.bincode"`.
///
/// See the [hyphenation](https://github.com/tapeinosyne/hyphenation) crate docs for more details about the data files.

View File

@ -67,8 +67,6 @@ use zero_ui_var::{
use zero_ui_view_api::webrender_api as wr;
use zero_ui_view_api::{config::FontAntiAliasing, ViewProcessOffline};
pub use font_kit::properties::Style as FontStyle;
/// Font family name.
///
/// A possible value for the `font_family` property.
@ -588,9 +586,14 @@ pub enum FontChange {
SystemFonts,
/// Custom fonts change caused by call to [`FONTS.register`] or [`FONTS.unregister`].
///
/// [`FONTS.register`]: FONTS::register
/// [`FONTS.unregister`]: FONTS::unregister
CustomFonts,
/// Custom request caused by call to [`FONTS.refresh`].
///
/// [`FONTS.refresh`]: FONTS::refresh
Refesh,
/// One of the [`GenericFonts`] was set for the language.
@ -603,7 +606,7 @@ pub enum FontChange {
}
/// Application extension that manages text fonts.
///
///
/// Services this extension provides:
///
/// * [`FONTS`] - Service that finds and loads fonts.
@ -911,7 +914,7 @@ impl FontFace {
postscript_name: None,
is_monospace: true,
properties: font_kit::properties::Properties {
style: FontStyle::Normal,
style: FontStyle::Normal.into(),
weight: FontWeight::NORMAL.into(),
stretch: FontStretch::NORMAL.into(),
},
@ -1026,7 +1029,7 @@ impl FontFace {
family_name: custom_font.name,
postscript_name: None,
properties: font_kit::properties::Properties {
style: custom_font.style,
style: custom_font.style.into(),
weight: custom_font.weight.into(),
stretch: custom_font.stretch.into(),
},
@ -1220,7 +1223,7 @@ impl FontFace {
/// Font style.
pub fn style(&self) -> FontStyle {
self.0.properties.style
self.0.properties.style.into()
}
/// Font weight.
@ -2035,7 +2038,7 @@ impl FontFaceLoader {
match font_kit::source::SystemSource::new().select_best_match(
&[family_name],
&font_kit::properties::Properties {
style,
style: style.into(),
weight: weight.into(),
stretch: stretch.into(),
},
@ -2605,9 +2608,53 @@ impl From<font_kit::properties::Stretch> for FontStretch {
}
}
/// The italic or oblique form of a font.
#[derive(Clone, Copy, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize)]
pub enum FontStyle {
/// The regular form.
#[default]
Normal,
/// A form that is generally cursive in nature.
Italic,
/// A skewed version of the regular form.
Oblique,
}
impl fmt::Debug for FontStyle {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
write!(f, "FontStyle::")?;
}
match self {
Self::Normal => write!(f, "Normal"),
Self::Italic => write!(f, "Italic"),
Self::Oblique => write!(f, "Oblique"),
}
}
}
impl From<FontStyle> for font_kit::properties::Style {
fn from(value: FontStyle) -> Self {
use font_kit::properties::Style::*;
match value {
FontStyle::Normal => Normal,
FontStyle::Italic => Italic,
FontStyle::Oblique => Oblique,
}
}
}
impl From<font_kit::properties::Style> for FontStyle {
fn from(value: font_kit::properties::Style) -> Self {
use font_kit::properties::Style::*;
match value {
Normal => FontStyle::Normal,
Italic => FontStyle::Italic,
Oblique => FontStyle::Oblique,
}
}
}
/// The degree of stroke thickness of a font. This value ranges from 100.0 to 900.0,
/// with 400.0 as normal.
#[derive(Clone, Copy, Transitionable)]
#[derive(Clone, Copy, Transitionable, serde::Serialize, serde::Deserialize)]
pub struct FontWeight(pub f32);
impl Default for FontWeight {
fn default() -> FontWeight {

View File

@ -35,7 +35,7 @@ impl TextSegment {
/// A string segmented in sequences of words, spaces, tabs and separated line breaks.
///
/// Each segment is tagged with a [`TextSegmentKind`] and is represented as
/// Each segment is tagged with a [`TextSegmentKind`] and is defines as
/// an offset from the last segment.
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct SegmentedText {

View File

@ -15,8 +15,8 @@ use zero_ui_txt::Txt;
use zero_ui_view_api::webrender_api::{self, units::LayoutVector2D, GlyphIndex, GlyphInstance};
use crate::{
font_features::RFontFeatures, BidiLevel, CaretIndex, Font, FontList, HYPHENATION, Hyphens, LineBreak, SegmentedText, TextSegment,
WordBreak,
font_features::RFontFeatures, BidiLevel, CaretIndex, Font, FontList, Hyphens, LineBreak, SegmentedText, TextSegment, WordBreak,
HYPHENATION,
};
/// Extra configuration for [`shape_text`](Font::shape_text).
@ -69,16 +69,16 @@ pub struct TextShapingArgs {
/// World break config.
///
/// This value is only considered if it is impossible to fit the a word to a line.
/// This value is only considered if it is impossible to fit the word to a line.
pub word_break: WordBreak,
/// Hyphen breaks config.
pub hyphens: Hyphens,
/// Character rendered when text is auto-hyphenated.
/// Character rendered when text is hyphenated by break.
pub hyphen_char: Txt,
/// Replacement char if the text must be obscured.
/// Obscure the text with the replacement char.
pub obscuring_char: Option<char>,
}
impl Default for TextShapingArgs {
@ -1735,7 +1735,7 @@ pub struct TextOverflowInfo {
/// All segments in this line and next lines are fully overflown. The previous line line may
/// be partially overflown, the lines before that are fully visible.
///
/// Is the [`ShapedText::lines_len`] if the last line is partially not overflown.
/// Is the [`ShapedText::lines_len`] if the last line is fully visible.
pub line: usize,
/// First overflow character in the text.
@ -3811,10 +3811,11 @@ impl Font {
let scale = self.metrics().size_scale;
self.face()
.font_kit()
.ok_or(GlyphLoadingError::NoSuchGlyph)?
.outline(glyph_id, hinting_options, &mut AdapterSink { sink, scale })
self.face().font_kit().ok_or(GlyphLoadingError::NoSuchGlyph)?.outline(
glyph_id,
hinting_options.into(),
&mut AdapterSink { sink, scale },
)
}
/// Returns the boundaries of a glyph in pixel units.
@ -3922,8 +3923,54 @@ impl Font {
}
}
/// Hinting options for [`Font::outline`].
pub type OutlineHintingOptions = font_kit::hinting::HintingOptions;
/// Specifies how hinting (grid fitting) is to be performed (or not performed) for [`Font::outline`].
#[derive(Clone, Copy, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub enum OutlineHintingOptions {
/// No hinting is performed unless absolutely necessary to assemble the glyph.
///
/// This corresponds to what macOS and FreeType in its "no hinting" mode do.
None,
/// Hinting is performed only in the vertical direction. The specified point size is used for
/// grid fitting.
///
/// This corresponds to what DirectWrite and FreeType in its light hinting mode do.
Vertical(f32),
/// Hinting is performed only in the vertical direction, and further tweaks are applied to make
/// subpixel antialiasing look better. The specified point size is used for grid fitting.
///
/// This matches DirectWrite, GDI in its ClearType mode, and FreeType in its LCD hinting mode.
VerticalSubpixel(f32),
/// Hinting is performed in both horizontal and vertical directions. The specified point size
/// is used for grid fitting.
///
/// This corresponds to what GDI in non-ClearType modes and FreeType in its normal hinting mode
/// do.
Full(f32),
}
impl OutlineHintingOptions {
/// Returns the point size that will be used for grid fitting, if any.
#[inline]
pub fn grid_fitting_size(&self) -> Option<f32> {
match *self {
Self::None => None,
Self::Vertical(size) | Self::VerticalSubpixel(size) | Self::Full(size) => Some(size),
}
}
}
impl From<OutlineHintingOptions> for font_kit::hinting::HintingOptions {
fn from(value: OutlineHintingOptions) -> Self {
use font_kit::hinting::HintingOptions::*;
match value {
OutlineHintingOptions::None => None,
OutlineHintingOptions::Vertical(s) => Vertical(s),
OutlineHintingOptions::VerticalSubpixel(s) => VerticalSubpixel(s),
OutlineHintingOptions::Full(s) => Full(s),
}
}
}
/// Receives Bézier path rendering commands from [`Font::outline`].
///

View File

@ -162,9 +162,9 @@
pub use zero_ui_ext_font::{
font_features, unicode_bidi_levels, unicode_bidi_sort, BidiLevel, CaretIndex, ColorGlyph, ColorGlyphs, ColorPalette, ColorPaletteType,
ColorPalettes, CustomFont, Font, FontChange, FontChangedArgs, FontColorPalette, FontDataRef, FontFace, FontFaceList, FontFaceMetrics,
FontList, FontMetrics, FontName, FontNames, FontSize, FontStretch, FontStyle, FontWeight, HYPHENATION, HyphenationDataDir,
HyphenationDataSource, Hyphens, Justify, LayoutDirections, LetterSpacing, LineBreak, LineHeight, LineSpacing, OutlineHintingOptions,
OutlineSink, ParagraphSpacing, SegmentedText, SegmentedTextIter, ShapedColoredGlyphs, ShapedLine, ShapedSegment, ShapedText, TabLength,
FontList, FontMetrics, FontName, FontNames, FontSize, FontStretch, FontStyle, FontWeight, HyphenationDataDir, HyphenationDataSource,
Hyphens, Justify, LayoutDirections, LetterSpacing, LineBreak, LineHeight, LineSpacing, OutlineHintingOptions, OutlineSink,
ParagraphSpacing, SegmentedText, SegmentedTextIter, ShapedColoredGlyphs, ShapedLine, ShapedSegment, ShapedText, TabLength,
TextLineThickness, TextOverflowInfo, TextSegment, TextSegmentKind, TextShapingArgs, TextTransformFn, UnderlineThickness, WhiteSpace,
WordBreak, WordSpacing, FONTS, FONT_CHANGED_EVENT,
WordBreak, WordSpacing, FONTS, FONT_CHANGED_EVENT, HYPHENATION,
};