Bug 1207734 - Part 1.d. Carry the computed value of individual transform in nsStyleDisplay.
Add three more attributes in nsStyleDisplay
1. mSpecifiedRotate to carry computed value of 'rotate' property.
2. mSpecifiedTranslate to carry computed value of 'translate' property.
3. mSpecifiedScale to carry computed value of 'scale' property.
Since each of these tree new property can be an animation target, we have to store
them in speparate attributes, instead of putting them all in mSpecifiedTransform.
MozReview-Commit-ID: G2dBAxzyBWh
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3659,16 +3659,19 @@ nsStyleDisplay::nsStyleDisplay(const nsS
, mScrollSnapPointsX(aSource.mScrollSnapPointsX)
, mScrollSnapPointsY(aSource.mScrollSnapPointsY)
, mScrollSnapDestination(aSource.mScrollSnapDestination)
, mScrollSnapCoordinate(aSource.mScrollSnapCoordinate)
, mBackfaceVisibility(aSource.mBackfaceVisibility)
, mTransformStyle(aSource.mTransformStyle)
, mTransformBox(aSource.mTransformBox)
, mSpecifiedTransform(aSource.mSpecifiedTransform)
+ , mSpecifiedRotate(aSource.mSpecifiedRotate)
+ , mSpecifiedTranslate(aSource.mSpecifiedTranslate)
+ , mSpecifiedScale(aSource.mSpecifiedScale)
, mTransformOrigin{ aSource.mTransformOrigin[0],
aSource.mTransformOrigin[1],
aSource.mTransformOrigin[2] }
, mChildPerspective(aSource.mChildPerspective)
, mPerspectiveOrigin{ aSource.mPerspectiveOrigin[0],
aSource.mPerspectiveOrigin[1] }
, mVerticalAlign(aSource.mVerticalAlign)
, mTransitions(aSource.mTransitions)
@@ -3716,16 +3719,22 @@ void ReleaseSharedListOnMainThread(const
NS_ReleaseOnMainThreadSystemGroup(aName, aList.forget(), alwaysProxy);
}
}
nsStyleDisplay::~nsStyleDisplay()
{
ReleaseSharedListOnMainThread("nsStyleDisplay::mSpecifiedTransform",
mSpecifiedTransform);
+ ReleaseSharedListOnMainThread("nsStyleDisplay::mSpecifiedRotate",
+ mSpecifiedRotate);
+ ReleaseSharedListOnMainThread("nsStyleDisplay::mSpecifiedTranslate",
+ mSpecifiedTranslate);
+ ReleaseSharedListOnMainThread("nsStyleDisplay::mSpecifiedScale",
+ mSpecifiedScale);
MOZ_COUNT_DTOR(nsStyleDisplay);
}
void
nsStyleDisplay::FinishStyle(nsPresContext* aPresContext)
{
MOZ_ASSERT(NS_IsMainThread());
@@ -3734,16 +3743,33 @@ nsStyleDisplay::FinishStyle(nsPresContex
if (mShapeOutside.GetType() == StyleShapeSourceType::Image) {
const UniquePtr<nsStyleImage>& shapeImage = mShapeOutside.GetShapeImage();
if (shapeImage) {
shapeImage->ResolveImage(aPresContext);
}
}
}
+static inline nsChangeHint
+CompareTransformValues(const RefPtr<nsCSSValueSharedList>& aList,
+ const RefPtr<nsCSSValueSharedList>& aNewList)
+{
+ nsChangeHint result = nsChangeHint(0);
+ if (!aList != !aNewList || (aList && *aList != *aNewList)) {
+ result |= nsChangeHint_UpdateTransformLayer;
+ if (aList && aNewList) {
+ result |= nsChangeHint_UpdatePostTransformOverflow;
+ } else {
+ result |= nsChangeHint_UpdateOverflow;
+ }
+ }
+
+ return result;
+}
+
nsChangeHint
nsStyleDisplay::CalcDifference(const nsStyleDisplay& aNewData) const
{
nsChangeHint hint = nsChangeHint(0);
if (!DefinitelyEqualURIsAndPrincipal(mBinding, aNewData.mBinding)
|| mPosition != aNewData.mPosition
|| mDisplay != aNewData.mDisplay
@@ -3862,28 +3888,24 @@ nsStyleDisplay::CalcDifference(const nsS
* overflow rect.
*
* If the property isn't present in either style struct, we still do the
* comparisons but turn all the resulting change hints into
* nsChangeHint_NeutralChange.
*/
nsChangeHint transformHint = nsChangeHint(0);
- if (!mSpecifiedTransform != !aNewData.mSpecifiedTransform ||
- (mSpecifiedTransform &&
- *mSpecifiedTransform != *aNewData.mSpecifiedTransform)) {
- transformHint |= nsChangeHint_UpdateTransformLayer;
-
- if (mSpecifiedTransform &&
- aNewData.mSpecifiedTransform) {
- transformHint |= nsChangeHint_UpdatePostTransformOverflow;
- } else {
- transformHint |= nsChangeHint_UpdateOverflow;
- }
- }
+ transformHint |= CompareTransformValues(mSpecifiedTransform,
+ aNewData.mSpecifiedTransform);
+ transformHint |= CompareTransformValues(mSpecifiedRotate, aNewData.
+ mSpecifiedRotate);
+ transformHint |= CompareTransformValues(mSpecifiedTranslate,
+ aNewData.mSpecifiedTranslate);
+ transformHint |= CompareTransformValues(mSpecifiedScale,
+ aNewData.mSpecifiedScale);
const nsChangeHint kUpdateOverflowAndRepaintHint =
nsChangeHint_UpdateOverflow | nsChangeHint_RepaintFrame;
for (uint8_t index = 0; index < 3; ++index) {
if (mTransformOrigin[index] != aNewData.mTransformOrigin[index]) {
transformHint |= nsChangeHint_UpdateTransformLayer |
nsChangeHint_UpdatePostTransformOverflow;
break;
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -2585,16 +2585,19 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
// mSpecifiedTransform is the list of transform functions as
// specified, or null to indicate there is no transform. (inherit or
// initial are replaced by an actual list of transform functions, or
// null, as appropriate.)
uint8_t mBackfaceVisibility;
uint8_t mTransformStyle;
StyleGeometryBox mTransformBox; // [reset] see nsStyleConsts.h
RefPtr<nsCSSValueSharedList> mSpecifiedTransform; // [reset]
+ RefPtr<nsCSSValueSharedList> mSpecifiedRotate; // [reset]
+ RefPtr<nsCSSValueSharedList> mSpecifiedTranslate; // [reset]
+ RefPtr<nsCSSValueSharedList> mSpecifiedScale; // [reset]
nsStyleCoord mTransformOrigin[3]; // [reset] percent, coord, calc, 3rd param is coord, calc only
nsStyleCoord mChildPerspective; // [reset] none, coord
nsStyleCoord mPerspectiveOrigin[2]; // [reset] percent, coord, calc
nsStyleCoord mVerticalAlign; // [reset] coord, percent, calc, enum (see nsStyleConsts.h)
nsStyleAutoArray<mozilla::StyleTransition> mTransitions; // [reset]
@@ -2782,17 +2785,18 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
bool IsContainPaint() const {
return NS_STYLE_CONTAIN_PAINT & mContain;
}
/* Returns whether the element has the -moz-transform property
* or a related property. */
bool HasTransformStyle() const {
- return mSpecifiedTransform ||
+ return mSpecifiedTransform || mSpecifiedRotate || mSpecifiedTranslate ||
+ mSpecifiedScale ||
mTransformStyle == NS_STYLE_TRANSFORM_STYLE_PRESERVE_3D ||
(mWillChangeBitField & NS_STYLE_WILL_CHANGE_TRANSFORM);
}
bool HasPerspectiveStyle() const {
return mChildPerspective.GetUnit() == eStyleUnit_Coord;
}