void RenderStyle::applyTransform(TransformationMatrix& transform, const FloatRect& boundingBox, ApplyTransformOrigin applyOrigin) const { const Vector<RefPtr<TransformOperation> >& transformOperations = rareNonInheritedData->m_transform->m_operations.operations(); bool applyTransformOrigin = requireTransformOrigin(transformOperations, applyOrigin); float offsetX = transformOriginX().type() == Percent ? boundingBox.x() : 0; float offsetY = transformOriginY().type() == Percent ? boundingBox.y() : 0; if (applyTransformOrigin) { transform.translate3d(floatValueForLength(transformOriginX(), boundingBox.width()) + offsetX, floatValueForLength(transformOriginY(), boundingBox.height()) + offsetY, transformOriginZ()); } unsigned size = transformOperations.size(); for (unsigned i = 0; i < size; ++i) transformOperations[i]->apply(transform, boundingBox.size()); if (applyTransformOrigin) { transform.translate3d(-floatValueForLength(transformOriginX(), boundingBox.width()) - offsetX, -floatValueForLength(transformOriginY(), boundingBox.height()) - offsetY, -transformOriginZ()); } }
void RenderStyle::applyTransform(TransformationMatrix& transform, const IntSize& borderBoxSize, bool includeTransformOrigin) const { // transform-origin brackets the transform with translate operations. // Optimize for the case where the only transform is a translation, since the transform-origin is irrelevant // in that case. bool applyTransformOrigin = false; unsigned s = rareNonInheritedData->m_transform->m_operations.operations().size(); unsigned i; if (includeTransformOrigin) { for (i = 0; i < s; i++) { TransformOperation::OperationType type = rareNonInheritedData->m_transform->m_operations.operations()[i]->getOperationType(); if (type != TransformOperation::TRANSLATE_X && type != TransformOperation::TRANSLATE_Y && type != TransformOperation::TRANSLATE) { applyTransformOrigin = true; break; } } } if (applyTransformOrigin) transform.translate(transformOriginX().calcFloatValue(borderBoxSize.width()), transformOriginY().calcFloatValue(borderBoxSize.height())); for (i = 0; i < s; i++) rareNonInheritedData->m_transform->m_operations.operations()[i]->apply(transform, borderBoxSize); if (applyTransformOrigin) transform.translate(-transformOriginX().calcFloatValue(borderBoxSize.width()), -transformOriginY().calcFloatValue(borderBoxSize.height())); }