blob: dfb43d8ab07106a90a00b1c3018ab061ecb164b3 [file] [log] [blame]
#include "rive/math/math_types.hpp"
#include "rive/data_bind/converters/data_converter_operation.hpp"
#include "rive/data_bind/data_values/data_value_number.hpp"
using namespace rive;
DataValue* DataConverterOperation::convert(DataValue* input)
{
auto output = new DataValueNumber();
if (input->is<DataValueNumber>())
{
float inputValue = input->as<DataValueNumber>()->value();
float resultValue = value();
switch (op())
{
case ArithmeticOperation::add:
resultValue = inputValue + resultValue;
break;
case ArithmeticOperation::subtract:
resultValue = inputValue - resultValue;
break;
case ArithmeticOperation::multiply:
resultValue = inputValue * resultValue;
break;
case ArithmeticOperation::divide:
resultValue = inputValue / resultValue;
break;
case ArithmeticOperation::modulo:
resultValue = fmodf(inputValue, resultValue);
break;
}
output->value(resultValue);
}
return output;
}
DataValue* DataConverterOperation::reverseConvert(DataValue* input)
{
auto output = new DataValueNumber();
if (input->is<DataValueNumber>())
{
float inputValue = input->as<DataValueNumber>()->value();
float resultValue = value();
switch (op())
{
case ArithmeticOperation::add:
resultValue = inputValue - resultValue;
break;
case ArithmeticOperation::subtract:
resultValue = inputValue + resultValue;
break;
case ArithmeticOperation::multiply:
resultValue = inputValue / resultValue;
break;
case ArithmeticOperation::divide:
resultValue = inputValue * resultValue;
break;
// No reverse operation for modulo
case ArithmeticOperation::modulo:
break;
}
output->value(resultValue);
}
return output;
}