15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 27bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/geometry/TransformState.h" 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/PassOwnPtr.h" 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TransformState& TransformState::operator=(const TransformState& other) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_accumulatedOffset = other.m_accumulatedOffset; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_mapPoint = other.m_mapPoint; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_mapQuad = other.m_mapQuad; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mapPoint) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPlanarPoint = other.m_lastPlanarPoint; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mapQuad) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPlanarQuad = other.m_lastPlanarQuad; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatingTransform = other.m_accumulatingTransform; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_direction = other.m_direction; 4402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatedTransform.clear(); 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (other.m_accumulatedTransform) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatedTransform = adoptPtr(new TransformationMatrix(*other.m_accumulatedTransform)); 4902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return *this; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TransformState::translateTransform(const LayoutSize& offset) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_direction == ApplyTransformDirection) 56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_accumulatedTransform->translateRight(offset.width().toDouble(), offset.height().toDouble()); 57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_accumulatedTransform->translate(offset.width().toDouble(), offset.height().toDouble()); 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TransformState::translateMappedCoordinates(const LayoutSize& offset) 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutSize adjustedOffset = (m_direction == ApplyTransformDirection) ? offset : -offset; 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_mapPoint) 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_lastPlanarPoint.move(adjustedOffset); 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_mapQuad) 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_lastPlanarQuad.move(adjustedOffset); 68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TransformState::move(const LayoutSize& offset, TransformAccumulation accumulate) 71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 72bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (accumulate == FlattenTransform || !m_accumulatedTransform) { 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_accumulatedOffset += offset; 74bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } else { 75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) applyAccumulatedOffset(); 76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_accumulatingTransform && m_accumulatedTransform) { 77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // If we're accumulating into an existing transform, apply the translation. 78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) translateTransform(offset); 79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Then flatten if necessary. 81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (accumulate == FlattenTransform) 82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) flatten(); 83bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } else { 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Just move the point and/or quad. 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) translateMappedCoordinates(offset); 86bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatingTransform = accumulate == AccumulateTransform; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TransformState::applyAccumulatedOffset() 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutSize offset = m_accumulatedOffset; 94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_accumulatedOffset = LayoutSize(); 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!offset.isZero()) { 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_accumulatedTransform) { 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) translateTransform(offset); 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) flatten(); 99bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } else { 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) translateMappedCoordinates(offset); 101bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: We transform AffineTransform to TransformationMatrix. This is rather inefficient. 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TransformState::applyTransform(const AffineTransform& transformFromContainer, TransformAccumulation accumulate, bool* wasClamped) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) applyTransform(transformFromContainer.toTransformationMatrix(), accumulate, wasClamped); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TransformState::applyTransform(const TransformationMatrix& transformFromContainer, TransformAccumulation accumulate, bool* wasClamped) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (wasClamped) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *wasClamped = false; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (transformFromContainer.isIntegerTranslation()) { 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) move(LayoutSize(transformFromContainer.e(), transformFromContainer.f()), accumulate); 118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) applyAccumulatedOffset(); 122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we have an accumulated transform from last time, multiply in this transform 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_accumulatedTransform) { 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_direction == ApplyTransformDirection) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatedTransform = adoptPtr(new TransformationMatrix(transformFromContainer * *m_accumulatedTransform)); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatedTransform->multiply(transformFromContainer); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (accumulate == AccumulateTransform) { 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Make one if we started to accumulate 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatedTransform = adoptPtr(new TransformationMatrix(transformFromContainer)); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (accumulate == FlattenTransform) { 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const TransformationMatrix* finalTransform = m_accumulatedTransform ? m_accumulatedTransform.get() : &transformFromContainer; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) flattenWithTransform(*finalTransform, wasClamped); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatingTransform = accumulate == AccumulateTransform; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TransformState::flatten(bool* wasClamped) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (wasClamped) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *wasClamped = false; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) applyAccumulatedOffset(); 147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_accumulatedTransform) { 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatingTransform = false; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) flattenWithTransform(*m_accumulatedTransform, wasClamped); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatPoint TransformState::mappedPoint(bool* wasClamped) const 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (wasClamped) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *wasClamped = false; 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatPoint point = m_lastPlanarPoint; 162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) point.move((m_direction == ApplyTransformDirection) ? m_accumulatedOffset : -m_accumulatedOffset); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_accumulatedTransform) 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return point; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_direction == ApplyTransformDirection) 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_accumulatedTransform->mapPoint(point); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_accumulatedTransform->inverse().projectPoint(point, wasClamped); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FloatQuad TransformState::mappedQuad(bool* wasClamped) const 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (wasClamped) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *wasClamped = false; 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatQuad quad = m_lastPlanarQuad; 178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) quad.move((m_direction == ApplyTransformDirection) ? m_accumulatedOffset : -m_accumulatedOffset); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_accumulatedTransform) 180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return quad; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_direction == ApplyTransformDirection) 183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_accumulatedTransform->mapQuad(quad); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_accumulatedTransform->inverse().projectQuad(quad, wasClamped); 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TransformState::flattenWithTransform(const TransformationMatrix& t, bool* wasClamped) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_direction == ApplyTransformDirection) { 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mapPoint) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPlanarPoint = t.mapPoint(m_lastPlanarPoint); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mapQuad) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPlanarQuad = t.mapQuad(m_lastPlanarQuad); 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TransformationMatrix inverseTransform = t.inverse(); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mapPoint) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPlanarPoint = inverseTransform.projectPoint(m_lastPlanarPoint); 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_mapQuad) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_lastPlanarQuad = inverseTransform.projectQuad(m_lastPlanarQuad, wasClamped); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We could throw away m_accumulatedTransform if we wanted to here, but that 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // would cause thrash when traversing hierarchies with alternating 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // preserve-3d and flat elements. 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_accumulatedTransform) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatedTransform->makeIdentity(); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_accumulatingTransform = false; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 211c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 212