1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "modifier/rs_render_property.h"
17
18 #include <iomanip>
19
20 #include "pipeline/rs_render_node.h"
21 #include "platform/common/rs_log.h"
22 #include "rs_profiler.h"
23
24 namespace OHOS {
25 namespace Rosen {
26
OnChange() const27 void RSRenderPropertyBase::OnChange() const
28 {
29 if (auto node = node_.lock()) {
30 node->SetDirty();
31 node->AddDirtyType(modifierType_);
32 if (modifierType_ < RSModifierType::BOUNDS || modifierType_ > RSModifierType::TRANSLATE_Z ||
33 modifierType_ == RSModifierType::POSITION_Z) {
34 node->MarkNonGeometryChanged();
35 }
36 if (modifierType_ > RSModifierType::EXTENDED) {
37 node->SetContentDirty();
38 }
39 if (modifierType_ == RSModifierType::POSITION_Z) {
40 node->MarkParentNeedRegenerateChildren();
41 }
42 }
43 }
44
UpdatePropertyUnit(RSModifierType type)45 void RSRenderPropertyBase::UpdatePropertyUnit(RSModifierType type)
46 {
47 switch (type) {
48 case RSModifierType::FRAME:
49 case RSModifierType::TRANSLATE:
50 SetPropertyUnit(RSPropertyUnit::PIXEL_POSITION);
51 break;
52 case RSModifierType::SCALE:
53 SetPropertyUnit(RSPropertyUnit::RATIO_SCALE);
54 break;
55 case RSModifierType::ROTATION_X:
56 case RSModifierType::ROTATION_Y:
57 case RSModifierType::ROTATION:
58 SetPropertyUnit(RSPropertyUnit::ANGLE_ROTATION);
59 break;
60 default:
61 SetPropertyUnit(RSPropertyUnit::UNKNOWN);
62 break;
63 }
64 }
65
Marshalling(Parcel & parcel,const std::shared_ptr<RSRenderPropertyBase> & val)66 bool RSRenderPropertyBase::Marshalling(Parcel& parcel, const std::shared_ptr<RSRenderPropertyBase>& val)
67 {
68 if (val == nullptr) {
69 parcel.WriteUint16(static_cast<int16_t>(RSModifierType::INVALID));
70 return true;
71 }
72 RSRenderPropertyType type = val->GetPropertyType();
73 if (!(parcel.WriteInt16(static_cast<int16_t>(type)))) {
74 return false;
75 }
76 RSPropertyUnit unit = val->GetPropertyUnit();
77 if (!(parcel.WriteInt16(static_cast<int16_t>(unit)))) {
78 return false;
79 }
80 switch (type) {
81 case RSRenderPropertyType::PROPERTY_FLOAT: {
82 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<float>>(val);
83 if (property == nullptr) {
84 return false;
85 }
86 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
87 }
88 case RSRenderPropertyType::PROPERTY_COLOR: {
89 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<Color>>(val);
90 if (property == nullptr) {
91 return false;
92 }
93 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
94 }
95 case RSRenderPropertyType::PROPERTY_MATRIX3F: {
96 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<Matrix3f>>(val);
97 if (property == nullptr) {
98 return false;
99 }
100 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
101 }
102 case RSRenderPropertyType::PROPERTY_QUATERNION: {
103 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<Quaternion>>(val);
104 if (property == nullptr) {
105 return false;
106 }
107 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
108 }
109 case RSRenderPropertyType::PROPERTY_FILTER: {
110 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>>(val);
111 if (property == nullptr) {
112 return false;
113 }
114 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
115 }
116 case RSRenderPropertyType::PROPERTY_VECTOR2F: {
117 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<Vector2f>>(val);
118 if (property == nullptr) {
119 return false;
120 }
121 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
122 }
123 case RSRenderPropertyType::PROPERTY_VECTOR4F: {
124 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<Vector4f>>(val);
125 if (property == nullptr) {
126 return false;
127 }
128 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
129 }
130 case RSRenderPropertyType::PROPERTY_VECTOR4_COLOR: {
131 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<Vector4<Color>>>(val);
132 if (property == nullptr) {
133 return false;
134 }
135 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
136 }
137 case RSRenderPropertyType::PROPERTY_RRECT: {
138 auto property = std::static_pointer_cast<RSRenderAnimatableProperty<RRect>>(val);
139 if (property == nullptr) {
140 return false;
141 }
142 return parcel.WriteUint64(property->GetId()) && RSMarshallingHelper::Marshalling(parcel, property->Get());
143 }
144 default: {
145 return false;
146 }
147 }
148 return true;
149 }
150
Unmarshalling(Parcel & parcel,std::shared_ptr<RSRenderPropertyBase> & val)151 bool RSRenderPropertyBase::Unmarshalling(Parcel& parcel, std::shared_ptr<RSRenderPropertyBase>& val)
152 {
153 int16_t typeId = 0;
154 if (!parcel.ReadInt16(typeId)) {
155 return false;
156 }
157 RSRenderPropertyType type = static_cast<RSRenderPropertyType>(typeId);
158 if (type == RSRenderPropertyType::INVALID) {
159 val.reset();
160 return true;
161 }
162 int16_t unitId = 0;
163 if (!parcel.ReadInt16(unitId)) {
164 return false;
165 }
166 RSPropertyUnit unit = static_cast<RSPropertyUnit>(unitId);
167 PropertyId id = 0;
168 if (!parcel.ReadUint64(id)) {
169 return false;
170 }
171 RS_PROFILER_PATCH_NODE_ID(parcel, id);
172 switch (type) {
173 case RSRenderPropertyType::PROPERTY_FLOAT: {
174 float value;
175 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
176 return false;
177 }
178 val.reset(new RSRenderAnimatableProperty<float>(value, id, type, unit));
179 break;
180 }
181 case RSRenderPropertyType::PROPERTY_COLOR: {
182 Color value;
183 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
184 return false;
185 }
186 val.reset(new RSRenderAnimatableProperty<Color>(value, id, type, unit));
187 break;
188 }
189 case RSRenderPropertyType::PROPERTY_MATRIX3F: {
190 Matrix3f value;
191 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
192 return false;
193 }
194 val.reset(new RSRenderAnimatableProperty<Matrix3f>(value, id, type, unit));
195 break;
196 }
197 case RSRenderPropertyType::PROPERTY_QUATERNION: {
198 Quaternion value;
199 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
200 return false;
201 }
202 val.reset(new RSRenderAnimatableProperty<Quaternion>(value, id, type, unit));
203 break;
204 }
205 case RSRenderPropertyType::PROPERTY_FILTER: {
206 std::shared_ptr<RSFilter> value;
207 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
208 return false;
209 }
210 val.reset(new RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>(value, id, type, unit));
211 break;
212 }
213 case RSRenderPropertyType::PROPERTY_VECTOR2F: {
214 Vector2f value;
215 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
216 return false;
217 }
218 val.reset(new RSRenderAnimatableProperty<Vector2f>(value, id, type, unit));
219 break;
220 }
221 case RSRenderPropertyType::PROPERTY_VECTOR4F: {
222 Vector4f value;
223 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
224 return false;
225 }
226 val.reset(new RSRenderAnimatableProperty<Vector4f>(value, id, type, unit));
227 break;
228 }
229 case RSRenderPropertyType::PROPERTY_VECTOR4_COLOR: {
230 Vector4<Color> value;
231 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
232 return false;
233 }
234 val.reset(new RSRenderAnimatableProperty<Vector4<Color>>(value, id, type, unit));
235 break;
236 }
237 case RSRenderPropertyType::PROPERTY_RRECT: {
238 RRect value;
239 if (!RSMarshallingHelper::Unmarshalling(parcel, value)) {
240 return false;
241 }
242 val.reset(new RSRenderAnimatableProperty<RRect>(value, id, type, unit));
243 break;
244 }
245 default: {
246 return false;
247 }
248 }
249 return val != nullptr;
250 }
251
252 template<>
ToFloat() const253 float RSRenderAnimatableProperty<float>::ToFloat() const
254 {
255 return std::fabs(RSRenderProperty<float>::stagingValue_);
256 }
257
258 template<>
ToFloat() const259 float RSRenderAnimatableProperty<Vector4f>::ToFloat() const
260 {
261 return RSRenderProperty<Vector4f>::stagingValue_.GetLength();
262 }
263
264 template<>
ToFloat() const265 float RSRenderAnimatableProperty<Quaternion>::ToFloat() const
266 {
267 return RSRenderProperty<Quaternion>::stagingValue_.GetLength();
268 }
269
270 template<>
ToFloat() const271 float RSRenderAnimatableProperty<Vector2f>::ToFloat() const
272 {
273 return RSRenderProperty<Vector2f>::stagingValue_.GetLength();
274 }
275
operator +=(const std::shared_ptr<RSRenderPropertyBase> & a,const std::shared_ptr<const RSRenderPropertyBase> & b)276 std::shared_ptr<RSRenderPropertyBase> operator+=(
277 const std::shared_ptr<RSRenderPropertyBase>& a, const std::shared_ptr<const RSRenderPropertyBase>& b)
278 {
279 if (a == nullptr) {
280 return {};
281 }
282
283 return a->Add(b);
284 }
285
operator -=(const std::shared_ptr<RSRenderPropertyBase> & a,const std::shared_ptr<const RSRenderPropertyBase> & b)286 std::shared_ptr<RSRenderPropertyBase> operator-=(
287 const std::shared_ptr<RSRenderPropertyBase>& a, const std::shared_ptr<const RSRenderPropertyBase>& b)
288 {
289 if (a == nullptr) {
290 return {};
291 }
292
293 return a->Minus(b);
294 }
295
operator *=(const std::shared_ptr<RSRenderPropertyBase> & value,const float scale)296 std::shared_ptr<RSRenderPropertyBase> operator*=(const std::shared_ptr<RSRenderPropertyBase>& value, const float scale)
297 {
298 if (value == nullptr) {
299 return {};
300 }
301
302 return value->Multiply(scale);
303 }
304
operator +(const std::shared_ptr<const RSRenderPropertyBase> & a,const std::shared_ptr<const RSRenderPropertyBase> & b)305 std::shared_ptr<RSRenderPropertyBase> operator+(
306 const std::shared_ptr<const RSRenderPropertyBase>& a, const std::shared_ptr<const RSRenderPropertyBase>& b)
307 {
308 if (a == nullptr) {
309 return {};
310 }
311
312 return a->Clone()->Add(b);
313 }
314
operator -(const std::shared_ptr<const RSRenderPropertyBase> & a,const std::shared_ptr<const RSRenderPropertyBase> & b)315 std::shared_ptr<RSRenderPropertyBase> operator-(
316 const std::shared_ptr<const RSRenderPropertyBase>& a, const std::shared_ptr<const RSRenderPropertyBase>& b)
317 {
318 if (a == nullptr) {
319 return {};
320 }
321
322 return a->Clone()->Minus(b);
323 }
324
operator *(const std::shared_ptr<const RSRenderPropertyBase> & value,const float scale)325 std::shared_ptr<RSRenderPropertyBase> operator*(
326 const std::shared_ptr<const RSRenderPropertyBase>& value, const float scale)
327 {
328 if (value == nullptr) {
329 return {};
330 }
331
332 return value->Clone()->Multiply(scale);
333 }
334
operator ==(const std::shared_ptr<const RSRenderPropertyBase> & a,const std::shared_ptr<const RSRenderPropertyBase> & b)335 bool operator==(
336 const std::shared_ptr<const RSRenderPropertyBase>& a, const std::shared_ptr<const RSRenderPropertyBase>& b)
337 {
338 if (a == nullptr) {
339 return {};
340 }
341
342 return a->IsEqual(b);
343 }
344
operator !=(const std::shared_ptr<const RSRenderPropertyBase> & a,const std::shared_ptr<const RSRenderPropertyBase> & b)345 bool operator!=(
346 const std::shared_ptr<const RSRenderPropertyBase>& a, const std::shared_ptr<const RSRenderPropertyBase>& b)
347 {
348 if (a == nullptr) {
349 return {};
350 }
351
352 return !a->IsEqual(b);
353 }
354
355 template<>
Dump(std::string & out) const356 void RSRenderProperty<int>::Dump(std::string& out) const
357 {
358 out += "[" + std::to_string(Get()) + "]";
359 }
360
361 template<>
Dump(std::string & out) const362 void RSRenderProperty<float>::Dump(std::string& out) const
363 {
364 std::stringstream ss;
365 ss << "[" << std::fixed << std::setprecision(1) << Get() << "]";
366 out += ss.str();
367 }
368
369 template<>
Dump(std::string & out) const370 void RSRenderProperty<Vector4<uint32_t>>::Dump(std::string& out) const
371 {
372 Vector4 v4 = Get();
373 switch (modifierType_) {
374 case RSModifierType::BORDER_STYLE:
375 case RSModifierType::OUTLINE_STYLE: {
376 out += "[left:" + std::to_string(v4.x_);
377 out += " top:" + std::to_string(v4.y_);
378 out += " right:" + std::to_string(v4.z_);
379 out += " bottom:" + std::to_string(v4.w_) + "]";
380 break;
381 }
382 default: {
383 out += "[x:" + std::to_string(v4.x_) + " y:";
384 out += std::to_string(v4.y_) + " z:";
385 out += std::to_string(v4.z_) + " w:";
386 out += std::to_string(v4.w_) + "]";
387 break;
388 }
389 }
390 }
391
392 template<>
Dump(std::string & out) const393 void RSRenderProperty<Vector4f>::Dump(std::string& out) const
394 {
395 Vector4f v4f = Get();
396 std::stringstream ss;
397 ss << std::fixed << std::setprecision(1);
398 switch (modifierType_) {
399 case RSModifierType::BORDER_WIDTH:
400 case RSModifierType::BORDER_DASH_WIDTH:
401 case RSModifierType::BORDER_DASH_GAP:
402 case RSModifierType::OUTLINE_WIDTH:
403 case RSModifierType::OUTLINE_DASH_WIDTH:
404 case RSModifierType::OUTLINE_DASH_GAP: {
405 ss << "[left:" << v4f.x_ << " top:" << v4f.y_ << " right:" << v4f.z_ << " bottom:" << v4f.w_ << + "]";
406 break;
407 }
408 case RSModifierType::CORNER_RADIUS:
409 case RSModifierType::OUTLINE_RADIUS: {
410 ss << "[topLeft:" << v4f.x_ << " topRight:" << v4f.y_ \
411 << " bottomRight:" << v4f.z_ << " bottomLeft:" << v4f.w_ << + "]";
412 break;
413 }
414 case RSModifierType::BOUNDS: {
415 ss << "[x:" << v4f.x_ << " y:" << v4f.y_ << " width:" << v4f.z_ << " height:" << v4f.w_ << + "]";
416 break;
417 }
418 default: {
419 ss << "[x:" << v4f.x_ << " y:" << v4f.y_ << " z:" << v4f.z_ << " w:" << v4f.w_ << + "]";
420 break;
421 }
422 }
423 out += ss.str();
424 }
425
426 template<>
Dump(std::string & out) const427 void RSRenderProperty<Quaternion>::Dump(std::string& out) const
428 {
429 Quaternion q = Get();
430 std::stringstream ss;
431 ss << std::fixed << std::setprecision(1);
432 ss << "[x:" << q.x_ << " y:" << q.y_ << " z:" << q.z_ << " w:" << q.w_ << + "]";
433 out += ss.str();
434 }
435
436 template<>
Dump(std::string & out) const437 void RSRenderProperty<Vector2f>::Dump(std::string& out) const
438 {
439 Vector2f v2f = Get();
440 std::stringstream ss;
441 ss << std::fixed << std::setprecision(1) << "[x:" << v2f.x_ << " y:" << v2f.y_ << "]";
442 out += ss.str();
443 }
444
445 template<>
Dump(std::string & out) const446 void RSRenderProperty<Matrix3f>::Dump(std::string& out) const
447 {
448 }
449
450 template<>
Dump(std::string & out) const451 void RSRenderProperty<Color>::Dump(std::string& out) const
452 {
453 Get().Dump(out);
454 }
455
456 template<>
Dump(std::string & out) const457 void RSRenderProperty<std::shared_ptr<RSFilter>>::Dump(std::string& out) const
458 {
459 auto filter = Get();
460 out += "[";
461 if (filter != nullptr && filter->IsValid()) {
462 out += filter->GetDescription();
463 }
464 out += "]";
465 }
466
467 template<>
Dump(std::string & out) const468 void RSRenderProperty<Vector4<Color>>::Dump(std::string& out) const
469 {
470 Vector4<Color> v4Color = Get();
471 out += "[left";
472 v4Color.x_.Dump(out);
473 out += " top";
474 v4Color.y_.Dump(out);
475 out += " right";
476 v4Color.z_.Dump(out);
477 out += " bottom";
478 v4Color.w_.Dump(out);
479 out += ']';
480 }
481
482 template<>
Dump(std::string & out) const483 void RSRenderProperty<RRect>::Dump(std::string& out) const
484 {
485 }
486
487 template<>
Dump(std::string & out) const488 void RSRenderProperty<Drawing::DrawCmdListPtr>::Dump(std::string& out) const
489 {
490 auto propertyData = Get();
491 if (propertyData != nullptr) {
492 out += "drawCmdList[";
493 propertyData->Dump(out);
494 out += ']';
495 }
496 }
497
498 template<>
Dump(std::string & out) const499 void RSRenderProperty<ForegroundColorStrategyType>::Dump(std::string& out) const
500 {
501 out += std::to_string(static_cast<int>(Get()));
502 }
503
504 template<>
Dump(std::string & out) const505 void RSRenderProperty<SkMatrix>::Dump(std::string& out) const
506 {
507 Get().dump(out, 0);
508 }
509
510 template<>
Dump(std::string & out) const511 void RSRenderProperty<std::shared_ptr<RSLinearGradientBlurPara>>::Dump(std::string& out) const
512 {
513 auto property = Get();
514 if (property != nullptr) {
515 property->Dump(out);
516 }
517 }
518
519 template<>
Dump(std::string & out) const520 void RSRenderProperty<std::shared_ptr<MotionBlurParam>>::Dump(std::string& out) const
521 {
522 auto property = Get();
523 if (property != nullptr) {
524 property->Dump(out);
525 }
526 }
527
528 template<>
Dump(std::string & out) const529 void RSRenderProperty<std::shared_ptr<RSMagnifierParams>>::Dump(std::string& out) const
530 {
531 auto property = Get();
532 if (property != nullptr) {
533 property->Dump(out);
534 }
535 }
536
537 template<>
Dump(std::string & out) const538 void RSRenderProperty<std::vector<std::shared_ptr<EmitterUpdater>>>::Dump(std::string& out) const
539 {
540 auto property = Get();
541 out += '[';
542 bool found = false;
543 for (auto& eu : property) {
544 if (eu != nullptr) {
545 found = true;
546 out += "emitterUpdater";
547 eu->Dump(out);
548 out += ' ';
549 }
550 }
551 if (found) {
552 out.pop_back();
553 }
554 out += ']';
555 }
556
557 template<>
Dump(std::string & out) const558 void RSRenderProperty<std::shared_ptr<ParticleNoiseFields>>::Dump(std::string& out) const
559 {
560 auto property = Get();
561 if (property != nullptr) {
562 property->Dump(out);
563 }
564 }
565
566 template<>
Dump(std::string & out) const567 void RSRenderProperty<std::shared_ptr<RSMask>>::Dump(std::string& out) const
568 {
569 auto property = Get();
570 if (property != nullptr) {
571 property->Dump(out);
572 }
573 }
574
575 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const576 bool RSRenderAnimatableProperty<float>::IsNearEqual(
577 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
578 {
579 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<float>>(value);
580 if (animatableProperty != nullptr) {
581 return fabs(RSRenderProperty<float>::stagingValue_ - animatableProperty->stagingValue_) <= zeroThreshold;
582 }
583 ROSEN_LOGE("RSRenderAnimatableProperty<float>::IsNearEqual: the value of the comparison is a null pointer!");
584 return true;
585 }
586
587 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const588 bool RSRenderAnimatableProperty<Vector2f>::IsNearEqual(
589 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
590 {
591 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<Vector2f>>(value);
592 if (animatableProperty != nullptr) {
593 return RSRenderProperty<Vector2f>::stagingValue_.IsNearEqual(animatableProperty->Get(), zeroThreshold);
594 }
595 ROSEN_LOGE("RSRenderAnimatableProperty<Vector2f>::IsNearEqual: the value of the comparison is a null pointer!");
596 return true;
597 }
598
599 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const600 bool RSRenderAnimatableProperty<Quaternion>::IsNearEqual(
601 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
602 {
603 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<Quaternion>>(value);
604 if (animatableProperty != nullptr) {
605 return RSRenderProperty<Quaternion>::stagingValue_.IsNearEqual(animatableProperty->Get(), zeroThreshold);
606 }
607 ROSEN_LOGE("RSRenderAnimatableProperty<Quaternion>::IsNearEqual: the value of the comparison is a null pointer!");
608 return true;
609 }
610
611 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const612 bool RSRenderAnimatableProperty<Vector4f>::IsNearEqual(
613 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
614 {
615 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<Vector4f>>(value);
616 if (animatableProperty != nullptr) {
617 return RSRenderProperty<Vector4f>::stagingValue_.IsNearEqual(animatableProperty->Get(), zeroThreshold);
618 }
619 ROSEN_LOGE("RSRenderAnimatableProperty<Vector4f>::IsNearEqual: the value of the comparison is a null pointer!");
620 return true;
621 }
622
623 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const624 bool RSRenderAnimatableProperty<Matrix3f>::IsNearEqual(
625 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
626 {
627 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<Matrix3f>>(value);
628 if (animatableProperty != nullptr) {
629 return RSRenderProperty<Matrix3f>::stagingValue_.IsNearEqual(animatableProperty->Get(), zeroThreshold);
630 }
631 ROSEN_LOGE("RSRenderAnimatableProperty<Matrix3f>::IsNearEqual: the value of the comparison is a null pointer!");
632 return true;
633 }
634
635 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const636 bool RSRenderAnimatableProperty<Color>::IsNearEqual(
637 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
638 {
639 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<Color>>(value);
640 if (animatableProperty != nullptr) {
641 return RSRenderProperty<Color>::stagingValue_.IsNearEqual(
642 animatableProperty->Get(), static_cast<int16_t>(zeroThreshold));
643 }
644 ROSEN_LOGE("RSRenderAnimatableProperty<Color>::IsNearEqual: the value of the comparison is a null pointer!");
645 return true;
646 }
647
648 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const649 bool RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsNearEqual(
650 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
651 {
652 auto animatableProperty =
653 std::static_pointer_cast<const RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>>(value);
654 if (animatableProperty == nullptr) {
655 return true;
656 }
657
658 auto filter = RSRenderProperty<std::shared_ptr<RSFilter>>::stagingValue_;
659 auto otherFilter = animatableProperty->Get();
660 if ((filter != nullptr) && (otherFilter != nullptr)) {
661 return filter->IsNearEqual(otherFilter, zeroThreshold);
662 } else if ((filter == nullptr) && (otherFilter == nullptr)) {
663 ROSEN_LOGE("RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsNearEqual: "
664 "both values compared are null Pointers!");
665 return true;
666 } else if (filter == nullptr) {
667 ROSEN_LOGE(
668 "RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsNearEqual: the staging value is a null pointer!");
669 return otherFilter->IsNearZero(zeroThreshold);
670 } else {
671 ROSEN_LOGE("RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsNearEqual: "
672 "the value of the comparison is a null pointer!");
673 return filter->IsNearZero(zeroThreshold);
674 }
675 }
676
677 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const678 bool RSRenderAnimatableProperty<Vector4<Color>>::IsNearEqual(
679 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
680 {
681 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<Vector4<Color>>>(value);
682 if (animatableProperty != nullptr) {
683 auto thisData = RSRenderProperty<Vector4<Color>>::stagingValue_.data_;
684 auto otherValue = animatableProperty->Get();
685 auto& otherData = otherValue.data_;
686 int16_t threshold = static_cast<int16_t>(zeroThreshold);
687 return thisData[0].IsNearEqual(otherData[0], threshold) && thisData[2].IsNearEqual(otherData[2], threshold) &&
688 thisData[2].IsNearEqual(otherData[2], threshold) && thisData[3].IsNearEqual(otherData[3], threshold);
689 }
690 ROSEN_LOGE(
691 "RSRenderAnimatableProperty<Vector4<Color>>::IsNearEqual: the value of the comparison is a null pointer!");
692 return true;
693 }
694
695 template<>
IsNearEqual(const std::shared_ptr<RSRenderPropertyBase> & value,float zeroThreshold) const696 bool RSRenderAnimatableProperty<RRect>::IsNearEqual(
697 const std::shared_ptr<RSRenderPropertyBase>& value, float zeroThreshold) const
698 {
699 auto animatableProperty = std::static_pointer_cast<const RSRenderAnimatableProperty<RRect>>(value);
700 if (animatableProperty != nullptr) {
701 return RSRenderProperty<RRect>::stagingValue_.IsNearEqual(animatableProperty->Get(), zeroThreshold);
702 }
703 ROSEN_LOGE("RSRenderAnimatableProperty<RRect>::IsNearEqual: the value of the comparison is a null pointer!");
704 return true;
705 }
706
707 template<>
IsEqual(const std::shared_ptr<const RSRenderPropertyBase> & value) const708 bool RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsEqual(
709 const std::shared_ptr<const RSRenderPropertyBase>& value) const
710 {
711 auto animatableProperty =
712 std::static_pointer_cast<const RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>>(value);
713 if (animatableProperty == nullptr) {
714 return true;
715 }
716
717 auto filter = RSRenderProperty<std::shared_ptr<RSFilter>>::stagingValue_;
718 auto otherFilter = animatableProperty->Get();
719 if ((filter != nullptr) && (otherFilter != nullptr)) {
720 return filter->IsEqual(otherFilter);
721 } else if ((filter == nullptr) && (otherFilter == nullptr)) {
722 ROSEN_LOGE("RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsEqual: "
723 "both values compared are null Pointers!");
724 return true;
725 } else if (filter == nullptr) {
726 ROSEN_LOGE(
727 "RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsEqual: the staging value is a null pointer!");
728 return otherFilter->IsEqualZero();
729 } else {
730 ROSEN_LOGE("RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>::IsEqual: "
731 "the value of the comparison is a null pointer!");
732 return filter->IsEqualZero();
733 }
734 }
735
736 template class RSRenderProperty<int>;
737 template class RSRenderProperty<float>;
738 template class RSRenderProperty<Vector4<uint32_t>>;
739 template class RSRenderProperty<Vector4f>;
740 template class RSRenderProperty<Quaternion>;
741 template class RSRenderProperty<Vector2f>;
742 template class RSRenderProperty<Matrix3f>;
743 template class RSRenderProperty<Color>;
744 template class RSRenderProperty<std::shared_ptr<RSFilter>>;
745 template class RSRenderProperty<Vector4<Color>>;
746 template class RSRenderProperty<RRect>;
747 template class RSRenderProperty<Drawing::DrawCmdListPtr>;
748 template class RSRenderProperty<ForegroundColorStrategyType>;
749 template class RSRenderProperty<SkMatrix>;
750 template class RSRenderProperty<std::shared_ptr<RSLinearGradientBlurPara>>;
751 template class RSRenderProperty<std::shared_ptr<MotionBlurParam>>;
752 template class RSRenderProperty<std::shared_ptr<RSMagnifierParams>>;
753 template class RSRenderProperty<std::vector<std::shared_ptr<EmitterUpdater>>>;
754 template class RSRenderProperty<std::shared_ptr<ParticleNoiseFields>>;
755 template class RSRenderProperty<std::shared_ptr<RSMask>>;
756
757 template class RSRenderAnimatableProperty<float>;
758 template class RSRenderAnimatableProperty<Vector4f>;
759 template class RSRenderAnimatableProperty<Quaternion>;
760 template class RSRenderAnimatableProperty<Vector2f>;
761 template class RSRenderAnimatableProperty<Matrix3f>;
762 template class RSRenderAnimatableProperty<Color>;
763 template class RSRenderAnimatableProperty<std::shared_ptr<RSFilter>>;
764 template class RSRenderAnimatableProperty<Vector4<Color>>;
765 template class RSRenderAnimatableProperty<RRect>;
766 } // namespace Rosen
767 } // namespace OHOS
768