@@ -72,88 +72,70 @@ namespace lgfx
72
72
// ----------------------------------------------------------------------------
73
73
74
74
static constexpr int8_t Bayer[16 ] = {-30 , 2 , -22 , 10 , 18 , -14 , 26 , -6 , -18 , 14 , -26 , 6 , 30 , -2 , 22 , -10 };
75
+ // static constexpr int8_t Bayer[16] = { 0, };
75
76
76
77
#define LUT_MAKE (d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,da,db,dc,dd,de,df ) (uint32_t )((d0<< 0 )|(d1<< 2 )|(d2<< 4 )|(d3<< 6 )|(d4<< 8 )|(d5<<10 )|(d6<<12 )|(d7<<14 )|(d8<<16 )|(d9<<18 )|(da<<20 )|(db<<22 )|(dc<<24 )|(dd<<26 )|(de<<28 )|(df<<30 ))
77
78
78
79
// LUTの横軸は色の濃さ。左端が 黒、右端が白の16段階のグレースケール。
79
80
// LUTの縦軸は時間軸。上から順に下に向かって処理が進んでいく。
80
- // 値の意味は 0 == neutral / 1 == to black / 2 == to white / 3 == no operation
81
+ // 値の意味は 0 == no operation / 1 == to black / 2 == to white / 3 == end of data
81
82
static constexpr const uint32_t lut_quality[] = {
82
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
83
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
84
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
85
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
86
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
87
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
88
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
89
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
90
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
91
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
92
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
93
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
94
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
95
- LUT_MAKE (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
96
- LUT_MAKE (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
97
- LUT_MAKE (0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
98
- LUT_MAKE (0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 ),
99
- LUT_MAKE (0 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 1 ),
100
- LUT_MAKE (2 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 1 ),
101
- LUT_MAKE (2 , 2 , 2 , 2 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 1 , 1 ),
102
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 0 , 0 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 1 , 1 ),
103
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 0 , 1 , 0 , 1 , 1 , 0 , 0 , 1 , 0 , 1 , 1 ),
104
- LUT_MAKE (0 , 2 , 2 , 2 , 2 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1 ),
105
- LUT_MAKE (0 , 2 , 2 , 2 , 2 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1 ),
106
- LUT_MAKE (1 , 1 , 1 , 2 , 2 , 2 , 2 , 0 , 2 , 0 , 0 , 0 , 2 , 2 , 2 , 2 ),
107
- LUT_MAKE (1 , 1 , 1 , 1 , 0 , 2 , 2 , 0 , 2 , 0 , 2 , 0 , 2 , 2 , 2 , 2 ),
108
- LUT_MAKE (1 , 1 , 1 , 1 , 0 , 2 , 2 , 0 , 2 , 0 , 2 , 0 , 2 , 2 , 2 , 2 ),
109
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 0 , 2 , 0 , 1 , 2 , 2 , 2 ),
110
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 0 , 1 , 2 , 2 , 2 ),
111
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 0 , 2 , 2 , 2 , 2 ),
112
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 0 , 2 , 2 , 2 , 2 ),
113
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 ),
114
- LUT_MAKE (1 , 1 , 1 , 0 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 ),
115
- LUT_MAKE (1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
116
- LUT_MAKE (1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
117
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 ),
118
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 2 , 2 , 2 ),
119
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 2 ),
120
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 2 , 0 ),
83
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
84
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
85
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
86
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
87
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
88
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
89
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
90
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
91
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
92
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
93
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
94
+ LUT_MAKE (1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
95
+ LUT_MAKE (1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
96
+ LUT_MAKE (1 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
97
+ LUT_MAKE (1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 ),
98
+ LUT_MAKE (1 , 1 , 2 , 1 , 1 , 2 , 2 , 2 , 1 , 2 , 1 , 1 , 2 , 2 , 2 , 2 ),
99
+ LUT_MAKE (1 , 1 , 1 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
100
+ LUT_MAKE (1 , 1 , 2 , 1 , 1 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 ),
101
+ LUT_MAKE (1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 2 , 2 , 2 , 2 ),
102
+ LUT_MAKE (1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 2 , 1 , 1 , 2 , 2 ),
103
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 2 , 2 , 2 , 2 , 2 , 2 ),
104
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 ),
105
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 2 , 2 , 2 , 0 ),
121
106
LUT_MAKE (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
122
107
LUT_MAKE (3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ),
123
108
};
124
109
125
110
static constexpr const uint32_t lut_text[] = {
126
- LUT_MAKE (0 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
127
- LUT_MAKE (2 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
128
- LUT_MAKE (2 , 2 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
129
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
130
- LUT_MAKE (2 , 2 , 2 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
131
- LUT_MAKE (0 , 2 , 2 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
132
- LUT_MAKE (0 , 2 , 2 , 2 , 2 , 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1 ),
133
- LUT_MAKE (1 , 1 , 1 , 2 , 2 , 2 , 2 , 0 , 2 , 0 , 0 , 0 , 2 , 2 , 2 , 2 ),
134
- LUT_MAKE (1 , 1 , 1 , 1 , 0 , 2 , 2 , 0 , 2 , 0 , 2 , 0 , 2 , 2 , 2 , 2 ),
135
- LUT_MAKE (1 , 1 , 1 , 1 , 0 , 2 , 2 , 0 , 2 , 0 , 2 , 0 , 2 , 2 , 2 , 2 ),
136
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 0 , 2 , 0 , 1 , 2 , 2 , 2 ),
137
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 0 , 1 , 2 , 2 , 2 ),
138
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 0 , 2 , 2 , 2 , 2 ),
139
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 0 , 2 , 2 , 2 , 2 ),
140
- LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 ),
141
- LUT_MAKE (1 , 1 , 1 , 0 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 ),
142
- LUT_MAKE (1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
143
- LUT_MAKE (1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
144
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 ),
145
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 2 , 2 , 2 ),
146
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 1 , 2 ),
147
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 2 , 0 ),
111
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
112
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
113
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
114
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ),
115
+ LUT_MAKE (2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
116
+ LUT_MAKE (1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
117
+ LUT_MAKE (1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
118
+ LUT_MAKE (1 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
119
+ LUT_MAKE (1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 ),
120
+ LUT_MAKE (1 , 1 , 2 , 1 , 1 , 2 , 2 , 2 , 1 , 2 , 1 , 1 , 2 , 2 , 2 , 2 ),
121
+ LUT_MAKE (1 , 1 , 1 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ),
122
+ LUT_MAKE (1 , 1 , 2 , 1 , 1 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 ),
123
+ LUT_MAKE (1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 1 , 2 , 2 , 2 , 2 ),
124
+ LUT_MAKE (1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 2 , 1 , 1 , 2 , 2 ),
125
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 2 , 2 , 2 , 2 , 2 , 2 ),
126
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 ),
127
+ LUT_MAKE (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 2 , 2 , 2 , 0 ),
148
128
LUT_MAKE (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ),
149
129
LUT_MAKE (3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ),
150
130
};
151
131
152
132
static constexpr const uint32_t lut_fast[] = {
153
- LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
154
- LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
155
133
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
156
134
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
135
+ LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
136
+ LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
137
+ LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
138
+ LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
157
139
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
158
140
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
159
141
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
@@ -167,8 +149,8 @@ namespace lgfx
167
149
};
168
150
169
151
static constexpr const uint32_t lut_fastest[] = {
170
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
171
- LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
152
+ LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
153
+ LUT_MAKE (2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ),
172
154
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
173
155
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
174
156
LUT_MAKE (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ),
@@ -298,7 +280,7 @@ namespace lgfx
298
280
}
299
281
}
300
282
301
- _update_queue_handle = xQueueCreate (16 , sizeof (update_data_t ));
283
+ _update_queue_handle = xQueueCreate (4 , sizeof (update_data_t ));
302
284
auto task_priority = _config_detail.task_priority ;
303
285
auto task_pinned_core = _config_detail.task_pinned_core ;
304
286
if (task_pinned_core >= portNUM_PROCESSORS)
@@ -321,11 +303,19 @@ namespace lgfx
321
303
322
304
void Panel_EPD::waitDisplay (void )
323
305
{
324
- while (_display_busy) {
325
- vTaskDelay (1 );
326
- }
306
+ while (_display_busy) { vTaskDelay (1 ); }
327
307
}
328
308
309
+ bool Panel_EPD::displayBusy (void )
310
+ {
311
+ // キュー _update_queue_handle に余裕があるか調べる
312
+ if (_update_queue_handle && uxQueueSpacesAvailable (_update_queue_handle) == 0 ) {
313
+ return true ;
314
+ }
315
+ return false ;
316
+ };
317
+
318
+
329
319
void Panel_EPD::setInvert (bool invert)
330
320
{
331
321
// unimplemented
@@ -531,8 +521,10 @@ namespace lgfx
531
521
upd.mode = _epd_mode;
532
522
533
523
cacheWriteBack (&_buf[y * _cfg.memory_width >> 1 ], h * _cfg.memory_width >> 1 );
524
+ vTaskDelay (1 );
534
525
bool res = xQueueSend (_update_queue_handle, &upd, 128 / portTICK_PERIOD_MS) == pdTRUE;
535
526
vTaskDelay (1 );
527
+ // printf("\nres: %d, xs: %d, xe: %d, ys: %d, ye: %d\n", res, xs, xe, ys, ye);
536
528
if (res)
537
529
{
538
530
_range_mod.top = INT16_MAX;
@@ -555,17 +547,19 @@ namespace lgfx
555
547
556
548
bus->powerControl (true );
557
549
558
- uint32_t nodata_counter = 0 ;
550
+ uint32_t remain = 0 ;
559
551
560
552
for (;;) {
561
- me->_display_busy = nodata_counter;
562
- TickType_t wait_tick = nodata_counter ? 0 : portMAX_DELAY;
553
+ vTaskDelay (1 );
554
+ me->_display_busy = (remain != 0 );
555
+ TickType_t wait_tick = remain ? 0 : portMAX_DELAY;
563
556
if (xQueueReceive (me->_update_queue_handle , &new_data, wait_tick)) {
564
557
me->_display_busy = true ;
558
+ uint32_t retry = 4 ;
565
559
do {
566
560
auto lut_remain = me->_lut_remain_table [new_data.mode ];
567
- if (nodata_counter < lut_remain) {
568
- nodata_counter = lut_remain;
561
+ if (remain < lut_remain) {
562
+ remain = lut_remain;
569
563
}
570
564
// 範囲内のピクセルをすべて操作し変化分を反映する
571
565
size_t idx = (new_data.x + new_data.y * data_len) >> 1 ;
@@ -574,34 +568,38 @@ namespace lgfx
574
568
size_t h = new_data.h ;
575
569
size_t w = (((new_data.x & 1 ) + new_data.w ) >> 1 ) + 1 ;
576
570
uint_fast16_t lut_offset = me->_lut_offset_table [new_data.mode ] << 8 ;
577
- bool force = new_data.mode == epd_mode_t ::epd_quality || new_data.mode == epd_mode_t ::epd_text;
571
+ uint_fast16_t lut_last = lut_offset + ((me->_lut_remain_table [new_data.mode ]) << 8 );
572
+ if (new_data.mode != epd_mode_t ::epd_fastest) { lut_last -= 256 ; }
573
+ // printf("\n new_data: x:%d y:%d w:%d h:%d \n", new_data.x, new_data.y, new_data.w, new_data.h);
578
574
do {
579
- auto s = src;
580
- auto d = dst;
575
+ auto s = src - 1 ;
576
+ auto d = dst - 1 ;
581
577
src += data_len >> 1 ;
582
578
dst += data_len >> 1 ;
583
- for (int i = 0 ; i < w; ++i) {
584
- auto dval = *d;
585
- auto sval = *s;
586
- if (force || (dval & 0xFF ) != sval)
587
- {
588
- *d = sval + lut_offset;
579
+ {
580
+ for (int i = 0 ; i < w; ++i) {
581
+ auto dval = d[1 ];
582
+ auto sval = s[1 ];
583
+ d++;
584
+ s++;
585
+ if ((dval >= lut_last) || (dval < lut_offset) || ((dval & 0xFF ) != sval))
586
+ {
587
+ *d = sval + lut_offset;
588
+ }
589
589
}
590
- s++;
591
- d++;
592
590
}
593
591
} while (--h);
594
- // printf("\n new_data: x:%d y:%d w:%d h:%d \n", new_data.x, new_data.y, new_data.w, new_data.h);
592
+ if (--retry == 0 ) {
593
+ break ;
594
+ }
595
595
} while (xQueueReceive (me->_update_queue_handle , &new_data, 0 ));
596
- } else {
597
- vTaskDelay (1 );
598
596
}
599
- if (nodata_counter == 0 ) {
597
+ if (remain == 0 ) {
600
598
bus->powerControl (false );
601
599
continue ;
602
600
}
603
- --nodata_counter ;
604
- // 待機中にスリープ操作されている可能性があるので、ここで電源ON
601
+ --remain ;
602
+
605
603
bus->powerControl (true );
606
604
607
605
auto lut = me->_lut_2pixel ;
@@ -612,9 +610,9 @@ namespace lgfx
612
610
{
613
611
auto sb = &me->_step_framebuf [y * data_len >> 1 ];
614
612
auto dst = dma_buf;
615
- auto sb0 = sb[ 0 ];
616
- auto sb1 = sb[1 ];
617
- while (w--) {
613
+ do {
614
+ auto sb0 = sb[0 ];
615
+ auto sb1 = sb[ 1 ];
618
616
auto fb0 = lut[sb0];
619
617
auto fb1 = lut[sb1];
620
618
if (fb0 != 0x0F ) {
@@ -625,17 +623,15 @@ namespace lgfx
625
623
}
626
624
dst[0 ] = (fb0 << 4 ) + fb1;
627
625
sb += 2 ;
628
- sb0 = sb[0 ];
629
- sb1 = sb[1 ];
630
- dst++;
631
- }
626
+ dst += 1 ;
627
+ } while (--w);
632
628
}
633
629
if (y == 0 ) {
634
630
bus->beginTransaction ();
635
631
} else {
636
632
bus->scanlineDone ();
637
633
}
638
- bus->writeBytes (dma_buf, write_len);
634
+ bus->writeScanLine (dma_buf, write_len);
639
635
}
640
636
641
637
bus->scanlineDone ();
0 commit comments