#![doc = include_str!("../README.md")]
mod convert_power;
mod crossed_cylinders;
mod minimum_blank_size;
mod oblique_meridian;
mod prism;
mod transpose;
mod materials;
#[cfg(feature = "wasm")]
pub mod wasm;
pub use convert_power::*;
pub use crossed_cylinders::*;
pub use minimum_blank_size::*;
pub use oblique_meridian::*;
pub use prism::*;
pub use transpose::*;
pub use materials::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub enum Eye {
OD,
OS,
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub struct SpheroCyl {
pub sphere: f64,
pub cylinder: f64,
pub axis_deg: f64,
}
impl SpheroCyl {
pub fn power_at(&self, phi_deg: f64) -> f64 {
let delta = (phi_deg - self.axis_deg).to_radians();
self.sphere + self.cylinder * (delta.sin().powi(2))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub enum HorizontalBase {
#[cfg_attr(feature = "serde", serde(rename = "BI"))]
In,
#[cfg_attr(feature = "serde", serde(rename = "BO"))]
Out,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub enum VerticalBase {
#[cfg_attr(feature = "serde", serde(rename = "BU"))]
Up,
#[cfg_attr(feature = "serde", serde(rename = "BD"))]
Down,
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub struct HorizontalPrism {
amount: f64,
base: HorizontalBase,
}
impl HorizontalPrism {
pub fn new(amount: f64, base: HorizontalBase) -> Self {
debug_assert!(amount >= 0.0, "amount must be non-negative");
Self { amount, base }
}
pub fn from_signed(value: f64) -> Self {
if value < 0.0 {
Self {
amount: -value,
base: HorizontalBase::In,
}
} else {
Self {
amount: value,
base: HorizontalBase::Out,
}
}
}
pub fn is_none(&self) -> bool {
self.amount == 0.0 || (self.amount - 0.0).abs() < f64::EPSILON
}
pub fn base(&self) -> Option<HorizontalBase> {
if self.is_none() {
return None;
}
Some(self.base)
}
pub fn amount(&self) -> f64 {
self.amount
}
pub fn signed(&self) -> f64 {
match self.base {
HorizontalBase::In => -self.amount,
HorizontalBase::Out => self.amount,
}
}
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub struct VerticalPrism {
amount: f64,
base: VerticalBase,
}
impl VerticalPrism {
pub fn new(amount: f64, base: VerticalBase) -> Self {
debug_assert!(amount >= 0.0, "amount must be non-negative");
Self { amount, base }
}
pub fn from_signed(value: f64) -> Self {
if value < 0.0 {
Self {
amount: -value,
base: VerticalBase::Down,
}
} else {
Self {
amount: value,
base: VerticalBase::Up,
}
}
}
pub fn is_none(&self) -> bool {
self.amount == 0.0
}
pub fn base(&self) -> Option<VerticalBase> {
if self.is_none() {
return None;
}
Some(self.base)
}
pub fn amount(&self) -> f64 {
self.amount
}
pub fn signed(&self) -> f64 {
match self.base {
VerticalBase::Up => self.amount,
VerticalBase::Down => -self.amount,
}
}
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub struct CombinedPrism {
pub horizontal: HorizontalPrism,
pub vertical: VerticalPrism,
}
impl CombinedPrism {
pub fn magnitude(&self) -> f64 {
self.horizontal.amount().hypot(self.vertical.amount())
}
}
#[derive(Debug, Clone, Copy)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "wasm", derive(tsify::Tsify))]
#[cfg_attr(feature = "wasm", tsify(from_wasm_abi, into_wasm_abi))]
pub struct Decentration {
pub vertical_mm: f64,
pub horizontal_mm: f64,
}