Skip to content

Commit 2e1c71c

Browse files
authored
fix: Revert #8607 and fix FilterOperationBase template instantiation (#8613)
## Summary This PR reverts changes from the #8607 PR and applies a proper fix for missing `FilterOperationBase` template instantiation.
1 parent ba01f97 commit 2e1c71c

File tree

4 files changed

+109
-123
lines changed

4 files changed

+109
-123
lines changed

packages/react-native-reanimated/Common/cpp/reanimated/CSS/interpolation/filters/FilterOperation.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
#include <reanimated/CSS/interpolation/filters/FilterOperation.h>
2+
13
#include <reanimated/CSS/common/filters/FilterOp.h>
24
#include <reanimated/CSS/common/values/CSSAngle.h>
35
#include <reanimated/CSS/common/values/CSSNumber.h>
46
#include <reanimated/CSS/common/values/complex/CSSDropShadow.h>
5-
#include <reanimated/CSS/interpolation/filters/FilterOperation.h>
7+
68
#include <reanimated/CSS/interpolation/filters/operations/blur.h>
79
#include <reanimated/CSS/interpolation/filters/operations/brightness.h>
810
#include <reanimated/CSS/interpolation/filters/operations/contrast.h>
@@ -114,4 +116,34 @@ folly::dynamic FilterOperation::toDynamic() const {
114116
return folly::dynamic::object(getOperationName(), valueToDynamic());
115117
}
116118

119+
// FilterOperationBase implementation
120+
template <FilterOp TOperation, CSSValueDerived TValue>
121+
FilterOperationBase<TOperation, TValue>::FilterOperationBase(TValue value)
122+
: FilterOperation(TOperation), value(std::move(value)) {}
123+
124+
template <FilterOp TOperation, CSSValueDerived TValue>
125+
bool FilterOperationBase<TOperation, TValue>::operator==(const FilterOperation &other) const {
126+
if (type != other.type) {
127+
return false;
128+
}
129+
const auto &otherOperation = static_cast<const FilterOperationBase<TOperation, TValue> &>(other);
130+
return value == otherOperation.value;
131+
}
132+
133+
template <FilterOp TOperation, CSSValueDerived TValue>
134+
folly::dynamic FilterOperationBase<TOperation, TValue>::valueToDynamic() const {
135+
return value.toDynamic();
136+
}
137+
138+
template struct FilterOperationBase<FilterOp::Blur, CSSDouble>;
139+
template struct FilterOperationBase<FilterOp::Brightness, CSSDouble>;
140+
template struct FilterOperationBase<FilterOp::Contrast, CSSDouble>;
141+
template struct FilterOperationBase<FilterOp::DropShadow, CSSDropShadow>;
142+
template struct FilterOperationBase<FilterOp::Grayscale, CSSDouble>;
143+
template struct FilterOperationBase<FilterOp::HueRotate, CSSDouble>;
144+
template struct FilterOperationBase<FilterOp::Invert, CSSDouble>;
145+
template struct FilterOperationBase<FilterOp::Opacity, CSSDouble>;
146+
template struct FilterOperationBase<FilterOp::Saturate, CSSDouble>;
147+
template struct FilterOperationBase<FilterOp::Sepia, CSSDouble>;
148+
117149
} // namespace reanimated::css
Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
#pragma once
22

33
#include <reanimated/CSS/common/filters/FilterOp.h>
4-
#include <reanimated/CSS/common/values/CSSAngle.h>
5-
#include <reanimated/CSS/common/values/CSSNumber.h>
64
#include <reanimated/CSS/common/values/CSSValue.h>
7-
#include <reanimated/CSS/common/values/complex/CSSDropShadow.h>
85

96
#include <jsi/jsi.h>
107
#include <memory>
118
#include <string>
12-
#include <utility>
139
#include <vector>
1410

1511
namespace reanimated::css {
@@ -46,34 +42,4 @@ struct FilterOperationBase : public FilterOperation {
4642
folly::dynamic valueToDynamic() const override;
4743
};
4844

49-
// FilterOperationBase implementation
50-
template <FilterOp TOperation, CSSValueDerived TValue>
51-
FilterOperationBase<TOperation, TValue>::FilterOperationBase(TValue value)
52-
: FilterOperation(TOperation), value(std::move(value)) {}
53-
54-
template <FilterOp TOperation, CSSValueDerived TValue>
55-
bool FilterOperationBase<TOperation, TValue>::operator==(const FilterOperation &other) const {
56-
if (type != other.type) {
57-
return false;
58-
}
59-
const auto &otherOperation = static_cast<const FilterOperationBase<TOperation, TValue> &>(other);
60-
return value == otherOperation.value;
61-
}
62-
63-
template <FilterOp TOperation, CSSValueDerived TValue>
64-
folly::dynamic FilterOperationBase<TOperation, TValue>::valueToDynamic() const {
65-
return value.toDynamic();
66-
}
67-
68-
template struct FilterOperationBase<FilterOp::Blur, CSSDouble>;
69-
template struct FilterOperationBase<FilterOp::Brightness, CSSDouble>;
70-
template struct FilterOperationBase<FilterOp::Contrast, CSSDouble>;
71-
template struct FilterOperationBase<FilterOp::DropShadow, CSSDropShadow>;
72-
template struct FilterOperationBase<FilterOp::Grayscale, CSSDouble>;
73-
template struct FilterOperationBase<FilterOp::HueRotate, CSSAngle>;
74-
template struct FilterOperationBase<FilterOp::Invert, CSSDouble>;
75-
template struct FilterOperationBase<FilterOp::Opacity, CSSDouble>;
76-
template struct FilterOperationBase<FilterOp::Saturate, CSSDouble>;
77-
template struct FilterOperationBase<FilterOp::Sepia, CSSDouble>;
78-
7945
} // namespace reanimated::css

packages/react-native-reanimated/Common/cpp/reanimated/CSS/interpolation/filters/FilterOperationInterpolator.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <reanimated/CSS/interpolation/filters/FilterOperationInterpolator.h>
2+
23
#include <reanimated/CSS/interpolation/filters/operations/blur.h>
34
#include <reanimated/CSS/interpolation/filters/operations/brightness.h>
45
#include <reanimated/CSS/interpolation/filters/operations/contrast.h>
@@ -18,4 +19,78 @@ std::shared_ptr<FilterOperation> FilterInterpolator::resolveOperation(
1819
return operation;
1920
}
2021

22+
// Template implementations
23+
template <typename TOperation>
24+
FilterOperationInterpolator<TOperation>::FilterOperationInterpolator(
25+
const std::shared_ptr<TOperation> &defaultOperation)
26+
: FilterOperationInterpolatorBase<TOperation>(defaultOperation) {}
27+
28+
template <typename TOperation>
29+
std::unique_ptr<FilterOperation> FilterOperationInterpolator<TOperation>::interpolate(
30+
double progress,
31+
const std::shared_ptr<FilterOperation> &from,
32+
const std::shared_ptr<FilterOperation> &to,
33+
const FilterInterpolationContext &context) const {
34+
const auto &fromOp = *std::static_pointer_cast<TOperation>(from);
35+
const auto &toOp = *std::static_pointer_cast<TOperation>(to);
36+
37+
return std::make_unique<TOperation>(fromOp.value.interpolate(progress, toOp.value));
38+
}
39+
40+
template <ResolvableFilterOp TOperation>
41+
FilterOperationInterpolator<TOperation>::FilterOperationInterpolator(
42+
const std::shared_ptr<TOperation> &defaultOperation,
43+
ResolvableValueInterpolatorConfig config)
44+
: FilterOperationInterpolatorBase<TOperation>(defaultOperation), config_(std::move(config)) {}
45+
46+
template <ResolvableFilterOp TOperation>
47+
std::unique_ptr<FilterOperation> FilterOperationInterpolator<TOperation>::interpolate(
48+
double progress,
49+
const std::shared_ptr<FilterOperation> &from,
50+
const std::shared_ptr<FilterOperation> &to,
51+
const FilterInterpolationContext &context) const {
52+
const auto &fromOp = *std::static_pointer_cast<TOperation>(from);
53+
const auto &toOp = *std::static_pointer_cast<TOperation>(to);
54+
55+
return std::make_unique<TOperation>(
56+
fromOp.value.interpolate(progress, toOp.value, getResolvableValueContext(context)));
57+
}
58+
59+
template <ResolvableFilterOp TOperation>
60+
std::shared_ptr<FilterOperation> FilterOperationInterpolator<TOperation>::resolveOperation(
61+
const std::shared_ptr<FilterOperation> &operation,
62+
const FilterInterpolationContext &context) const {
63+
const auto &resolvableOp = std::static_pointer_cast<TOperation>(operation);
64+
const auto &resolved = resolvableOp->value.resolve(getResolvableValueContext(context));
65+
66+
if (!resolved.has_value()) {
67+
throw std::invalid_argument(
68+
"[Reanimated] Cannot resolve resolvable operation: " + operation->getOperationName() +
69+
" for node with tag: " + std::to_string(context.node->getTag()));
70+
}
71+
72+
return std::make_shared<TOperation>(resolved.value());
73+
}
74+
75+
template <ResolvableFilterOp TOperation>
76+
ResolvableValueInterpolationContext FilterOperationInterpolator<TOperation>::getResolvableValueContext(
77+
const FilterInterpolationContext &context) const {
78+
return ResolvableValueInterpolationContext{
79+
.node = context.node,
80+
.viewStylesRepository = context.viewStylesRepository,
81+
.relativeProperty = config_.relativeProperty,
82+
.relativeTo = config_.relativeTo};
83+
}
84+
85+
template class FilterOperationInterpolator<BlurOperation>;
86+
template class FilterOperationInterpolator<BrightnessOperation>;
87+
template class FilterOperationInterpolator<ContrastOperation>;
88+
template class FilterOperationInterpolator<DropShadowOperation>;
89+
template class FilterOperationInterpolator<GrayscaleOperation>;
90+
template class FilterOperationInterpolator<HueRotateOperation>;
91+
template class FilterOperationInterpolator<InvertOperation>;
92+
template class FilterOperationInterpolator<OpacityOperation>;
93+
template class FilterOperationInterpolator<SaturateOperation>;
94+
template class FilterOperationInterpolator<SepiaOperation>;
95+
2196
} // namespace reanimated::css
Lines changed: 1 addition & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,8 @@
11
#pragma once
22

33
#include <reanimated/CSS/common/filters/FilterOp.h>
4-
#include <reanimated/CSS/common/values/CSSAngle.h>
5-
#include <reanimated/CSS/common/values/CSSNumber.h>
6-
#include <reanimated/CSS/common/values/complex/CSSDropShadow.h>
74
#include <reanimated/CSS/interpolation/configs.h>
85
#include <reanimated/CSS/interpolation/filters/FilterOperation.h>
9-
#include <reanimated/CSS/interpolation/filters/operations/blur.h>
10-
#include <reanimated/CSS/interpolation/filters/operations/brightness.h>
11-
#include <reanimated/CSS/interpolation/filters/operations/contrast.h>
12-
#include <reanimated/CSS/interpolation/filters/operations/dropShadow.h>
13-
#include <reanimated/CSS/interpolation/filters/operations/grayscale.h>
14-
#include <reanimated/CSS/interpolation/filters/operations/hueRotate.h>
15-
#include <reanimated/CSS/interpolation/filters/operations/invert.h>
16-
#include <reanimated/CSS/interpolation/filters/operations/opacity.h>
17-
#include <reanimated/CSS/interpolation/filters/operations/saturate.h>
18-
#include <reanimated/CSS/interpolation/filters/operations/sepia.h>
196

207
#include <memory>
218
#include <unordered_map>
@@ -60,7 +47,7 @@ template <typename TOperation>
6047
class FilterOperationInterpolatorBase : public FilterInterpolator {
6148
public:
6249
explicit FilterOperationInterpolatorBase(std::shared_ptr<TOperation> defaultOperation)
63-
: defaultOperation_(std::move(defaultOperation)) {}
50+
: defaultOperation_(defaultOperation) {}
6451

6552
std::shared_ptr<FilterOperation> getDefaultOperation() const override {
6653
return defaultOperation_;
@@ -107,78 +94,4 @@ class FilterOperationInterpolator<TOperation> : public FilterOperationInterpolat
10794
ResolvableValueInterpolationContext getResolvableValueContext(const FilterInterpolationContext &context) const;
10895
};
10996

110-
// Template implementations
111-
template <typename TOperation>
112-
FilterOperationInterpolator<TOperation>::FilterOperationInterpolator(
113-
const std::shared_ptr<TOperation> &defaultOperation)
114-
: FilterOperationInterpolatorBase<TOperation>(defaultOperation) {}
115-
116-
template <typename TOperation>
117-
std::unique_ptr<FilterOperation> FilterOperationInterpolator<TOperation>::interpolate(
118-
double progress,
119-
const std::shared_ptr<FilterOperation> &from,
120-
const std::shared_ptr<FilterOperation> &to,
121-
const FilterInterpolationContext &context) const {
122-
const auto &fromOp = *std::static_pointer_cast<TOperation>(from);
123-
const auto &toOp = *std::static_pointer_cast<TOperation>(to);
124-
125-
return std::make_unique<TOperation>(fromOp.value.interpolate(progress, toOp.value));
126-
}
127-
128-
template <ResolvableFilterOp TOperation>
129-
FilterOperationInterpolator<TOperation>::FilterOperationInterpolator(
130-
const std::shared_ptr<TOperation> &defaultOperation,
131-
ResolvableValueInterpolatorConfig config)
132-
: FilterOperationInterpolatorBase<TOperation>(defaultOperation), config_(std::move(config)) {}
133-
134-
template <ResolvableFilterOp TOperation>
135-
std::unique_ptr<FilterOperation> FilterOperationInterpolator<TOperation>::interpolate(
136-
double progress,
137-
const std::shared_ptr<FilterOperation> &from,
138-
const std::shared_ptr<FilterOperation> &to,
139-
const FilterInterpolationContext &context) const {
140-
const auto &fromOp = *std::static_pointer_cast<TOperation>(from);
141-
const auto &toOp = *std::static_pointer_cast<TOperation>(to);
142-
143-
return std::make_unique<TOperation>(
144-
fromOp.value.interpolate(progress, toOp.value, getResolvableValueContext(context)));
145-
}
146-
147-
template <ResolvableFilterOp TOperation>
148-
std::shared_ptr<FilterOperation> FilterOperationInterpolator<TOperation>::resolveOperation(
149-
const std::shared_ptr<FilterOperation> &operation,
150-
const FilterInterpolationContext &context) const {
151-
const auto &resolvableOp = std::static_pointer_cast<TOperation>(operation);
152-
const auto &resolved = resolvableOp->value.resolve(getResolvableValueContext(context));
153-
154-
if (!resolved.has_value()) {
155-
throw std::invalid_argument(
156-
"[Reanimated] Cannot resolve resolvable operation: " + operation->getOperationName() +
157-
" for node with tag: " + std::to_string(context.node->getTag()));
158-
}
159-
160-
return std::make_shared<TOperation>(resolved.value());
161-
}
162-
163-
template <ResolvableFilterOp TOperation>
164-
ResolvableValueInterpolationContext FilterOperationInterpolator<TOperation>::getResolvableValueContext(
165-
const FilterInterpolationContext &context) const {
166-
return ResolvableValueInterpolationContext{
167-
.node = context.node,
168-
.viewStylesRepository = context.viewStylesRepository,
169-
.relativeProperty = config_.relativeProperty,
170-
.relativeTo = config_.relativeTo};
171-
}
172-
173-
template class FilterOperationInterpolator<BlurOperation>;
174-
template class FilterOperationInterpolator<BrightnessOperation>;
175-
template class FilterOperationInterpolator<ContrastOperation>;
176-
template class FilterOperationInterpolator<DropShadowOperation>;
177-
template class FilterOperationInterpolator<GrayscaleOperation>;
178-
template class FilterOperationInterpolator<HueRotateOperation>;
179-
template class FilterOperationInterpolator<InvertOperation>;
180-
template class FilterOperationInterpolator<OpacityOperation>;
181-
template class FilterOperationInterpolator<SaturateOperation>;
182-
template class FilterOperationInterpolator<SepiaOperation>;
183-
18497
} // namespace reanimated::css

0 commit comments

Comments
 (0)