Index: third_party/WebKit/Source/core/style/ComputedStyle.cpp |
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp |
index 8188e6012b3af91a0b81babb7c48af57ac993297..ac48e69a0ea36a37c2516af243da8b00b5d3bb62 100644 |
--- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp |
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp |
@@ -988,6 +988,7 @@ static bool hasPropertyThatCreatesStackingContext(const Vector<CSSPropertyID>& p |
case CSSPropertyPosition: |
case CSSPropertyMixBlendMode: |
case CSSPropertyIsolation: |
+ case CSSPropertyOffsetPath: |
return true; |
default: |
break; |
@@ -1097,7 +1098,7 @@ void ComputedStyle::applyTransform(TransformationMatrix& result, const LayoutSiz |
void ComputedStyle::applyTransform(TransformationMatrix& result, const FloatRect& boundingBox, ApplyTransformOrigin applyOrigin, ApplyMotionPath applyMotionPath, ApplyIndependentTransformProperties applyIndependentTransformProperties) const |
{ |
- if (!hasMotionPath()) |
+ if (!hasOffsetPath()) |
applyMotionPath = ExcludeMotionPath; |
bool applyTransformOrigin = requireTransformOrigin(applyOrigin, applyMotionPath); |
@@ -1127,7 +1128,7 @@ void ComputedStyle::applyTransform(TransformationMatrix& result, const FloatRect |
} |
if (applyMotionPath == ComputedStyle::IncludeMotionPath) |
- applyMotionPathTransform(originX, originY, result); |
+ applyMotionPathTransform(originX, originY, boundingBox, result); |
const Vector<RefPtr<TransformOperation>>& transformOperations = transform().operations(); |
unsigned size = transformOperations.size(); |
@@ -1139,13 +1140,13 @@ void ComputedStyle::applyTransform(TransformationMatrix& result, const FloatRect |
} |
} |
-void ComputedStyle::applyMotionPathTransform(float originX, float originY, TransformationMatrix& transform) const |
+void ComputedStyle::applyMotionPathTransform(float originX, float originY, const FloatRect& boundingBox, TransformationMatrix& transform) const |
{ |
const StyleMotionData& motionData = m_rareNonInheritedData->m_transform->m_motion; |
ASSERT(motionData.m_path); |
const StylePath& motionPath = *motionData.m_path; |
float pathLength = motionPath.length(); |
- float distance = floatValueForLength(motionData.m_offset, pathLength); |
+ float distance = floatValueForLength(motionData.m_distance, pathLength); |
float computedDistance; |
if (motionPath.isClosed() && pathLength > 0) { |
computedDistance = fmod(distance, pathLength); |
@@ -1159,10 +1160,27 @@ void ComputedStyle::applyMotionPathTransform(float originX, float originY, Trans |
float angle; |
motionPath.path().pointAndNormalAtLength(computedDistance, point, angle); |
- if (motionData.m_rotation.type == MotionRotationFixed) |
+ if (motionData.m_rotation.type == OffsetRotationFixed) |
angle = 0; |
- transform.translate(point.x() - originX, point.y() - originY); |
+ float translateX = point.x(); |
+ float translateY = point.y(); |
+ const LengthPoint& position = offsetPosition(); |
+ if (position.x() == Auto) { |
+ translateX -= originX; |
+ translateY -= originY; |
+ } else { |
+ translateX += floatValueForLength(position.x(), boundingBox.width()) - floatValueForLength(left(), boundingBox.width()); |
+ translateY += floatValueForLength(position.y(), boundingBox.height()) - floatValueForLength(top(), boundingBox.height()); |
+ } |
+ |
+ const LengthPoint& anchor = offsetAnchor(); |
+ // TODO(ericwilligers): Consider interaction between position, anchor, rotation |
+ if (anchor.x() != Auto) { |
+ translateX += floatValueForLength(left(), boundingBox.width()) - boundingBox.x() - floatValueForLength(anchor.x(), boundingBox.width()); |
+ translateY += floatValueForLength(top(), boundingBox.height()) - boundingBox.y() - floatValueForLength(anchor.y(), boundingBox.height()); |
+ } |
+ transform.translate(translateX, translateY); |
transform.rotate(angle + motionData.m_rotation.angle); |
} |
@@ -1843,7 +1861,7 @@ void ComputedStyle::setMarginEnd(const Length& margin) |
} |
} |
-void ComputedStyle::setMotionPath(PassRefPtr<StylePath> path) |
+void ComputedStyle::setOffsetPath(PassRefPtr<StylePath> path) |
{ |
m_rareNonInheritedData.access()->m_transform.access()->m_motion.m_path = path; |
} |