From cb60df2169a2c1acd50cfe9754bbdc2e3e0354fd Mon Sep 17 00:00:00 2001 From: erixreyes Date: Sat, 19 Jul 2025 12:22:06 +0800 Subject: [PATCH] Issue #2489: Create ColorMixValue structure --- layout/style/nsCSSValue.h | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/layout/style/nsCSSValue.h b/layout/style/nsCSSValue.h index 4282d55375..ae50355147 100644 --- a/layout/style/nsCSSValue.h +++ b/layout/style/nsCSSValue.h @@ -521,6 +521,7 @@ enum nsCSSUnit { eCSSUnit_HSLColor = 89, // (nsCSSValueFloatColor*) eCSSUnit_HSLAColor = 90, // (nsCSSValueFloatColor*) eCSSUnit_ComplexColor = 91, // (ComplexColorValue*) + eCSSUnit_ColorMix = 92, // (ColorMixValue*) eCSSUnit_Percent = 100, // (float) 1.0 == 100%) value is percentage of something eCSSUnit_Number = 101, // (float) value is numeric (usually multiplier, different behavior than percent) @@ -606,6 +607,13 @@ struct nsCSSValueTriplet; struct nsCSSValueTriplet_heap; class nsCSSValueFloatColor; +namespace mozilla { +namespace css { +enum class ColorMixColorSpace; +struct ColorMixValue; +} // namespace css +} // namespace mozilla + class nsCSSValue { public: struct Array; @@ -805,6 +813,12 @@ public: return mValue.mComplexColor->ToComplexColor(); } + mozilla::css::ColorMixValue* GetColorMixValue() const + { + MOZ_ASSERT(mUnit == eCSSUnit_ColorMix); + return mValue.mColorMix; + } + Array* GetArrayValue() const { MOZ_ASSERT(UnitHasArrayValue(), "not an array value"); @@ -950,6 +964,8 @@ public: void SetRGBAColorValue(const mozilla::css::RGBAColorData& aValue); void SetComplexColorValue( already_AddRefed aValue); + void SetColorMixValue( + already_AddRefed aValue); void SetCascadeOriginValue(mozilla::SheetType aValue, nsCSSUnit aUnit); void SetArrayValue(nsCSSValue::Array* aArray, nsCSSUnit aUnit); void SetURLValue(mozilla::css::URLValue* aURI); @@ -1063,6 +1079,7 @@ protected: nsCSSValueFloatColor* MOZ_OWNING_REF mFloatColor; mozilla::css::FontFamilyListRefCnt* MOZ_OWNING_REF mFontFamilyList; mozilla::css::ComplexColorValue* MOZ_OWNING_REF mComplexColor; + mozilla::css::ColorMixValue* MOZ_OWNING_REF mColorMix; mozilla::SheetType mCascadeOrigin; } mValue; }; @@ -1972,5 +1989,41 @@ protected: static const corner_type corners[4]; }; +namespace mozilla { +namespace css { + +enum class ColorMixColorSpace { + sRGB, + HSL +}; + +struct ColorMixValue final +{ + ColorMixColorSpace mColorSpace; + nsCSSValue mColor1; + nsCSSValue mColor2; + float mWeight1; + float mWeight2; + + ColorMixValue(ColorMixColorSpace aColorSpace, const nsCSSValue& aColor1, const nsCSSValue& aColor2) + : mColorSpace(aColorSpace), mColor1(aColor1), mColor2(aColor2), mWeight1(0.5f), mWeight2(0.5f) {} + + ColorMixValue(ColorMixColorSpace aColorSpace, const nsCSSValue& aColor1, const nsCSSValue& aColor2, + float aWeight1, float aWeight2) + : mColorSpace(aColorSpace), mColor1(aColor1), mColor2(aColor2), mWeight1(aWeight1), mWeight2(aWeight2) {} + + ColorMixValue(const ColorMixValue&) = delete; + + NS_INLINE_DECL_REFCOUNTING(ColorMixValue) + + size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const; + +private: + ~ColorMixValue() {} +}; + +} // namespace css +} // namespace mozilla + #endif /* nsCSSValue_h___ */