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