mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Further changes required by Servo
This commit is contained in:
parent
4559546fbb
commit
bb55e923bb
15 changed files with 76 additions and 38 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -1170,9 +1170,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cssparser"
|
name = "cssparser"
|
||||||
version = "0.29.6"
|
version = "0.30.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/servo/rust-cssparser?rev=722b30d2f1634714befab967ecae627813fa4cf0#722b30d2f1634714befab967ecae627813fa4cf0"
|
||||||
checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cssparser-macros",
|
"cssparser-macros",
|
||||||
"dtoa-short",
|
"dtoa-short",
|
||||||
|
@ -1188,12 +1187,11 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cssparser-macros"
|
name = "cssparser-macros"
|
||||||
version = "0.6.1"
|
version = "0.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/servo/rust-cssparser?rev=722b30d2f1634714befab967ecae627813fa4cf0#722b30d2f1634714befab967ecae627813fa4cf0"
|
||||||
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.38",
|
"syn 1.0.103",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -27,7 +27,7 @@ compositing_traits = { path = "components/shared/compositing" }
|
||||||
content-security-policy = { version = "0.5", features = ["serde"] }
|
content-security-policy = { version = "0.5", features = ["serde"] }
|
||||||
cookie = "0.12"
|
cookie = "0.12"
|
||||||
crossbeam-channel = "0.5"
|
crossbeam-channel = "0.5"
|
||||||
cssparser = "0.29"
|
cssparser = { version = "0.30", git = "https://github.com/servo/rust-cssparser", rev = "722b30d2f1634714befab967ecae627813fa4cf0" }
|
||||||
darling = { version = "0.14", default-features = false }
|
darling = { version = "0.14", default-features = false }
|
||||||
data-url = "0.1.0"
|
data-url = "0.1.0"
|
||||||
devtools_traits = { path = "components/shared/devtools" }
|
devtools_traits = { path = "components/shared/devtools" }
|
||||||
|
|
|
@ -855,10 +855,37 @@ pub trait ToRaqoteGradientStop {
|
||||||
fn to_raqote(&self) -> raqote::GradientStop;
|
fn to_raqote(&self) -> raqote::GradientStop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Clamp a 0..1 number to a 0..255 range to u8.
|
||||||
|
///
|
||||||
|
/// Whilst scaling by 256 and flooring would provide
|
||||||
|
/// an equal distribution of integers to percentage inputs,
|
||||||
|
/// this is not what Gecko does so we instead multiply by 255
|
||||||
|
/// and round (adding 0.5 and flooring is equivalent to rounding)
|
||||||
|
///
|
||||||
|
/// Chrome does something similar for the alpha value, but not
|
||||||
|
/// the rgb values.
|
||||||
|
///
|
||||||
|
/// See <https://bugzilla.mozilla.org/show_bug.cgi?id=1340484>
|
||||||
|
///
|
||||||
|
/// Clamping to 256 and rounding after would let 1.0 map to 256, and
|
||||||
|
/// `256.0_f32 as u8` is undefined behavior:
|
||||||
|
///
|
||||||
|
/// <https://github.com/rust-lang/rust/issues/10184>
|
||||||
|
#[inline]
|
||||||
|
pub fn clamp_unit_f32(val: f32) -> u8 {
|
||||||
|
clamp_floor_256_f32(val * 255.)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Round and clamp a single number to a u8.
|
||||||
|
#[inline]
|
||||||
|
pub fn clamp_floor_256_f32(val: f32) -> u8 {
|
||||||
|
val.round().clamp(0., 255.) as u8
|
||||||
|
}
|
||||||
|
|
||||||
impl ToRaqoteGradientStop for CanvasGradientStop {
|
impl ToRaqoteGradientStop for CanvasGradientStop {
|
||||||
fn to_raqote(&self) -> raqote::GradientStop {
|
fn to_raqote(&self) -> raqote::GradientStop {
|
||||||
let color = raqote::Color::new(
|
let color = raqote::Color::new(
|
||||||
self.color.alpha,
|
clamp_unit_f32(self.color.alpha),
|
||||||
self.color.red,
|
self.color.red,
|
||||||
self.color.green,
|
self.color.green,
|
||||||
self.color.blue,
|
self.color.blue,
|
||||||
|
@ -875,7 +902,7 @@ impl<'a> ToRaqotePattern<'_> for FillOrStrokeStyle {
|
||||||
|
|
||||||
match self {
|
match self {
|
||||||
Color(color) => Some(Pattern::Color(
|
Color(color) => Some(Pattern::Color(
|
||||||
color.alpha,
|
clamp_unit_f32(color.alpha),
|
||||||
color.red,
|
color.red,
|
||||||
color.green,
|
color.green,
|
||||||
color.blue,
|
color.blue,
|
||||||
|
@ -933,7 +960,12 @@ impl ToRaqoteStyle for RGBA {
|
||||||
type Target = raqote::SolidSource;
|
type Target = raqote::SolidSource;
|
||||||
|
|
||||||
fn to_raqote_style(self) -> Self::Target {
|
fn to_raqote_style(self) -> Self::Target {
|
||||||
raqote::SolidSource::from_unpremultiplied_argb(self.alpha, self.red, self.green, self.blue)
|
raqote::SolidSource::from_unpremultiplied_argb(
|
||||||
|
clamp_unit_f32(self.alpha),
|
||||||
|
self.red,
|
||||||
|
self.green,
|
||||||
|
self.blue,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -553,7 +553,7 @@ impl<'a> BuilderForBoxFragment<'a> {
|
||||||
let style = &self.fragment.style;
|
let style = &self.fragment.style;
|
||||||
let b = style.get_background();
|
let b = style.get_background();
|
||||||
let background_color = style.resolve_color(b.background_color.clone());
|
let background_color = style.resolve_color(b.background_color.clone());
|
||||||
if background_color.alpha > 0 {
|
if background_color.alpha > 0.0 {
|
||||||
// https://drafts.csswg.org/css-backgrounds/#background-color
|
// https://drafts.csswg.org/css-backgrounds/#background-color
|
||||||
// “The background color is clipped according to the background-clip
|
// “The background color is clipped according to the background-clip
|
||||||
// value associated with the bottom-most background image layer.”
|
// value associated with the bottom-most background image layer.”
|
||||||
|
|
|
@ -505,7 +505,7 @@ impl StackingContext {
|
||||||
.to_webrender();
|
.to_webrender();
|
||||||
|
|
||||||
let background_color = style.resolve_color(style.get_background().background_color.clone());
|
let background_color = style.resolve_color(style.get_background().background_color.clone());
|
||||||
if background_color.alpha > 0 {
|
if background_color.alpha > 0.0 {
|
||||||
let common = builder.common_properties(painting_area, &style);
|
let common = builder.common_properties(painting_area, &style);
|
||||||
let color = super::rgba(background_color);
|
let color = super::rgba(background_color);
|
||||||
builder
|
builder
|
||||||
|
|
|
@ -472,7 +472,7 @@ impl ComputedValuesExt for ComputedValues {
|
||||||
fn background_is_transparent(&self) -> bool {
|
fn background_is_transparent(&self) -> bool {
|
||||||
let background = self.get_background();
|
let background = self.get_background();
|
||||||
let color = self.resolve_color(background.background_color.clone());
|
let color = self.resolve_color(background.background_color.clone());
|
||||||
color.alpha == 0 &&
|
color.alpha == 0.0 &&
|
||||||
background
|
background
|
||||||
.background_image
|
.background_image
|
||||||
.0
|
.0
|
||||||
|
|
|
@ -12,7 +12,7 @@ use canvas_traits::canvas::{
|
||||||
FillRule, LineCapStyle, LineJoinStyle, LinearGradientStyle, RadialGradientStyle,
|
FillRule, LineCapStyle, LineJoinStyle, LinearGradientStyle, RadialGradientStyle,
|
||||||
RepetitionStyle, TextAlign, TextBaseline,
|
RepetitionStyle, TextAlign, TextBaseline,
|
||||||
};
|
};
|
||||||
use cssparser::{Color as CSSColor, Parser, ParserInput, RGBA};
|
use cssparser::{AbsoluteColor, Color as CSSColor, Parser, ParserInput, RGBA};
|
||||||
use euclid::default::{Point2D, Rect, Size2D, Transform2D};
|
use euclid::default::{Point2D, Rect, Size2D, Transform2D};
|
||||||
use euclid::vec2;
|
use euclid::vec2;
|
||||||
use ipc_channel::ipc::{self, IpcSender, IpcSharedMemory};
|
use ipc_channel::ipc::{self, IpcSender, IpcSharedMemory};
|
||||||
|
@ -106,7 +106,7 @@ impl CanvasContextState {
|
||||||
const DEFAULT_FONT_STYLE: &'static str = "10px sans-serif";
|
const DEFAULT_FONT_STYLE: &'static str = "10px sans-serif";
|
||||||
|
|
||||||
pub(crate) fn new() -> CanvasContextState {
|
pub(crate) fn new() -> CanvasContextState {
|
||||||
let black = RGBA::new(0, 0, 0, 255);
|
let black = RGBA::new(0, 0, 0, 1.0);
|
||||||
CanvasContextState {
|
CanvasContextState {
|
||||||
global_alpha: 1.0,
|
global_alpha: 1.0,
|
||||||
global_composition: CompositionOrBlending::default(),
|
global_composition: CompositionOrBlending::default(),
|
||||||
|
@ -302,7 +302,7 @@ impl CanvasState {
|
||||||
let color = CSSColor::parse(&mut parser);
|
let color = CSSColor::parse(&mut parser);
|
||||||
if parser.is_exhausted() {
|
if parser.is_exhausted() {
|
||||||
match color {
|
match color {
|
||||||
Ok(CSSColor::RGBA(rgba)) => Ok(rgba),
|
Ok(CSSColor::Absolute(AbsoluteColor::Rgba(rgba))) => Ok(rgba),
|
||||||
Ok(CSSColor::CurrentColor) => {
|
Ok(CSSColor::CurrentColor) => {
|
||||||
// TODO: https://github.com/whatwg/html/issues/1099
|
// TODO: https://github.com/whatwg/html/issues/1099
|
||||||
// Reconsider how to calculate currentColor in a display:none canvas
|
// Reconsider how to calculate currentColor in a display:none canvas
|
||||||
|
@ -313,7 +313,7 @@ impl CanvasState {
|
||||||
// https://drafts.css-houdini.org/css-paint-api/#2d-rendering-context
|
// https://drafts.css-houdini.org/css-paint-api/#2d-rendering-context
|
||||||
// Whenever "currentColor" is used as a color in the PaintRenderingContext2D API,
|
// Whenever "currentColor" is used as a color in the PaintRenderingContext2D API,
|
||||||
// it is treated as opaque black.
|
// it is treated as opaque black.
|
||||||
None => return Ok(RGBA::new(0, 0, 0, 255)),
|
None => return Ok(RGBA::new(0, 0, 0, 1.0)),
|
||||||
Some(ref canvas) => &**canvas,
|
Some(ref canvas) => &**canvas,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -323,7 +323,7 @@ impl CanvasState {
|
||||||
Some(ref s) if canvas_element.has_css_layout_box() => {
|
Some(ref s) if canvas_element.has_css_layout_box() => {
|
||||||
Ok(s.get_inherited_text().color)
|
Ok(s.get_inherited_text().color)
|
||||||
},
|
},
|
||||||
_ => Ok(RGBA::new(0, 0, 0, 255)),
|
_ => Ok(RGBA::new(0, 0, 0, 1.0)),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_ => Err(()),
|
_ => Err(()),
|
||||||
|
@ -1706,7 +1706,7 @@ pub fn parse_color(string: &str) -> Result<RGBA, ()> {
|
||||||
let mut input = ParserInput::new(string);
|
let mut input = ParserInput::new(string);
|
||||||
let mut parser = Parser::new(&mut input);
|
let mut parser = Parser::new(&mut input);
|
||||||
match CSSColor::parse(&mut parser) {
|
match CSSColor::parse(&mut parser) {
|
||||||
Ok(CSSColor::RGBA(rgba)) => {
|
Ok(CSSColor::Absolute(AbsoluteColor::Rgba(rgba))) => {
|
||||||
if parser.is_exhausted() {
|
if parser.is_exhausted() {
|
||||||
Ok(rgba)
|
Ok(rgba)
|
||||||
} else {
|
} else {
|
||||||
|
@ -1732,7 +1732,7 @@ where
|
||||||
let green = color.green;
|
let green = color.green;
|
||||||
let blue = color.blue;
|
let blue = color.blue;
|
||||||
|
|
||||||
if color.alpha == 255 {
|
if color.alpha == 1.0 {
|
||||||
write!(
|
write!(
|
||||||
dest,
|
dest,
|
||||||
"#{:x}{:x}{:x}{:x}{:x}{:x}",
|
"#{:x}{:x}{:x}{:x}{:x}{:x}",
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
use canvas_traits::canvas::{
|
use canvas_traits::canvas::{
|
||||||
CanvasGradientStop, FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle,
|
CanvasGradientStop, FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle,
|
||||||
};
|
};
|
||||||
use cssparser::{Color as CSSColor, Parser, ParserInput, RGBA};
|
use cssparser::{AbsoluteColor, Color as CSSColor, Parser, ParserInput, RGBA};
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
|
||||||
use crate::dom::bindings::cell::DomRefCell;
|
use crate::dom::bindings::cell::DomRefCell;
|
||||||
|
@ -58,8 +58,8 @@ impl CanvasGradientMethods for CanvasGradient {
|
||||||
let color = CSSColor::parse(&mut parser);
|
let color = CSSColor::parse(&mut parser);
|
||||||
let color = if parser.is_exhausted() {
|
let color = if parser.is_exhausted() {
|
||||||
match color {
|
match color {
|
||||||
Ok(CSSColor::RGBA(rgba)) => rgba,
|
Ok(CSSColor::Absolute(AbsoluteColor::Rgba(rgba))) => rgba,
|
||||||
Ok(CSSColor::CurrentColor) => RGBA::new(0, 0, 0, 255),
|
Ok(CSSColor::CurrentColor) => RGBA::new(0, 0, 0, 1.0),
|
||||||
_ => return Err(Error::Syntax),
|
_ => return Err(Error::Syntax),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -21,7 +21,7 @@ shmem = ["dep:to_shmem", "dep:to_shmem_derive"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.0"
|
bitflags = "1.0"
|
||||||
cssparser = "0.30"
|
cssparser = { workspace = true }
|
||||||
derive_more = { version = "0.99", default-features = false, features = ["add", "add_assign"] }
|
derive_more = { version = "0.99", default-features = false, features = ["add", "add_assign"] }
|
||||||
fxhash = "0.2"
|
fxhash = "0.2"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
|
|
@ -41,7 +41,7 @@ arrayvec = "0.7"
|
||||||
atomic_refcell = "0.1"
|
atomic_refcell = "0.1"
|
||||||
bitflags = "1.0"
|
bitflags = "1.0"
|
||||||
byteorder = "1.0"
|
byteorder = "1.0"
|
||||||
cssparser = "0.30"
|
cssparser = { workspace = true }
|
||||||
derive_more = { version = "0.99", default-features = false, features = ["add", "add_assign", "deref", "from"] }
|
derive_more = { version = "0.99", default-features = false, features = ["add", "add_assign", "deref", "from"] }
|
||||||
encoding_rs = { version = "0.8", optional = true }
|
encoding_rs = { version = "0.8", optional = true }
|
||||||
euclid = "0.22"
|
euclid = "0.22"
|
||||||
|
|
|
@ -15,7 +15,7 @@ use crate::values::specified::Length;
|
||||||
use crate::values::AtomString;
|
use crate::values::AtomString;
|
||||||
use crate::{Atom, LocalName, Namespace, Prefix};
|
use crate::{Atom, LocalName, Namespace, Prefix};
|
||||||
use app_units::Au;
|
use app_units::Au;
|
||||||
use cssparser::{self, Color, RGBA};
|
use cssparser::{self, AbsoluteColor, Color, RGBA};
|
||||||
use euclid::num::Zero;
|
use euclid::num::Zero;
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
use selectors::attr::AttrSelectorOperation;
|
use selectors::attr::AttrSelectorOperation;
|
||||||
|
@ -419,7 +419,7 @@ pub fn parse_legacy_color(mut input: &str) -> Result<RGBA, ()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 5.
|
// Step 5.
|
||||||
if let Ok(Color::RGBA(rgba)) = cssparser::parse_color_keyword(input) {
|
if let Ok(Color::Absolute(AbsoluteColor::Rgba(rgba))) = cssparser::parse_color_keyword(input) {
|
||||||
return Ok(rgba);
|
return Ok(rgba);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -431,7 +431,7 @@ pub fn parse_legacy_color(mut input: &str) -> Result<RGBA, ()> {
|
||||||
hex(input.as_bytes()[2] as char),
|
hex(input.as_bytes()[2] as char),
|
||||||
hex(input.as_bytes()[3] as char),
|
hex(input.as_bytes()[3] as char),
|
||||||
) {
|
) {
|
||||||
return Ok(RGBA::new(r * 17, g * 17, b * 17, 255));
|
return Ok(RGBA::new(r * 17, g * 17, b * 17, 1.0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -504,7 +504,7 @@ pub fn parse_legacy_color(mut input: &str) -> Result<RGBA, ()> {
|
||||||
hex_string(red).unwrap(),
|
hex_string(red).unwrap(),
|
||||||
hex_string(green).unwrap(),
|
hex_string(green).unwrap(),
|
||||||
hex_string(blue).unwrap(),
|
hex_string(blue).unwrap(),
|
||||||
255,
|
1.0,
|
||||||
));
|
));
|
||||||
|
|
||||||
fn hex(ch: char) -> Result<u8, ()> {
|
fn hex(ch: char) -> Result<u8, ()> {
|
||||||
|
|
|
@ -197,12 +197,12 @@ impl Device {
|
||||||
|
|
||||||
/// Returns the default background color.
|
/// Returns the default background color.
|
||||||
pub fn default_background_color(&self) -> RGBA {
|
pub fn default_background_color(&self) -> RGBA {
|
||||||
RGBA::new(255, 255, 255, 255)
|
RGBA::new(255, 255, 255, 1.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the default foreground color.
|
/// Returns the default foreground color.
|
||||||
pub fn default_color(&self) -> RGBA {
|
pub fn default_color(&self) -> RGBA {
|
||||||
RGBA::new(0, 0, 0, 255)
|
RGBA::new(0, 0, 0, 1.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns safe area insets
|
/// Returns safe area insets
|
||||||
|
|
|
@ -33,6 +33,14 @@ fn allow_color_mix() -> bool {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn allow_more_color_4() -> bool {
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
|
return static_prefs::pref!("layout.css.more_color_4.enabled");
|
||||||
|
#[cfg(feature = "servo")]
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
impl ColorMix {
|
impl ColorMix {
|
||||||
fn parse<'i, 't>(
|
fn parse<'i, 't>(
|
||||||
context: &ParserContext,
|
context: &ParserContext,
|
||||||
|
@ -759,7 +767,7 @@ impl Color {
|
||||||
CSSParserColor::CurrentColor => Color::CurrentColor,
|
CSSParserColor::CurrentColor => Color::CurrentColor,
|
||||||
CSSParserColor::Absolute(absolute) => {
|
CSSParserColor::Absolute(absolute) => {
|
||||||
let enabled = matches!(absolute, cssparser::AbsoluteColor::Rgba(_)) ||
|
let enabled = matches!(absolute, cssparser::AbsoluteColor::Rgba(_)) ||
|
||||||
static_prefs::pref!("layout.css.more_color_4.enabled");
|
allow_more_color_4();
|
||||||
if !enabled {
|
if !enabled {
|
||||||
return Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError));
|
return Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError));
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ gecko = []
|
||||||
[dependencies]
|
[dependencies]
|
||||||
app_units = "0.7"
|
app_units = "0.7"
|
||||||
bitflags = "1.0"
|
bitflags = "1.0"
|
||||||
cssparser = "0.30"
|
cssparser = { workspace = true }
|
||||||
euclid = "0.22"
|
euclid = "0.22"
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
malloc_size_of = { path = "../malloc_size_of" }
|
malloc_size_of = { path = "../malloc_size_of" }
|
||||||
|
|
|
@ -26,8 +26,8 @@ fn test_rgba_color_interepolation_preserves_transparent() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_rgba_color_interepolation_alpha() {
|
fn test_rgba_color_interepolation_alpha() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
interpolate_rgba(RGBA::new(200, 0, 0, 100), RGBA::new(0, 200, 0, 200), 0.5),
|
interpolate_rgba(RGBA::new(200, 0, 0, 0.4), RGBA::new(0, 200, 0, 0.8), 0.5),
|
||||||
RGBA::new(67, 133, 0, 150)
|
RGBA::new(67, 133, 0, 0.6)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ fn test_rgba_color_interepolation_out_of_range_1() {
|
||||||
RGBA::from_floats(0.0, 1.0, 0.0, 0.6),
|
RGBA::from_floats(0.0, 1.0, 0.0, 0.6),
|
||||||
-0.5
|
-0.5
|
||||||
),
|
),
|
||||||
RGBA::new(154, 0, 0, 77)
|
RGBA::new(154, 0, 0, 0.3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ fn test_rgba_color_interepolation_out_of_range_2() {
|
||||||
RGBA::from_floats(0.0, 0.3, 0.0, 0.4),
|
RGBA::from_floats(0.0, 0.3, 0.0, 0.4),
|
||||||
1.5
|
1.5
|
||||||
),
|
),
|
||||||
RGBA::new(0, 154, 0, 77)
|
RGBA::new(0, 154, 0, 0.3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue