1/*
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * (C) 2000 Antti Koivisto (koivisto@kde.org)
4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
17 *
18 * You should have received a copy of the GNU Library General Public License
19 * along with this library; see the file COPYING.LIB. If not, write to
20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22 *
23 */
24
25#pragma once
26
27#include "LayoutSize.h"
28#include "TransformOperation.h"
29#include <wtf/RefPtr.h>
30#include <wtf/Vector.h>
31
32namespace WebCore {
33
34class TransformOperations {
35 WTF_MAKE_FAST_ALLOCATED;
36public:
37 TransformOperations(bool makeIdentity = false);
38
39 bool operator==(const TransformOperations& o) const;
40 bool operator!=(const TransformOperations& o) const
41 {
42 return !(*this == o);
43 }
44
45 void apply(const FloatSize& sz, TransformationMatrix& t) const
46 {
47 for (unsigned i = 0; i < m_operations.size(); ++i)
48 m_operations[i]->apply(t, sz);
49 }
50
51 // Return true if any of the operation types are 3D operation types (even if the
52 // values describe affine transforms)
53 bool has3DOperation() const
54 {
55 for (const auto& operation : m_operations) {
56 if (operation->is3DOperation())
57 return true;
58 }
59 return false;
60 }
61
62 bool isRepresentableIn2D() const
63 {
64 for (const auto& operation : m_operations) {
65 if (!operation->isRepresentableIn2D())
66 return false;
67 }
68 return true;
69 }
70
71 bool operationsMatch(const TransformOperations&) const;
72
73 void clear()
74 {
75 m_operations.clear();
76 }
77
78 bool affectedByTransformOrigin() const;
79
80 Vector<RefPtr<TransformOperation>>& operations() { return m_operations; }
81 const Vector<RefPtr<TransformOperation>>& operations() const { return m_operations; }
82
83 size_t size() const { return m_operations.size(); }
84 const TransformOperation* at(size_t index) const { return index < m_operations.size() ? m_operations.at(index).get() : 0; }
85
86 TransformOperations blendByMatchingOperations(const TransformOperations& from, const double& progress) const;
87 TransformOperations blendByUsingMatrixInterpolation(const TransformOperations& from, double progress, const LayoutSize&) const;
88 TransformOperations blend(const TransformOperations& from, double progress, const LayoutSize&) const;
89
90private:
91 Vector<RefPtr<TransformOperation>> m_operations;
92};
93
94WTF::TextStream& operator<<(WTF::TextStream&, const TransformOperations&);
95
96} // namespace WebCore
97
98