FastLED 3.9.15
Loading...
Searching...
No Matches
tile2x2.h
Go to the documentation of this file.
1
2#pragma once
3
4#include <stdint.h>
5
6#include "fl/geometry.h"
7#include "fl/namespace.h"
8#include "fl/pair.h"
9#include "fl/slice.h"
10#include "fl/xymap.h"
11
13struct CRGB;
15
16namespace fl {
17
18class XYMap;
20
22
23 public:
24 static void Rasterize(const Slice<const Tile2x2_u8> &tiles,
25 XYRasterU8Sparse *output);
26
27 Tile2x2_u8() = default;
29 Tile2x2_u8(const Tile2x2_u8 &) = default;
30 Tile2x2_u8 &operator=(const Tile2x2_u8 &) = default;
31 Tile2x2_u8(Tile2x2_u8 &&) = default;
32
33 void scale(uint8_t scale);
34
35 void setOrigin(int16_t x, int16_t y) { mOrigin = vec2<int16_t>(x, y); }
36
37 uint8_t &operator()(int x, int y) { return at(x, y); }
38 uint8_t &at(int x, int y) { return mTile[y][x]; }
39 const uint8_t &at(int x, int y) const { return mTile[y][x]; }
40
41 uint8_t &lower_left() { return at(0, 0); }
42 uint8_t &upper_left() { return at(0, 1); }
43 uint8_t &lower_right() { return at(1, 0); }
44 uint8_t &upper_right() { return at(1, 1); }
45
46 const uint8_t &lower_left() const { return at(0, 0); }
47 const uint8_t &upper_left() const { return at(0, 1); }
48 const uint8_t &lower_right() const { return at(1, 0); }
49 const uint8_t &upper_right() const { return at(1, 1); }
50
51 uint8_t maxValue() const;
52
53 static Tile2x2_u8 MaxTile(const Tile2x2_u8 &a, const Tile2x2_u8 &b);
54
55 vec2<int16_t> origin() const { return mOrigin; }
56
58 rect<int16_t> bounds() const;
59
60 // Draws the subpixel tile to the led array.
61 void draw(const CRGB &color, const XYMap &xymap, CRGB *out) const;
62
63 // Inlined, yet customizable drawing access. This will only send you pixels
64 // that are within the bounds of the XYMap.
65 template <typename XYVisitor>
66 void draw(const XYMap &xymap, XYVisitor &visitor) const {
67 for (uint16_t x = 0; x < 2; ++x) {
68 for (uint16_t y = 0; y < 2; ++y) {
69 uint8_t value = at(x, y);
70 if (value > 0) {
71 int xx = mOrigin.x + x;
72 int yy = mOrigin.y + y;
73 if (xymap.has(xx, yy)) {
74 int index = xymap(xx, yy);
75 visitor.draw(vec2<int16_t>(xx, yy), index, value);
76 }
77 }
78 }
79 }
80 }
81
82 private:
83 uint8_t mTile[2][2] = {};
84 // Subpixels can be rendered outside the viewport so this must be signed.
86};
87
89 // This is a class that is like a Tile2x2_u8 but wraps around the edges.
90 // This is useful for cylinder mapping where the x-coordinate wraps around
91 // the width of the cylinder and the y-coordinate wraps around the height.
92 // This converts a tile2x2 to a wrapped x,y version.
93 public:
94 using Data = fl::pair<vec2i16, uint8_t>; // absolute position, alpha
95
96 Tile2x2_u8_wrap() = default;
97 Tile2x2_u8_wrap(const Tile2x2_u8 &from, uint16_t width);
98 Tile2x2_u8_wrap(const Tile2x2_u8 &from, uint16_t width, uint16_t height);
99
100 // Returns the absolute position and the alpha.
101 Data &at(uint16_t x, uint16_t y);
102 const Data &at(uint16_t x, uint16_t y) const;
103
104 private:
105 Data tile[2][2] = {}; // zero filled.
106};
107
108} // namespace fl
XYMap xymap(WIDTH, HEIGHT, SERPENTINE)
uint32_t x[NUM_LAYERS]
Definition Fire2023.ino:82
uint32_t y[NUM_LAYERS]
Definition Fire2023.ino:83
Data & at(uint16_t x, uint16_t y)
Definition tile2x2.cpp:57
fl::pair< vec2i16, uint8_t > Data
Definition tile2x2.h:94
Tile2x2_u8_wrap()=default
Data tile[2][2]
Definition tile2x2.h:105
void scale(uint8_t scale)
Definition tile2x2.cpp:35
const uint8_t & lower_left() const
Definition tile2x2.h:46
static Tile2x2_u8 MaxTile(const Tile2x2_u8 &a, const Tile2x2_u8 &b)
Definition tile2x2.cpp:94
static void Rasterize(const Slice< const Tile2x2_u8 > &tiles, XYRasterU8Sparse *output)
Definition tile2x2.cpp:25
Tile2x2_u8(const Tile2x2_u8 &)=default
const uint8_t & at(int x, int y) const
Definition tile2x2.h:39
Tile2x2_u8(const vec2< int16_t > &origin)
Definition tile2x2.h:28
uint8_t & operator()(int x, int y)
Definition tile2x2.h:37
uint8_t & lower_right()
Definition tile2x2.h:43
vec2< int16_t > mOrigin
Definition tile2x2.h:85
uint8_t & upper_left()
Definition tile2x2.h:42
rect< int16_t > bounds() const
bounds => [begin_x, end_x) (where end_x is exclusive)
Definition tile2x2.cpp:104
uint8_t & upper_right()
Definition tile2x2.h:44
const uint8_t & upper_left() const
Definition tile2x2.h:47
uint8_t & lower_left()
Definition tile2x2.h:41
void setOrigin(int16_t x, int16_t y)
Definition tile2x2.h:35
uint8_t maxValue() const
Definition tile2x2.cpp:85
void draw(const CRGB &color, const XYMap &xymap, CRGB *out) const
Definition tile2x2.cpp:30
vec2< int16_t > origin() const
Definition tile2x2.h:55
const uint8_t & upper_right() const
Definition tile2x2.h:49
Tile2x2_u8(Tile2x2_u8 &&)=default
Tile2x2_u8 & operator=(const Tile2x2_u8 &)=default
uint8_t mTile[2][2]
Definition tile2x2.h:83
void draw(const XYMap &xymap, XYVisitor &visitor) const
Definition tile2x2.h:66
const uint8_t & lower_right() const
Definition tile2x2.h:48
uint8_t & at(int x, int y)
Definition tile2x2.h:38
Tile2x2_u8()=default
uint16_t scale
Definition funky.cpp:83
#define FASTLED_NAMESPACE_END
Definition namespace.h:23
Implements the FastLED namespace macros.
Pair< Key, Value > pair
Definition pair.h:13
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16
Representation of an RGB pixel (Red, Green, Blue)
Definition crgb.h:55