forked from FastLED/FastLED
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpixel_iterator.h
More file actions
108 lines (91 loc) · 4.32 KB
/
pixel_iterator.h
File metadata and controls
108 lines (91 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#pragma once
#include "namespace.h"
#include "rgbw.h"
#include <stddef.h>
#include <stdint.h>
#include <string.h>
FASTLED_NAMESPACE_BEGIN
template<typename PixelControllerT>
struct PixelControllerVtable {
static void loadAndScaleRGBW(void* pixel_controller, Rgbw rgbw, uint8_t* b0_out, uint8_t* b1_out, uint8_t* b2_out, uint8_t* b3_out) {
PixelControllerT* pc = static_cast<PixelControllerT*>(pixel_controller);
pc->loadAndScaleRGBW(rgbw, b0_out, b1_out, b2_out, b3_out);
}
static void loadAndScaleRGB(void* pixel_controller, uint8_t* r_out, uint8_t* g_out, uint8_t* b_out) {
PixelControllerT* pc = static_cast<PixelControllerT*>(pixel_controller);
pc->loadAndScaleRGB(r_out, g_out, b_out);
}
static void loadAndScale_APA102_HD(void* pixel_controller, uint8_t* b0_out, uint8_t* b1_out, uint8_t* b2_out, uint8_t* brightness_out) {
PixelControllerT* pc = static_cast<PixelControllerT*>(pixel_controller);
pc->loadAndScale_APA102_HD(b0_out, b1_out, b2_out, brightness_out);
}
static void stepDithering(void* pixel_controller) {
PixelControllerT* pc = static_cast<PixelControllerT*>(pixel_controller);
pc->stepDithering();
}
static void advanceData(void* pixel_controller) {
PixelControllerT* pc = static_cast<PixelControllerT*>(pixel_controller);
pc->advanceData();
}
static int size(void* pixel_controller) {
PixelControllerT* pc = static_cast<PixelControllerT*>(pixel_controller);
return pc->size();
}
static bool has(void* pixel_controller, int n) {
PixelControllerT* pc = static_cast<PixelControllerT*>(pixel_controller);
return pc->has(n);
}
};
typedef void (*loadAndScaleRGBWFunction)(void* pixel_controller, Rgbw rgbw, uint8_t* b0_out, uint8_t* b1_out, uint8_t* b2_out, uint8_t* b3_out);
typedef void (*loadAndScaleRGBFunction)(void* pixel_controller, uint8_t* r_out, uint8_t* g_out, uint8_t* b_out);
typedef void (*loadAndScale_APA102_HDFunction)(void* pixel_controller, uint8_t* b0_out, uint8_t* b1_out, uint8_t* b2_out, uint8_t* brightness_out);
typedef void (*stepDitheringFunction)(void* pixel_controller);
typedef void (*advanceDataFunction)(void* pixel_controller);
typedef int (*sizeFunction)(void* pixel_controller);
typedef bool (*hasFunction)(void* pixel_controller, int n);
// PixelIterator is turns a PixelController<> into a concrete object that can be used to iterate
// over pixels and transform them into driver data. See PixelController<>::as_iterator() for how
// to create a PixelIterator.
class PixelIterator {
public:
template<typename PixelControllerT>
PixelIterator(PixelControllerT* pc, Rgbw rgbw)
: mPixelController(pc), mRgbw(rgbw) {
// manually build up a vtable.
typedef PixelControllerVtable<PixelControllerT> Vtable;
mLoadAndScaleRGBW = &Vtable::loadAndScaleRGBW;
mLoadAndScaleRGB = &Vtable::loadAndScaleRGB;
mLoadAndScale_APA102_HD = &Vtable::loadAndScale_APA102_HD;
mStepDithering = &Vtable::stepDithering;
mAdvanceData = &Vtable::advanceData;
mSize = &Vtable::size;
mHas = &Vtable::has;
}
bool has(int n) { return mHas(mPixelController, n); }
void loadAndScaleRGBW(uint8_t *b0_out, uint8_t *b1_out, uint8_t *b2_out, uint8_t *w_out) {
mLoadAndScaleRGBW(mPixelController, mRgbw, b0_out, b1_out, b2_out, w_out);
}
void loadAndScaleRGB(uint8_t *r_out, uint8_t *g_out, uint8_t *b_out) {
mLoadAndScaleRGB(mPixelController, r_out, g_out, b_out);
}
void loadAndScale_APA102_HD(uint8_t *b0_out, uint8_t *b1_out, uint8_t *b2_out, uint8_t *brightness_out) {
mLoadAndScale_APA102_HD(mPixelController, b0_out, b1_out, b2_out, brightness_out);
}
void stepDithering() { mStepDithering(mPixelController); }
void advanceData() { mAdvanceData(mPixelController); }
int size() { return mSize(mPixelController); }
void set_rgbw(Rgbw rgbw) { mRgbw = rgbw; }
Rgbw get_rgbw() const { return mRgbw; }
private:
// vtable emulation
void* mPixelController = nullptr;
Rgbw mRgbw;
loadAndScaleRGBWFunction mLoadAndScaleRGBW = nullptr;
loadAndScaleRGBFunction mLoadAndScaleRGB = nullptr;
loadAndScale_APA102_HDFunction mLoadAndScale_APA102_HD = nullptr;
stepDitheringFunction mStepDithering = nullptr;
advanceDataFunction mAdvanceData = nullptr;
sizeFunction mSize = nullptr;
hasFunction mHas = nullptr;
};
FASTLED_NAMESPACE_END