1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "bmshape_p.h"
5
6#include <QJsonArray>
7#include <QJsonObject>
8#include <QLoggingCategory>
9
10#include "bmgroup_p.h"
11#include "bmfill_p.h"
12#include "bmgfill_p.h"
13#include "bmstroke_p.h"
14#include "bmrect_p.h"
15#include "bmellipse_p.h"
16#include "bmround_p.h"
17#include "bmtrimpath_p.h"
18#include "bmshapetransform_p.h"
19#include "bmfreeformshape_p.h"
20#include "bmrepeater_p.h"
21#include "bmconstants_p.h"
22
23QT_BEGIN_NAMESPACE
24
25BMShape::BMShape(const BMShape &other)
26 : BMBase(other)
27{
28 m_direction = other.m_direction;
29 m_path = other.m_path;
30 m_appliedTrim = other.m_appliedTrim;
31}
32
33BMBase *BMShape::clone() const
34{
35 return new BMShape(*this);
36}
37
38BMShape *BMShape::construct(QJsonObject definition, const QVersionNumber &version, BMBase *parent)
39{
40 qCDebug(lcLottieQtBodymovinParser) << "BMShape::construct()";
41
42 BMShape *shape = nullptr;
43 const QByteArray type = definition.value(key: QLatin1String("ty")).toString().toLatin1();
44
45 if (Q_UNLIKELY(type.size() != 2)) {
46 qCWarning(lcLottieQtBodymovinParser) << "Unsupported shape type:"
47 << type;
48 return shape;
49 }
50
51#define BM_SHAPE_TAG(c1, c2) int((quint32(c1)<<8) | quint32(c2))
52
53 int typeToBuild = BM_SHAPE_TAG(type[0], type[1]);
54
55 switch (typeToBuild) {
56 case BM_SHAPE_TAG('g', 'r'):
57 {
58 qCDebug(lcLottieQtBodymovinParser) << "Parse group";
59 shape = new BMGroup(definition, version, parent);
60 shape->setType(BM_SHAPE_GROUP_IX);
61 break;
62 }
63 case BM_SHAPE_TAG('r', 'c'):
64 {
65 qCDebug(lcLottieQtBodymovinParser) << "Parse m_rect";
66 shape = new BMRect(definition, version, parent);
67 shape->setType(BM_SHAPE_RECT_IX);
68 break;
69 }
70 case BM_SHAPE_TAG('f', 'l'):
71 {
72 qCDebug(lcLottieQtBodymovinParser) << "Parse fill";
73 shape = new BMFill(definition, version, parent);
74 shape->setType(BM_SHAPE_FILL_IX);
75 break;
76 }
77 case BM_SHAPE_TAG('g', 'f'):
78 {
79 qCDebug(lcLottieQtBodymovinParser) << "Parse group fill";
80 shape = new BMGFill(definition, version, parent);
81 shape->setType(BM_SHAPE_GFILL_IX);
82 break;
83 }
84 case BM_SHAPE_TAG('s', 't'):
85 {
86 qCDebug(lcLottieQtBodymovinParser) << "Parse stroke";
87 shape = new BMStroke(definition, version, parent);
88 shape->setType(BM_SHAPE_STROKE_IX);
89 break;
90 }
91 case BM_SHAPE_TAG('t', 'r'):
92 {
93 qCDebug(lcLottieQtBodymovinParser) << "Parse shape transform";
94 shape = new BMShapeTransform(definition, version, parent);
95 shape->setType(BM_SHAPE_TRANS_IX);
96 break;
97 }
98 case BM_SHAPE_TAG('e', 'l'):
99 {
100 qCDebug(lcLottieQtBodymovinParser) << "Parse ellipse";
101 shape = new BMEllipse(definition, version, parent);
102 shape->setType(BM_SHAPE_ELLIPSE_IX);
103 break;
104 }
105 case BM_SHAPE_TAG('r', 'd'):
106 {
107 qCDebug(lcLottieQtBodymovinParser) << "Parse round";
108 shape = new BMRound(definition, version, parent);
109 shape->setType(BM_SHAPE_ROUND_IX);
110 break;
111 }
112 case BM_SHAPE_TAG('s', 'h'):
113 {
114 qCDebug(lcLottieQtBodymovinParser) << "Parse shape";
115 shape = new BMFreeFormShape(definition, version, parent);
116 shape->setType(BM_SHAPE_SHAPE_IX);
117 break;
118 }
119 case BM_SHAPE_TAG('t', 'm'):
120 {
121 qCDebug(lcLottieQtBodymovinParser) << "Parse trim path";
122 shape = new BMTrimPath(definition, version, parent);
123 shape->setType(BM_SHAPE_TRIM_IX);
124 break;
125 }
126 case BM_SHAPE_TAG('r', 'p'):
127 {
128 qCDebug(lcLottieQtBodymovinParser) << "Parse trim path";
129 shape = new BMRepeater(definition, version, parent);
130 shape->setType(BM_SHAPE_REPEATER_IX);
131 break;
132 }
133 case BM_SHAPE_TAG('g', 's'): // ### BM_SHAPE_GSTROKE_IX
134 case BM_SHAPE_TAG('s', 'r'): // ### BM_SHAPE_STAR_IX
135 // fall through
136 default:
137 qCWarning(lcLottieQtBodymovinParser) << "Unsupported shape type:"
138 << type;
139 }
140
141#undef BM_SHAPE_TAG
142
143 return shape;
144}
145
146bool BMShape::acceptsTrim() const
147{
148 return false;
149}
150
151void BMShape::applyTrim(const BMTrimPath &trimmer)
152{
153 if (trimmer.simultaneous())
154 m_path = trimmer.trim(path: m_path);
155}
156
157int BMShape::direction() const
158{
159 return m_direction;
160}
161
162const QPainterPath &BMShape::path() const
163{
164 return m_path;
165}
166
167QT_END_NAMESPACE
168

source code of qtlottie/src/bodymovin/bmshape.cpp