blob: d18df39b0d76b4bdb7efb42ada557bb8311bfccc [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// surpass does float comparison in a few places where the extra instructions generated by a
// full comparison would be too expensive in terms of computation.
mod affine_transform;
mod extend;
mod layer;
pub mod layout;
mod lines;
mod order;
pub mod painter;
mod path;
mod point;
pub mod rasterizer;
mod simd;
mod transform;
pub use affine_transform::AffineTransform;
pub use layer::Layer;
pub use lines::{GeomId, Lines, LinesBuilder};
pub use order::{Order, OrderError};
pub use path::{Path, PathBuilder};
pub use point::Point;
pub use transform::{GeomPresTransform, GeomPresTransformError};
const PIXEL_WIDTH: usize = 16;
const PIXEL_DOUBLE_WIDTH: usize = PIXEL_WIDTH * 2;
const PIXEL_SHIFT: usize = PIXEL_WIDTH.trailing_zeros() as usize;
pub const MAX_WIDTH: usize = 1 << 16;
pub const MAX_HEIGHT: usize = 1 << 15;
const MAX_WIDTH_SHIFT: usize = MAX_WIDTH.trailing_zeros() as usize;
const MAX_HEIGHT_SHIFT: usize = MAX_HEIGHT.trailing_zeros() as usize;
/// The width and height of the renderer's tiles.
pub const TILE_WIDTH: usize = 16;
const _ASSERT_TILE_WIFTH_MULTIPLE_OF_16: usize = 0 - (TILE_WIDTH % 16);
const _ASSERT_MAX_TILE_WIDTH: usize = 128 - TILE_WIDTH;
const TILE_WIDTH_SHIFT: usize = TILE_WIDTH.trailing_zeros() as usize;
pub const TILE_HEIGHT: usize = 16;
const _ASSERT_TILE_WIDTH_MULTIPLE_OF_16: usize = 0 - (TILE_HEIGHT % 16);
const _ASSERT_MAX_TILE_HEIGHT: usize = 128 - TILE_HEIGHT;
const TILE_HEIGHT_SHIFT: usize = TILE_HEIGHT.trailing_zeros() as usize;
const LAYER_LIMIT: usize = (1 << rasterizer::bit_field_lens::<TILE_WIDTH, TILE_HEIGHT>()[2]) - 1;
trait CanonBits {
fn to_canon_bits(self) -> u32;
}
impl CanonBits for f32 {
fn to_canon_bits(self) -> u32 {
if self.is_nan() {
return f32::NAN.to_bits();
}
if self == 0.0 {
return 0.0f32.to_bits();
}
self.to_bits()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn f32_canon_bits_nan() {
let nan0 = f32::NAN;
let nan1 = nan0 + 1.0;
assert_ne!(nan0, nan1);
assert_eq!(nan0.to_canon_bits(), nan1.to_canon_bits());
}
#[test]
fn f32_canon_bits_zero() {
let neg_zero = -0.0f32;
let pos_zero = 0.0;
assert_eq!(neg_zero, pos_zero);
assert_ne!(neg_zero.to_bits(), pos_zero.to_bits());
assert_eq!(neg_zero.to_canon_bits(), pos_zero.to_canon_bits());
}
}