Issue #2489: Create ColorMixValue structure

This commit is contained in:
erixreyes 2025-07-19 12:22:06 +08:00 • committed by roytam1
commit cb60df2169

View file

@ -521,6 +521,7 @@ enum nsCSSUnit {
eCSSUnit_HSLColor = 89, // (nsCSSValueFloatColor*) eCSSUnit_HSLColor = 89, // (nsCSSValueFloatColor*)
eCSSUnit_HSLAColor = 90, // (nsCSSValueFloatColor*) eCSSUnit_HSLAColor = 90, // (nsCSSValueFloatColor*)
eCSSUnit_ComplexColor = 91, // (ComplexColorValue*) eCSSUnit_ComplexColor = 91, // (ComplexColorValue*)
eCSSUnit_ColorMix = 92, // (ColorMixValue*)
eCSSUnit_Percent = 100, // (float) 1.0 == 100%) value is percentage of something 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) eCSSUnit_Number = 101, // (float) value is numeric (usually multiplier, different behavior than percent)
@ -606,6 +607,13 @@ struct nsCSSValueTriplet;
struct nsCSSValueTriplet_heap; struct nsCSSValueTriplet_heap;
class nsCSSValueFloatColor; class nsCSSValueFloatColor;
namespace mozilla {
namespace css {
enum class ColorMixColorSpace;
struct ColorMixValue;
} // namespace css
} // namespace mozilla
class nsCSSValue { class nsCSSValue {
public: public:
struct Array; struct Array;
@ -805,6 +813,12 @@ public:
return mValue.mComplexColor->ToComplexColor(); return mValue.mComplexColor->ToComplexColor();
} }
mozilla::css::ColorMixValue* GetColorMixValue() const
{
MOZ_ASSERT(mUnit == eCSSUnit_ColorMix);
return mValue.mColorMix;
}
Array* GetArrayValue() const Array* GetArrayValue() const
{ {
MOZ_ASSERT(UnitHasArrayValue(), "not an array value"); MOZ_ASSERT(UnitHasArrayValue(), "not an array value");
@ -950,6 +964,8 @@ public:
void SetRGBAColorValue(const mozilla::css::RGBAColorData& aValue); void SetRGBAColorValue(const mozilla::css::RGBAColorData& aValue);
void SetComplexColorValue( void SetComplexColorValue(
already_AddRefed<mozilla::css::ComplexColorValue> aValue); already_AddRefed<mozilla::css::ComplexColorValue> aValue);
void SetColorMixValue(
already_AddRefed<mozilla::css::ColorMixValue> aValue);
void SetCascadeOriginValue(mozilla::SheetType aValue, nsCSSUnit aUnit); void SetCascadeOriginValue(mozilla::SheetType aValue, nsCSSUnit aUnit);
void SetArrayValue(nsCSSValue::Array* aArray, nsCSSUnit aUnit); void SetArrayValue(nsCSSValue::Array* aArray, nsCSSUnit aUnit);
void SetURLValue(mozilla::css::URLValue* aURI); void SetURLValue(mozilla::css::URLValue* aURI);
@ -1063,6 +1079,7 @@ protected:
nsCSSValueFloatColor* MOZ_OWNING_REF mFloatColor; nsCSSValueFloatColor* MOZ_OWNING_REF mFloatColor;
mozilla::css::FontFamilyListRefCnt* MOZ_OWNING_REF mFontFamilyList; mozilla::css::FontFamilyListRefCnt* MOZ_OWNING_REF mFontFamilyList;
mozilla::css::ComplexColorValue* MOZ_OWNING_REF mComplexColor; mozilla::css::ComplexColorValue* MOZ_OWNING_REF mComplexColor;
mozilla::css::ColorMixValue* MOZ_OWNING_REF mColorMix;
mozilla::SheetType mCascadeOrigin; mozilla::SheetType mCascadeOrigin;
} mValue; } mValue;
}; };
@ -1972,5 +1989,41 @@ protected:
static const corner_type corners[4]; 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___ */ #endif /* nsCSSValue_h___ */