Bug 1880934 - Update aa-stroke to include f32 bezier flattener. r=lsalzman

This should slightly help performance and should not noticeably impact
quality.

Differential Revision: https://phabricator.services.mozilla.com/D202190
This commit is contained in:
Jeff Muizelaar 2024-02-20 15:03:02 +00:00
parent 1a596d38ec
commit 95ba0fd6ee
6 changed files with 53 additions and 53 deletions

View file

@ -5,9 +5,9 @@
[source.crates-io] [source.crates-io]
replace-with = "vendored-sources" replace-with = "vendored-sources"
[source."git+https://github.com/FirefoxGraphics/aa-stroke?rev=96e66f91bb8e8efb80ff144eabd668002aa89650"] [source."git+https://github.com/FirefoxGraphics/aa-stroke?rev=d94278ed9c7020f50232689a26d1277eb0eb74d2"]
git = "https://github.com/FirefoxGraphics/aa-stroke" git = "https://github.com/FirefoxGraphics/aa-stroke"
rev = "96e66f91bb8e8efb80ff144eabd668002aa89650" rev = "d94278ed9c7020f50232689a26d1277eb0eb74d2"
replace-with = "vendored-sources" replace-with = "vendored-sources"
[source."git+https://github.com/FirefoxGraphics/wpf-gpu-raster?rev=99979da091fd58fba8477e7fcdf5ec0727102916"] [source."git+https://github.com/FirefoxGraphics/wpf-gpu-raster?rev=99979da091fd58fba8477e7fcdf5ec0727102916"]

2
Cargo.lock generated
View file

@ -5,7 +5,7 @@ version = 3
[[package]] [[package]]
name = "aa-stroke" name = "aa-stroke"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/FirefoxGraphics/aa-stroke?rev=96e66f91bb8e8efb80ff144eabd668002aa89650#96e66f91bb8e8efb80ff144eabd668002aa89650" source = "git+https://github.com/FirefoxGraphics/aa-stroke?rev=d94278ed9c7020f50232689a26d1277eb0eb74d2#d94278ed9c7020f50232689a26d1277eb0eb74d2"
dependencies = [ dependencies = [
"euclid", "euclid",
] ]

View file

@ -1 +1 @@
{"files":{".github/workflows/rust.yml":"6a9f1b122ea02367a2f1ff1fc7b9a728284ceb47fad12e1610cde9d760f4efc3","Cargo.toml":"f507cac11c3c26af28420d68ec3748a5453322d51ef1379a340fdd3b1c9b187a","README.md":"60b34cfa653114d5054009696df2ed2ea1d4926a6bc312d0cac4b84845c2beff","examples/simple.rs":"c196e79568fe4be31a08374aa451c70c9377db5428aef924a985e069c12ed91e","src/bezierflattener.rs":"61687da22490cb1bd901d0b5eb1de3a98802b46c03719ded4163c7a4997f0ad9","src/c_bindings.rs":"06225ddd132ae959eda1b445f4e375cead4d8e135c5cba81e828815fe6a5e88b","src/lib.rs":"fc7990e62434f3143b5162aba85ea828ceab51447c5fad5e26e8c6b06ec77050","src/tri_rasterize.rs":"fb6f595ab9340d8ea6429b41638c378bbd772c8e4d8f7793e225624c12cd3a21"},"package":null} {"files":{".github/workflows/rust.yml":"6a9f1b122ea02367a2f1ff1fc7b9a728284ceb47fad12e1610cde9d760f4efc3","Cargo.toml":"f507cac11c3c26af28420d68ec3748a5453322d51ef1379a340fdd3b1c9b187a","README.md":"60b34cfa653114d5054009696df2ed2ea1d4926a6bc312d0cac4b84845c2beff","examples/simple.rs":"c196e79568fe4be31a08374aa451c70c9377db5428aef924a985e069c12ed91e","src/bezierflattener.rs":"c7183a850d51525db4389d5c0badb76e1d8c4110697bfa51ef746fda6a858bb9","src/c_bindings.rs":"06225ddd132ae959eda1b445f4e375cead4d8e135c5cba81e828815fe6a5e88b","src/lib.rs":"3009746efe5f6753cd999258077a4baea30a740190e7a8ccaec0d78f4719fdfb","src/tri_rasterize.rs":"fb6f595ab9340d8ea6429b41638c378bbd772c8e4d8f7793e225624c12cd3a21"},"package":null}

View file

@ -16,8 +16,8 @@ pub type HRESULT = i32;
pub const S_OK: i32 = 0; pub const S_OK: i32 = 0;
#[derive(Clone, Copy, Debug, PartialEq)] #[derive(Clone, Copy, Debug, PartialEq)]
pub struct GpPointR { pub struct GpPointR {
pub x: f64, pub x: f32,
pub y: f64 pub y: f32
} }
impl Sub for GpPointR { impl Sub for GpPointR {
@ -48,32 +48,32 @@ impl SubAssign for GpPointR {
} }
} }
impl MulAssign<f64> for GpPointR { impl MulAssign<f32> for GpPointR {
fn mul_assign(&mut self, rhs: f64) { fn mul_assign(&mut self, rhs: f32) {
*self = *self * rhs; *self = *self * rhs;
} }
} }
impl Mul<f64> for GpPointR { impl Mul<f32> for GpPointR {
type Output = Self; type Output = Self;
fn mul(self, rhs: f64) -> Self::Output { fn mul(self, rhs: f32) -> Self::Output {
GpPointR { x: self.x * rhs, y: self.y * rhs } GpPointR { x: self.x * rhs, y: self.y * rhs }
} }
} }
impl Div<f64> for GpPointR { impl Div<f32> for GpPointR {
type Output = Self; type Output = Self;
fn div(self, rhs: f64) -> Self::Output { fn div(self, rhs: f32) -> Self::Output {
GpPointR { x: self.x / rhs, y: self.y / rhs } GpPointR { x: self.x / rhs, y: self.y / rhs }
} }
} }
impl Mul for GpPointR { impl Mul for GpPointR {
type Output = f64; type Output = f32;
fn mul(self, rhs: Self) -> Self::Output { fn mul(self, rhs: Self) -> Self::Output {
self.x * rhs.x + self.y * rhs.y self.x * rhs.x + self.y * rhs.y
@ -81,17 +81,17 @@ impl Mul for GpPointR {
} }
impl GpPointR { impl GpPointR {
pub fn ApproxNorm(&self) -> f64 { pub fn ApproxNorm(&self) -> f32 {
self.x.abs().max(self.y.abs()) self.x.abs().max(self.y.abs())
} }
pub fn Norm(&self) -> f64 { pub fn Norm(&self) -> f32 {
self.x.hypot(self.y) self.x.hypot(self.y)
} }
} }
// Relative to this is relative to the tolerance squared. In other words, a vector // Relative to this is relative to the tolerance squared. In other words, a vector
// whose length is less than .01*tolerance will be considered 0 // whose length is less than .01*tolerance will be considered 0
const SQ_LENGTH_FUZZ: f64 = 1.0e-4; const SQ_LENGTH_FUZZ: f32 = 1.0e-4;
// Some of these constants need further thinking // Some of these constants need further thinking
@ -103,7 +103,7 @@ const SQ_LENGTH_FUZZ: f64 = 1.0e-4;
const FUZZ_DOUBLE: f64 = 1.0e-12; // Double-precision relative 0 const FUZZ_DOUBLE: f64 = 1.0e-12; // Double-precision relative 0
const MIN_TOLERANCE: f64 = 1.0e-6; const MIN_TOLERANCE: f64 = 1.0e-6;
const DEFAULT_FLATTENING_TOLERANCE: f64 = 0.25;*/ const DEFAULT_FLATTENING_TOLERANCE: f64 = 0.25;*/
const TWICE_MIN_BEZIER_STEP_SIZE: f64 = 1.0e-3; // The step size in the Bezier flattener should const TWICE_MIN_BEZIER_STEP_SIZE: f32 = 1.0e-3; // The step size in the Bezier flattener should
// never go below half this amount. // never go below half this amount.
//+----------------------------------------------------------------------------- //+-----------------------------------------------------------------------------
// //
@ -318,7 +318,7 @@ pub trait CFlatteningSink {
fn AcceptPoint(&mut self, fn AcceptPoint(&mut self,
pt: &GpPointR, pt: &GpPointR,
// The point // The point
t: f64, t: f32,
// Parameter we're at // Parameter we're at
fAborted: &mut bool, fAborted: &mut bool,
lastPoint: bool lastPoint: bool
@ -339,16 +339,16 @@ pub struct CBezierFlattener<'a>
bezier: CBezier, bezier: CBezier,
// Flattening defining data // Flattening defining data
m_pSink: &'a mut dyn CFlatteningSink, // The recipient of the flattening data m_pSink: &'a mut dyn CFlatteningSink, // The recipient of the flattening data
m_rTolerance: f64, // Prescribed tolerance m_rTolerance: f32, // Prescribed tolerance
m_fWithTangents: bool, // Generate tangent vectors if true m_fWithTangents: bool, // Generate tangent vectors if true
m_rQuarterTolerance: f64,// Prescribed tolerance/4 (for doubling the step) m_rQuarterTolerance: f32,// Prescribed tolerance/4 (for doubling the step)
m_rFuzz: f64, // Computational zero m_rFuzz: f32, // Computational zero
// Flattening working data // Flattening working data
m_ptE: [GpPointR; 4], // The moving basis of the curve definition m_ptE: [GpPointR; 4], // The moving basis of the curve definition
m_cSteps: i32, // The number of steps left to the end of the curve m_cSteps: i32, // The number of steps left to the end of the curve
m_rParameter: f64, // Parameter value m_rParameter: f32, // Parameter value
m_rStepSize: f64, // Steps size in parameter domain m_rStepSize: f32, // Steps size in parameter domain
} }
impl<'a> CBezierFlattener<'a> { impl<'a> CBezierFlattener<'a> {
/*fn new( /*fn new(
@ -449,7 +449,7 @@ impl<'a> CBezierFlattener<'a> {
pub fn new(bezier: &CBezier, pub fn new(bezier: &CBezier,
pSink: &'a mut dyn CFlatteningSink, pSink: &'a mut dyn CFlatteningSink,
// The reciptient of the flattened data // The reciptient of the flattened data
rTolerance: f64) // Flattening tolerance rTolerance: f32) // Flattening tolerance
-> Self -> Self
{ {
let mut result = CBezierFlattener { let mut result = CBezierFlattener {

View file

@ -230,8 +230,8 @@ fn arc_segment_tri(path: &mut PathBuilder, xc: f32, yc: f32, radius: f32, a: Vec
let h = (4. / 3.) * dot(perp(a), mid2) / dot(a, mid2); let h = (4. / 3.) * dot(perp(a), mid2) / dot(a, mid2);
let last_point = GpPointR { x: (xc + r_cos_a) as f64, y: (yc + r_sin_a) as f64 }; let last_point = GpPointR { x: (xc + r_cos_a), y: (yc + r_sin_a) };
let initial_normal = GpPointR { x: a.x as f64, y: a.y as f64 }; let initial_normal = GpPointR { x: a.x, y: a.y };
struct Target<'a, 'b> { last_point: GpPointR, last_normal: GpPointR, xc: f32, yc: f32, path: &'a mut PathBuilder<'b> } struct Target<'a, 'b> { last_point: GpPointR, last_normal: GpPointR, xc: f32, yc: f32, path: &'a mut PathBuilder<'b> }
@ -253,24 +253,24 @@ fn arc_segment_tri(path: &mut PathBuilder, xc: f32, yc: f32, radius: f32, a: Vec
let width = 0.5; let width = 0.5;
self.path.ramp( self.path.ramp(
(pt.x - normal.x * width) as f32, pt.x - normal.x * width,
(pt.y - normal.y * width) as f32, pt.y - normal.y * width,
(pt.x + normal.x * width) as f32, pt.x + normal.x * width,
(pt.y + normal.y * width) as f32, pt.y + normal.y * width,
(self.last_point.x + self.last_normal.x * width) as f32, self.last_point.x + self.last_normal.x * width,
(self.last_point.y + self.last_normal.y * width) as f32, self.last_point.y + self.last_normal.y * width,
(self.last_point.x - self.last_normal.x * width) as f32, self.last_point.x - self.last_normal.x * width,
(self.last_point.y - self.last_normal.y * width) as f32, ); self.last_point.y - self.last_normal.y * width, );
self.path.push_tri( self.path.push_tri(
(self.last_point.x - self.last_normal.x * 0.5) as f32, self.last_point.x - self.last_normal.x * 0.5,
(self.last_point.y - self.last_normal.y * 0.5) as f32, self.last_point.y - self.last_normal.y * 0.5,
(pt.x - normal.x * 0.5) as f32, pt.x - normal.x * 0.5,
(pt.y - normal.y * 0.5) as f32, pt.y - normal.y * 0.5,
self.xc, self.yc); self.xc, self.yc);
self.last_normal = normal; self.last_normal = normal;
} else { } else {
self.path.push_tri(self.last_point.x as f32, self.last_point.y as f32, pt.x as f32, pt.y as f32, self.xc, self.yc); self.path.push_tri(self.last_point.x, self.last_point.y, pt.x, pt.y, self.xc, self.yc);
} }
self.last_point = pt.clone(); self.last_point = pt.clone();
return S_OK; return S_OK;
@ -279,19 +279,19 @@ fn arc_segment_tri(path: &mut PathBuilder, xc: f32, yc: f32, radius: f32, a: Vec
fn AcceptPoint(&mut self, fn AcceptPoint(&mut self,
pt: &GpPointR, pt: &GpPointR,
// The point // The point
_t: f64, _t: f32,
// Parameter we're at // Parameter we're at
_aborted: &mut bool, _aborted: &mut bool,
_last_point: bool) -> HRESULT { _last_point: bool) -> HRESULT {
self.path.push_tri(self.last_point.x as f32, self.last_point.y as f32, pt.x as f32, pt.y as f32, self.xc, self.yc); self.path.push_tri(self.last_point.x, self.last_point.y, pt.x, pt.y, self.xc, self.yc);
self.last_point = pt.clone(); self.last_point = pt.clone();
return S_OK; return S_OK;
} }
} }
let bezier = CBezier::new([GpPointR { x: (xc + r_cos_a) as f64, y: (yc + r_sin_a) as f64, }, let bezier = CBezier::new([GpPointR { x: (xc + r_cos_a), y: (yc + r_sin_a), },
GpPointR { x: (xc + r_cos_a - h * r_sin_a) as f64, y: (yc + r_sin_a + h * r_cos_a) as f64, }, GpPointR { x: (xc + r_cos_a - h * r_sin_a), y: (yc + r_sin_a + h * r_cos_a), },
GpPointR { x: (xc + r_cos_b + h * r_sin_b) as f64, y: (yc + r_sin_b - h * r_cos_b) as f64, }, GpPointR { x: (xc + r_cos_b + h * r_sin_b), y: (yc + r_sin_b - h * r_cos_b), },
GpPointR { x: (xc + r_cos_b) as f64, y: (yc + r_sin_b) as f64, }]); GpPointR { x: (xc + r_cos_b), y: (yc + r_sin_b), }]);
if bezier.is_degenerate() { if bezier.is_degenerate() {
return; return;
} }
@ -810,23 +810,23 @@ impl<'z> Stroker<'z> {
fn AcceptPoint(&mut self, fn AcceptPoint(&mut self,
pt: &GpPointR, pt: &GpPointR,
// The point // The point
_t: f64, _t: f32,
// Parameter we're at // Parameter we're at
_aborted: &mut bool, _aborted: &mut bool,
last_point: bool) -> HRESULT { last_point: bool) -> HRESULT {
if last_point && self.end { if last_point && self.end {
self.stroker.line_to_capped(Point::new(pt.x as f32, pt.y as f32)); self.stroker.line_to_capped(Point::new(pt.x, pt.y));
} else { } else {
self.stroker.line_to(Point::new(pt.x as f32, pt.y as f32)); self.stroker.line_to(Point::new(pt.x, pt.y));
} }
return S_OK; return S_OK;
} }
} }
let cur_pt = self.cur_pt.unwrap_or(cx1); let cur_pt = self.cur_pt.unwrap_or(cx1);
let bezier = CBezier::new([GpPointR { x: cur_pt.x as f64, y: cur_pt.y as f64, }, let bezier = CBezier::new([GpPointR { x: cur_pt.x, y: cur_pt.y, },
GpPointR { x: cx1.x as f64, y: cx1.y as f64, }, GpPointR { x: cx1.x, y: cx1.y, },
GpPointR { x: cx2.x as f64, y: cx2.y as f64, }, GpPointR { x: cx2.x, y: cx2.y, },
GpPointR { x: pt.x as f64, y: pt.y as f64, }]); GpPointR { x: pt.x, y: pt.y, }]);
let mut t = Target{ stroker: self, end }; let mut t = Target{ stroker: self, end };
let mut f = CBezierFlattener::new(&bezier, &mut t, 0.25); let mut f = CBezierFlattener::new(&bezier, &mut t, 0.25);
f.Flatten(false); f.Flatten(false);

View file

@ -101,7 +101,7 @@ processtools = { path = "../../../components/processtools" }
qcms = { path = "../../../../gfx/qcms", features = ["c_bindings", "neon"], default-features = false } qcms = { path = "../../../../gfx/qcms", features = ["c_bindings", "neon"], default-features = false }
wpf-gpu-raster = { git = "https://github.com/FirefoxGraphics/wpf-gpu-raster", rev = "99979da091fd58fba8477e7fcdf5ec0727102916" } wpf-gpu-raster = { git = "https://github.com/FirefoxGraphics/wpf-gpu-raster", rev = "99979da091fd58fba8477e7fcdf5ec0727102916" }
aa-stroke = { git = "https://github.com/FirefoxGraphics/aa-stroke", rev = "96e66f91bb8e8efb80ff144eabd668002aa89650" } aa-stroke = { git = "https://github.com/FirefoxGraphics/aa-stroke", rev = "d94278ed9c7020f50232689a26d1277eb0eb74d2" }
url = "2.5.0" url = "2.5.0"