1*753557f6STomasz Sapeta #include "Mapper.h"
2*753557f6STomasz Sapeta #include "MutableValue.h"
3*753557f6STomasz Sapeta #include "SharedParent.h"
4*753557f6STomasz Sapeta
5*753557f6STomasz Sapeta namespace ABI47_0_0reanimated {
6*753557f6STomasz Sapeta
Mapper(NativeReanimatedModule * module,unsigned long id,std::shared_ptr<jsi::Function> mapper,std::vector<std::shared_ptr<MutableValue>> inputs,std::vector<std::shared_ptr<MutableValue>> outputs)7*753557f6STomasz Sapeta Mapper::Mapper(
8*753557f6STomasz Sapeta NativeReanimatedModule *module,
9*753557f6STomasz Sapeta unsigned long id,
10*753557f6STomasz Sapeta std::shared_ptr<jsi::Function> mapper,
11*753557f6STomasz Sapeta std::vector<std::shared_ptr<MutableValue>> inputs,
12*753557f6STomasz Sapeta std::vector<std::shared_ptr<MutableValue>> outputs)
13*753557f6STomasz Sapeta : id(id), module(module), mapper(mapper), inputs(inputs), outputs(outputs) {
14*753557f6STomasz Sapeta auto markDirty = [this, module]() {
15*753557f6STomasz Sapeta this->dirty = true;
16*753557f6STomasz Sapeta module->maybeRequestRender();
17*753557f6STomasz Sapeta };
18*753557f6STomasz Sapeta for (auto input : inputs) {
19*753557f6STomasz Sapeta input->addListener(id, markDirty);
20*753557f6STomasz Sapeta }
21*753557f6STomasz Sapeta }
22*753557f6STomasz Sapeta
execute(jsi::Runtime & rt)23*753557f6STomasz Sapeta void Mapper::execute(jsi::Runtime &rt) {
24*753557f6STomasz Sapeta dirty = false;
25*753557f6STomasz Sapeta if (optimalizationLvl == 0) {
26*753557f6STomasz Sapeta mapper->callWithThis(rt, *mapper); // call styleUpdater
27*753557f6STomasz Sapeta } else {
28*753557f6STomasz Sapeta jsi::Object newStyle = userUpdater->call(rt).asObject(rt);
29*753557f6STomasz Sapeta auto jsViewDescriptorArray = viewDescriptors->getValue(rt)
30*753557f6STomasz Sapeta .getObject(rt)
31*753557f6STomasz Sapeta .getProperty(rt, "value")
32*753557f6STomasz Sapeta .asObject(rt)
33*753557f6STomasz Sapeta .getArray(rt);
34*753557f6STomasz Sapeta for (int i = 0; i < jsViewDescriptorArray.length(rt); ++i) {
35*753557f6STomasz Sapeta auto jsViewDescriptor =
36*753557f6STomasz Sapeta jsViewDescriptorArray.getValueAtIndex(rt, i).getObject(rt);
37*753557f6STomasz Sapeta (*updateProps)(
38*753557f6STomasz Sapeta rt,
39*753557f6STomasz Sapeta static_cast<int>(jsViewDescriptor.getProperty(rt, "tag").asNumber()),
40*753557f6STomasz Sapeta jsViewDescriptor.getProperty(rt, "name"),
41*753557f6STomasz Sapeta newStyle);
42*753557f6STomasz Sapeta }
43*753557f6STomasz Sapeta }
44*753557f6STomasz Sapeta }
45*753557f6STomasz Sapeta
enableFastMode(const int optimalizationLvl,const std::shared_ptr<ShareableValue> & updater,const std::shared_ptr<ShareableValue> & jsViewDescriptors)46*753557f6STomasz Sapeta void Mapper::enableFastMode(
47*753557f6STomasz Sapeta const int optimalizationLvl,
48*753557f6STomasz Sapeta const std::shared_ptr<ShareableValue> &updater,
49*753557f6STomasz Sapeta const std::shared_ptr<ShareableValue> &jsViewDescriptors) {
50*753557f6STomasz Sapeta if (optimalizationLvl == 0) {
51*753557f6STomasz Sapeta return;
52*753557f6STomasz Sapeta }
53*753557f6STomasz Sapeta viewDescriptors = jsViewDescriptors;
54*753557f6STomasz Sapeta this->optimalizationLvl = optimalizationLvl;
55*753557f6STomasz Sapeta updateProps = &module->updaterFunction;
56*753557f6STomasz Sapeta jsi::Runtime *rt = module->runtime.get();
57*753557f6STomasz Sapeta userUpdater = std::make_shared<jsi::Function>(
58*753557f6STomasz Sapeta updater->getValue(*rt).asObject(*rt).asFunction(*rt));
59*753557f6STomasz Sapeta }
60*753557f6STomasz Sapeta
~Mapper()61*753557f6STomasz Sapeta Mapper::~Mapper() {
62*753557f6STomasz Sapeta for (auto input : inputs) {
63*753557f6STomasz Sapeta input->removeListener(id);
64*753557f6STomasz Sapeta }
65*753557f6STomasz Sapeta }
66*753557f6STomasz Sapeta
67*753557f6STomasz Sapeta } // namespace reanimated
68