Issue #2489: ColorMixValue support and structure

This commit is contained in:
erixreyes 2025-07-19 07:45:24 +08:00 committed by roytam1
commit 7800eb0126

View file

@ -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<ComplexColorValue> aValue)
mValue.mComplexColor = aValue.take();
}
void
nsCSSValue::SetColorMixValue(already_AddRefed<ColorMixValue> 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),