egui_macview/tokens/
typography.rs1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub struct TrackingTableEntry {
9 pub size_pt: u32,
11 pub subfamily: String,
13 pub tracking_em_1000: i32,
15 pub tracking_pt: f32,
17 #[serde(rename = "$description", default)]
19 pub description: Option<String>,
20}
21
22#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
24pub struct CubicCoefficients {
25 pub a: f64,
27 pub b: f64,
29 pub c: f64,
31 pub d: f64,
33}
34
35#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
37pub struct CubicFit {
38 pub formula: String,
40 pub coefficients: CubicCoefficients,
42}
43
44#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46pub struct QuadraticCoefficients {
47 pub a2: f64,
49 pub a1: f64,
51 pub a0: f64,
53}
54
55#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
57pub struct QuadraticFit {
58 pub formula: String,
60 pub coefficients: QuadraticCoefficients,
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
66pub struct TrackingPoint {
67 pub pt: f64,
69 pub tracking_pt: f64,
71}
72
73#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
75pub struct PolynomialSpec001 {
76 #[serde(default)]
78 pub description: Option<String>,
79 pub quadratic_inspector_fit: QuadraticFit,
81 pub cubic_apple_hig_fit: CubicFit,
83 pub points: HashMap<String, TrackingPoint>,
85}
86
87#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
89pub struct MacTypographyTokens {
90 pub tracking_table: HashMap<String, TrackingTableEntry>,
92 pub polynomial_spec001: PolynomialSpec001,
94}
95
96impl MacTypographyTokens {
97 pub fn tracking_for_size(&self, pt: f64) -> f64 {
99 let c = &self.polynomial_spec001.cubic_apple_hig_fit.coefficients;
100 c.a * pt.powi(3) + c.b * pt.powi(2) + c.c * pt + c.d
101 }
102
103 pub fn tracking_quadratic(&self, pt: f64) -> f64 {
105 let c = &self.polynomial_spec001.quadratic_inspector_fit.coefficients;
106 c.a2 * pt.powi(2) + c.a1 * pt + c.a0
107 }
108}
109
110#[inline]
113pub fn sf_pro_tracking(size_pt: f32) -> f32 {
114 let p = size_pt as f64;
115 let a = 0.000864840354;
116 let b = -0.0339060217;
117 let c = 0.355814827;
118 let d = -0.891241741;
119 (a * p.powi(3) + b * p.powi(2) + c * p + d) as f32
120}