From 7800eb012696a9ad428935823442c56b30958f34 Mon Sep 17 00:00:00 2001 From: erixreyes Date: Sat, 19 Jul 2025 07:45:24 +0800 Subject: [PATCH] Issue #2489: ColorMixValue support and structure --- layout/style/nsCSSValue.cpp | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index 24e804d800..9503e09f57 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -166,6 +166,10 @@ nsCSSValue::nsCSSValue(const nsCSSValue& aCopy) mValue.mComplexColor = aCopy.mValue.mComplexColor; mValue.mComplexColor->AddRef(); } + else if (eCSSUnit_ColorMix == mUnit) { + mValue.mColorMix = aCopy.mValue.mColorMix; + mValue.mColorMix->AddRef(); + } else if (eCSSUnit_Revert == mUnit) { mValue.mCascadeOrigin = aCopy.mValue.mCascadeOrigin; } @@ -282,6 +286,14 @@ bool nsCSSValue::operator==(const nsCSSValue& aOther) const else if (eCSSUnit_ComplexColor == mUnit) { return *mValue.mComplexColor == *aOther.mValue.mComplexColor; } + else if (eCSSUnit_ColorMix == mUnit) { + return mValue.mColorMix == aOther.mValue.mColorMix || + (mValue.mColorMix->mColorSpace == aOther.mValue.mColorMix->mColorSpace && + mValue.mColorMix->mColor1 == aOther.mValue.mColorMix->mColor1 && + mValue.mColorMix->mColor2 == aOther.mValue.mColorMix->mColor2 && + mValue.mColorMix->mWeight1 == aOther.mValue.mColorMix->mWeight1 && + mValue.mColorMix->mWeight2 == aOther.mValue.mColorMix->mWeight2); + } else if (eCSSUnit_Revert == mUnit) { return mValue.mCascadeOrigin == aOther.mValue.mCascadeOrigin; } @@ -421,6 +433,8 @@ void nsCSSValue::DoReset() mValue.mFloatColor->Release(); } else if (eCSSUnit_ComplexColor == mUnit) { mValue.mComplexColor->Release(); + } else if (eCSSUnit_ColorMix == mUnit) { + mValue.mColorMix->Release(); } else if (UnitHasArrayValue()) { mValue.mArray->Release(); } else if (eCSSUnit_URL == mUnit) { @@ -545,6 +559,14 @@ nsCSSValue::SetComplexColorValue(already_AddRefed aValue) mValue.mComplexColor = aValue.take(); } +void +nsCSSValue::SetColorMixValue(already_AddRefed aValue) +{ + Reset(); + mUnit = eCSSUnit_ColorMix; + mValue.mColorMix = aValue.take(); +} + void nsCSSValue::SetCascadeOriginValue(mozilla::SheetType aValue, nsCSSUnit aUnit) { @@ -2007,6 +2029,7 @@ nsCSSValue::AppendToString(nsCSSPropertyID aProperty, nsAString& aResult, case eCSSUnit_HSLColor: break; case eCSSUnit_HSLAColor: break; case eCSSUnit_ComplexColor: break; + case eCSSUnit_ColorMix: break; case eCSSUnit_Percent: aResult.Append(char16_t('%')); break; case eCSSUnit_Number: break; case eCSSUnit_Gradient: break; @@ -2221,6 +2244,11 @@ nsCSSValue::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const n += mValue.mComplexColor->SizeOfIncludingThis(aMallocSizeOf); break; + // Color Mix + case eCSSUnit_ColorMix: + n += mValue.mColorMix->SizeOfIncludingThis(aMallocSizeOf); + break; + // Cascade Origin: nothing extra to measure. case eCSSUnit_Revert: break; @@ -3075,6 +3103,18 @@ css::ComplexColorValue::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const return n; } +size_t +css::ColorMixValue::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const +{ + // Only measure it if it's unshared, to avoid double-counting. + size_t n = 0; + if (mRefCnt <= 1) { + n += aMallocSizeOf(this); + n += mColor1.SizeOfExcludingThis(aMallocSizeOf); + n += mColor2.SizeOfExcludingThis(aMallocSizeOf); + } + return n; +} nsCSSValueGradientStop::nsCSSValueGradientStop() : mLocation(eCSSUnit_None), mColor(eCSSUnit_Null),