Files
wrobot/v1.4 摄像头提乒乓球方案/platformio/lib/FastLED/src/fl/raster_sparse.cpp
T

88 lines
2.5 KiB
C++

#include "fl/stdint.h"
#include "fl/draw_visitor.h"
#include "fl/leds.h"
#include "fl/raster_sparse.h"
#include "fl/tile2x2.h"
namespace fl {
void XYRasterU8Sparse::draw(const CRGB &color, const XYMap &xymap, CRGB *out) {
XYDrawComposited visitor(color, xymap, out);
draw(xymap, visitor);
}
void XYRasterU8Sparse::draw(const CRGB &color, Leds *leds) {
draw(color, leds->xymap(), leds->rgb());
}
void XYRasterU8Sparse::drawGradient(const Gradient &gradient,
const XYMap &xymap, CRGB *out) {
XYDrawGradient visitor(gradient, xymap, out);
draw(xymap, visitor);
}
void XYRasterU8Sparse::drawGradient(const Gradient &gradient, Leds *leds) {
drawGradient(gradient, leds->xymap(), leds->rgb());
}
void XYRasterU8Sparse::rasterize(const span<const Tile2x2_u8> &tiles) {
// Tile2x2_u8::Rasterize(tiles, this, mAbsoluteBoundsSet ? &mAbsoluteBounds
// : nullptr);
if (tiles.size() == 0) {
FASTLED_WARN("Rasterize: no tiles");
return;
}
const rect<u16> *optional_bounds =
mAbsoluteBoundsSet ? nullptr : &mAbsoluteBounds;
// Check if the bounds are set.
// draw all now unconditionally.
for (const auto &tile : tiles) {
// Rasterize the tile.
rasterize_internal(tile, optional_bounds);
}
return;
}
void XYRasterU8Sparse::rasterize_internal(const Tile2x2_u8 &tile,
const rect<u16> *optional_bounds) {
const vec2<u16> &origin = tile.origin();
for (int x = 0; x < 2; ++x) {
for (int y = 0; y < 2; ++y) {
u8 value = tile.at(x, y);
if (!value) {
continue;
}
int xx = origin.x + x;
int yy = origin.y + y;
if (optional_bounds && !optional_bounds->contains(xx, yy)) {
continue;
}
write(vec2<u16>(xx, yy), value);
}
}
}
} // namespace fl
// XYRasterSparse_CRGB implementation
void fl::XYRasterSparse_CRGB::draw(const XYMap &xymap, CRGB *out) {
for (const auto &it : mSparseGrid) {
auto pt = it.first;
if (!xymap.has(pt.x, pt.y)) {
continue;
}
u32 index = xymap(pt.x, pt.y);
const CRGB &color = it.second;
// Only draw non-black pixels (since black represents "no data")
if (color.r != 0 || color.g != 0 || color.b != 0) {
out[index] = color;
}
}
}
void fl::XYRasterSparse_CRGB::draw(Leds *leds) {
draw(leds->xymap(), leds->rgb());
}