Bug 1299741 part 5 - Add css::RGBAColorData struct. r=heycam
This struct will be used as part of the storage type of ComplexColor in
nsCSSValue. Also this will be used to help unifying color calculation in
StyleAnimationValue.
MozReview-Commit-ID: C5UUI5DNnRM
--- a/layout/style/nsCSSValue.cpp
+++ b/layout/style/nsCSSValue.cpp
@@ -473,16 +473,23 @@ void nsCSSValue::SetFloatColorValue(floa
Reset();
mUnit = aUnit;
MOZ_ASSERT(IsFloatColorUnit(), "bad unit");
mValue.mFloatColor =
new nsCSSValueFloatColor(aComponent1, aComponent2, aComponent3, aAlpha);
mValue.mFloatColor->AddRef();
}
+void
+nsCSSValue::SetRGBAColorValue(const RGBAColorData& aValue)
+{
+ SetFloatColorValue(aValue.mR, aValue.mG, aValue.mB,
+ aValue.mA, eCSSUnit_PercentageRGBAColor);
+}
+
void nsCSSValue::SetArrayValue(nsCSSValue::Array* aValue, nsCSSUnit aUnit)
{
Reset();
mUnit = aUnit;
MOZ_ASSERT(UnitHasArrayValue(), "bad unit");
mValue.mArray = aValue;
mValue.mArray->AddRef();
}
--- a/layout/style/nsCSSValue.h
+++ b/layout/style/nsCSSValue.h
@@ -294,16 +294,62 @@ public:
NS_INLINE_DECL_REFCOUNTING(FontFamilyListRefCnt);
private:
~FontFamilyListRefCnt() {
MOZ_COUNT_DTOR(FontFamilyListRefCnt);
}
};
+struct RGBAColorData
+{
+ // 1.0 means 100% for all components, but the value may fall outside
+ // the range of [0.0, 1.0], so it is necessary to clamp them when
+ // converting to nscolor.
+ float mR;
+ float mG;
+ float mB;
+ float mA;
+
+ RGBAColorData() = default;
+ MOZ_IMPLICIT RGBAColorData(nscolor aColor)
+ : mR(NS_GET_R(aColor) * (1.0f / 255.0f))
+ , mG(NS_GET_G(aColor) * (1.0f / 255.0f))
+ , mB(NS_GET_B(aColor) * (1.0f / 255.0f))
+ , mA(NS_GET_A(aColor) * (1.0f / 255.0f))
+ {}
+ RGBAColorData(float aR, float aG, float aB, float aA)
+ : mR(aR), mG(aG), mB(aB), mA(aA) {}
+
+ bool operator==(const RGBAColorData& aOther) const
+ {
+ return mR == aOther.mR && mG == aOther.mG &&
+ mB == aOther.mB && mA == aOther.mA;
+ }
+ bool operator!=(const RGBAColorData& aOther) const
+ {
+ return !(*this == aOther);
+ }
+
+ nscolor ToColor() const
+ {
+ return NS_RGBA(ClampColor(mR * 255.0f),
+ ClampColor(mG * 255.0f),
+ ClampColor(mB * 255.0f),
+ ClampColor(mA * 255.0f));
+ }
+
+ RGBAColorData WithAlpha(float aAlpha) const
+ {
+ RGBAColorData result = *this;
+ result.mA = aAlpha;
+ return result;
+ }
+};
+
} // namespace css
} // namespace mozilla
enum nsCSSUnit {
eCSSUnit_Null = 0, // (n/a) null unit, value is not specified
eCSSUnit_Auto = 1, // (n/a) value is algorithmic
eCSSUnit_Inherit = 2, // (n/a) value is inherited
eCSSUnit_Initial = 3, // (n/a) value is default UA value
@@ -766,16 +812,17 @@ public:
void SetFloatValue(float aValue, nsCSSUnit aUnit);
void SetStringValue(const nsString& aValue, nsCSSUnit aUnit);
void SetColorValue(nscolor aValue);
void SetIntegerColorValue(nscolor aValue, nsCSSUnit aUnit);
void SetFloatColorValue(float aComponent1,
float aComponent2,
float aComponent3,
float aAlpha, nsCSSUnit aUnit);
+ void SetRGBAColorValue(const mozilla::css::RGBAColorData& aValue);
void SetArrayValue(nsCSSValue::Array* aArray, nsCSSUnit aUnit);
void SetURLValue(mozilla::css::URLValue* aURI);
void SetImageValue(mozilla::css::ImageValue* aImage);
void SetGradientValue(nsCSSValueGradient* aGradient);
void SetTokenStreamValue(nsCSSValueTokenStream* aTokenStream);
void SetGridTemplateAreas(mozilla::css::GridTemplateAreasValue* aValue);
void SetFontFamilyListValue(mozilla::css::FontFamilyListRefCnt* aFontListValue);
void SetPairValue(const nsCSSValuePair* aPair);