Files
klubhaus-doorbell/libraries/FastLED/src/fl/xmap.cpp
2026-02-12 00:45:31 -08:00

96 lines
2.2 KiB
C++

#include "fl/xmap.h"
namespace fl {
XMap XMap::constructWithUserFunction(u16 length, XFunction xFunction,
u16 offset) {
XMap out = XMap(length, kFunction);
out.xFunction = xFunction;
out.mOffset = offset;
return out;
}
XMap XMap::constructWithLookUpTable(u16 length,
const u16 *lookUpTable,
u16 offset) {
XMap out = XMap(length, kLookUpTable);
out.mData = lookUpTable;
out.mOffset = offset;
return out;
}
XMap::XMap(u16 length, bool is_reverse, u16 offset) {
type = is_reverse ? kReverse : kLinear;
this->length = length;
this->mOffset = offset;
}
XMap::XMap(const XMap &other) {
type = other.type;
length = other.length;
xFunction = other.xFunction;
mData = other.mData;
mLookUpTable = other.mLookUpTable;
mOffset = other.mOffset;
}
void XMap::convertToLookUpTable() {
if (type == kLookUpTable) {
return;
}
mLookUpTable.reset();
mLookUpTable = fl::make_shared<LUT16>(length);
u16 *dataMutable = mLookUpTable->getDataMutable();
mData = mLookUpTable->getData();
for (u16 x = 0; x < length; x++) {
dataMutable[x] = mapToIndex(x);
}
type = kLookUpTable;
xFunction = nullptr;
}
u16 XMap::mapToIndex(u16 x) const {
u16 index;
switch (type) {
case kLinear:
index = x_linear(x, length);
break;
case kReverse:
index = x_reverse(x, length);
break;
case kFunction:
x = x % length;
index = xFunction(x, length);
break;
case kLookUpTable:
index = mData[x];
break;
default:
return 0;
}
return index + mOffset;
}
u16 XMap::getLength() const { return length; }
XMap::Type XMap::getType() const { return type; }
XMap::XMap(u16 length, Type type)
: length(length), type(type), mOffset(0) {}
XMap &XMap::operator=(const XMap &other) {
if (this != &other) {
type = other.type;
length = other.length;
xFunction = other.xFunction;
mData = other.mData;
mLookUpTable = other.mLookUpTable;
mOffset = other.mOffset;
}
return *this;
}
} // namespace fl