Stefan Schuermans commited on 2016-12-21 10:31:43
Showing 8 changed files, with 103 additions and 25 deletions.
... | ... |
@@ -85,7 +85,8 @@ int main(int argc, char *argv[]) |
85 | 85 |
for (i = 0; i < 5; ++i) { |
86 | 86 |
|
87 | 87 |
printf("on\n"); |
88 |
- flp_display_data(p_display, white, 0, 0, 0, 0, width, height); |
|
88 |
+ flp_display_data_fmt(p_display, white, 0, 0, 0, 0, width, height, |
|
89 |
+ flp_pixfmt_rgb24); |
|
89 | 90 |
flp_display_send(p_display); |
90 | 91 |
usleep(100000); |
91 | 92 |
|
... | ... |
@@ -125,10 +125,10 @@ int main(int argc, char *argv[]) |
125 | 125 |
} |
126 | 126 |
|
127 | 127 |
/* set new image */ |
128 |
- flp_displayer_data(p_displayer, p_image, |
|
128 |
+ flp_displayer_data_fmt(p_displayer, p_image, |
|
129 | 129 |
3, /* consecutive pixels are 3 bytes apart */ |
130 |
- width*3, /* consecutive lines are width*3 bytes apart */ |
|
131 |
- 0, 0, width, height); |
|
130 |
+ width*3, /* consecutive lines width*3 bytes apart */ |
|
131 |
+ 0, 0, width, height, flp_pixfmt_rgb24); |
|
132 | 132 |
/* force sending data to distris immediately */ |
133 | 133 |
flp_displayer_send(p_displayer); |
134 | 134 |
|
... | ... |
@@ -100,10 +100,10 @@ int main(int argc, char *argv[]) |
100 | 100 |
} |
101 | 101 |
|
102 | 102 |
/* output image */ |
103 |
- flp_display_data(p_display, p_image, |
|
103 |
+ flp_display_data_fmt(p_display, p_image, |
|
104 | 104 |
3, /* consecutive pixels are 3 bytes apart */ |
105 | 105 |
width*3, /* consecutive lines are width*3 bytes apart */ |
106 |
- 0, 0, width, height); |
|
106 |
+ 0, 0, width, height, flp_pixfmt_rgb24); |
|
107 | 107 |
flp_display_send(p_display); |
108 | 108 |
|
109 | 109 |
free(p_image); |
... | ... |
@@ -72,14 +72,26 @@ void flp_display_data_clear(flp_display_t *p_display); |
72 | 72 |
* flp_display_send() |
73 | 73 |
* |
74 | 74 |
* \param[in] p_display pointer to FlexiPix display |
75 |
- * \param[in] p_data pointer to rectangular section of image data, |
|
76 |
- * pixels need to be in R8G8B8 format |
|
75 |
+ * \param[in] p_data pointer to rectangular section of image data |
|
77 | 76 |
* \param[in] stride_x stride between two pixels in X direction |
78 | 77 |
* \param[in] stride_y stride between two pixels in Y direction |
79 | 78 |
* \param[in] x X coordinate of left side of rectangular area |
80 | 79 |
* \param[in] y Y coordinate of top side of rectangular area |
81 | 80 |
* \param[in] width with of rectangular area |
82 | 81 |
* \param[in] height height of rectangular area |
82 |
+ * \param[in] pixfmt format of pixel data |
|
83 |
+ */ |
|
84 |
+void flp_display_data_fmt(flp_display_t *p_display, flp_u8_t *p_data, |
|
85 |
+ int stride_x, int stride_y, |
|
86 |
+ unsigned int x, unsigned int y, |
|
87 |
+ unsigned int width, unsigned int height, |
|
88 |
+ flp_pixfmt_t pixfmt); |
|
89 |
+ |
|
90 |
+/** |
|
91 |
+ * \brief set image data to output on FlexiPix display |
|
92 |
+ * |
|
93 |
+ * see flp_display_data_fmt for documentation |
|
94 |
+ * pixfmt is fixed to flp_pixfmt_rgb24 |
|
83 | 95 |
*/ |
84 | 96 |
void flp_display_data(flp_display_t *p_display, flp_u8_t *p_data, |
85 | 97 |
int stride_x, int stride_y, |
... | ... |
@@ -97,14 +97,26 @@ void flp_displayer_data_clear(flp_displayer_t *p_displayer); |
97 | 97 |
* updates (part of) the stored image data |
98 | 98 |
* |
99 | 99 |
* \param[in] p_displayer pointer to FlexiPix displayer |
100 |
- * \param[in] p_data pointer to rectangular section of image data, |
|
101 |
- * pixels need to be in R8G8B8 format |
|
100 |
+ * \param[in] p_data pointer to rectangular section of image data |
|
102 | 101 |
* \param[in] stride_x stride between two pixels in X direction |
103 | 102 |
* \param[in] stride_y stride between two pixels in Y direction |
104 | 103 |
* \param[in] x X coordinate of left side of rectangular area |
105 | 104 |
* \param[in] y Y coordinate of top side of rectangular area |
106 | 105 |
* \param[in] width with of rectangular area |
107 | 106 |
* \param[in] height height of rectangular area |
107 |
+ * \param[in] pixfmt format of pixel data |
|
108 |
+ */ |
|
109 |
+void flp_displayer_data_fmt(flp_displayer_t *p_displayer, flp_u8_t *p_data, |
|
110 |
+ int stride_x, int stride_y, |
|
111 |
+ unsigned int x, unsigned int y, |
|
112 |
+ unsigned int width, unsigned int height, |
|
113 |
+ flp_pixfmt_t pixfmt); |
|
114 |
+ |
|
115 |
+/** |
|
116 |
+ * \brief set image data to output on FlexiPix display |
|
117 |
+ * |
|
118 |
+ * see flp_displayer_data_fmt for documentation |
|
119 |
+ * pixfmt is fixed to flp_pixfmt_rgb24 |
|
108 | 120 |
*/ |
109 | 121 |
void flp_displayer_data(flp_displayer_t *p_displayer, flp_u8_t *p_data, |
110 | 122 |
int stride_x, int stride_y, |
... | ... |
@@ -28,6 +28,12 @@ typedef uint8_t flp_u8_t; |
28 | 28 |
/** a FlexiPix display */ |
29 | 29 |
typedef struct flp_display_s flp_display_t; |
30 | 30 |
|
31 |
+/** format of pixel data */ |
|
32 |
+typedef enum flp_pixfmt_e { |
|
33 |
+ flp_pixfmt_rgb24, /**< 24 bit RGB data, 3 bytes: red, green, blue */ |
|
34 |
+ flp_pixfmt_bgr24, /**< 24 bit BGR data, 3 bytes: blue, green, red */ |
|
35 |
+} flp_pixfmt_t; |
|
36 |
+ |
|
31 | 37 |
/** |
32 | 38 |
* \brief a displayer |
33 | 39 |
* |
... | ... |
@@ -169,8 +169,9 @@ void flp_display_get_size(flp_display_t *p_display, |
169 | 169 |
void flp_display_data_clear(flp_display_t *p_display) |
170 | 170 |
{ |
171 | 171 |
flp_u8_t black[3] = { 0, 0, 0 }; |
172 |
- flp_display_data(p_display, black, 0, 0, |
|
173 |
- 0, 0, p_display->size.x, p_display->size.y); |
|
172 |
+ flp_display_data_fmt(p_display, black, 0, 0, |
|
173 |
+ 0, 0, p_display->size.x, p_display->size.y, |
|
174 |
+ flp_pixfmt_rgb24); |
|
174 | 175 |
} |
175 | 176 |
|
176 | 177 |
/** |
... | ... |
@@ -181,21 +182,22 @@ void flp_display_data_clear(flp_display_t *p_display) |
181 | 182 |
* flp_display_send() |
182 | 183 |
* |
183 | 184 |
* \param[in] p_display pointer to FlexiPix display |
184 |
- * \param[in] p_data pointer to rectangular section of image data, |
|
185 |
- * pixels need to be in R8G8B8 format |
|
185 |
+ * \param[in] p_data pointer to rectangular section of image data |
|
186 | 186 |
* \param[in] stride_x stride between two pixels in X direction |
187 | 187 |
* \param[in] stride_y stride between two pixels in Y direction |
188 | 188 |
* \param[in] x X coordinate of left side of rectangular area |
189 | 189 |
* \param[in] y Y coordinate of top side of rectangular area |
190 | 190 |
* \param[in] width with of rectangular area |
191 | 191 |
* \param[in] height height of rectangular area |
192 |
+ * \param[in] pixfmt format of pixel data |
|
192 | 193 |
*/ |
193 |
-void flp_display_data(flp_display_t *p_display, flp_u8_t *p_data, |
|
194 |
+void flp_display_data_fmt(flp_display_t *p_display, flp_u8_t *p_data, |
|
194 | 195 |
int stride_x, int stride_y, |
195 | 196 |
unsigned int x, unsigned int y, |
196 |
- unsigned int width, unsigned int height) |
|
197 |
+ unsigned int width, unsigned int height, |
|
198 |
+ flp_pixfmt_t pixfmt) |
|
197 | 199 |
{ |
198 |
- unsigned int distri, out, pix, i, c; |
|
200 |
+ unsigned int distri, out, pix, i; |
|
199 | 201 |
flp_distri_t *p_distri; |
200 | 202 |
flp_u8_t *dest, *src; |
201 | 203 |
flp_pixel_t *p_pixel; |
... | ... |
@@ -223,8 +225,22 @@ void flp_display_data(flp_display_t *p_display, flp_u8_t *p_data, |
223 | 225 |
&& ry >= 0 && (unsigned int)ry < height) { |
224 | 226 |
/* get pixel data and map it */ |
225 | 227 |
src = (p_data + rx * stride_x + ry * stride_y); |
226 |
- for (c = 0; c < 3; c++) |
|
227 |
- dest[c] = p_distri->mapping[c].table[src[c]]; |
|
228 |
+ switch (pixfmt) { |
|
229 |
+ case flp_pixfmt_rgb24: |
|
230 |
+ dest[0] = p_distri->mapping[0].table[src[0]]; |
|
231 |
+ dest[1] = p_distri->mapping[1].table[src[1]]; |
|
232 |
+ dest[2] = p_distri->mapping[2].table[src[2]]; |
|
233 |
+ break; |
|
234 |
+ case flp_pixfmt_bgr24: |
|
235 |
+ dest[0] = p_distri->mapping[0].table[src[2]]; |
|
236 |
+ dest[1] = p_distri->mapping[1].table[src[1]]; |
|
237 |
+ dest[2] = p_distri->mapping[2].table[src[0]]; |
|
238 |
+ break; |
|
239 |
+ default: |
|
240 |
+ dest[0] = 0; |
|
241 |
+ dest[1] = 0; |
|
242 |
+ dest[2] = 0; |
|
243 |
+ } |
|
228 | 244 |
} |
229 | 245 |
|
230 | 246 |
dest += 3; |
... | ... |
@@ -235,6 +251,21 @@ void flp_display_data(flp_display_t *p_display, flp_u8_t *p_data, |
235 | 251 |
} /* for (distri ...) */ |
236 | 252 |
} |
237 | 253 |
|
254 |
+/** |
|
255 |
+ * \brief set image data to output on FlexiPix display |
|
256 |
+ * |
|
257 |
+ * see flp_display_data_fmt for documentation |
|
258 |
+ * pixfmt is fixed to flp_pixfmt_rgb24 |
|
259 |
+ */ |
|
260 |
+void flp_display_data(flp_display_t *p_display, flp_u8_t *p_data, |
|
261 |
+ int stride_x, int stride_y, |
|
262 |
+ unsigned int x, unsigned int y, |
|
263 |
+ unsigned int width, unsigned int height) |
|
264 |
+{ |
|
265 |
+ flp_display_data_fmt(p_display, p_data, stride_x, stride_y, |
|
266 |
+ x, y, width, height, flp_pixfmt_rgb24); |
|
267 |
+} |
|
268 |
+ |
|
238 | 269 |
/** |
239 | 270 |
* \brief send image data to distributors |
240 | 271 |
* |
... | ... |
@@ -202,26 +202,42 @@ void flp_displayer_data_clear(flp_displayer_t *p_displayer) |
202 | 202 |
* updates (part of) the stored image data |
203 | 203 |
* |
204 | 204 |
* \param[in] p_displayer pointer to FlexiPix displayer |
205 |
- * \param[in] p_data pointer to rectangular section of image data, |
|
206 |
- * pixels need to be in R8G8B8 format |
|
205 |
+ * \param[in] p_data pointer to rectangular section of image data |
|
207 | 206 |
* \param[in] stride_x stride between two pixels in X direction |
208 | 207 |
* \param[in] stride_y stride between two pixels in Y direction |
209 | 208 |
* \param[in] x X coordinate of left side of rectangular area |
210 | 209 |
* \param[in] y Y coordinate of top side of rectangular area |
211 | 210 |
* \param[in] width with of rectangular area |
212 | 211 |
* \param[in] height height of rectangular area |
212 |
+ * \param[in] pixfmt format of pixel data |
|
213 | 213 |
*/ |
214 |
-void flp_displayer_data(flp_displayer_t *p_displayer, flp_u8_t *p_data, |
|
214 |
+void flp_displayer_data_fmt(flp_displayer_t *p_displayer, flp_u8_t *p_data, |
|
215 | 215 |
int stride_x, int stride_y, |
216 | 216 |
unsigned int x, unsigned int y, |
217 |
- unsigned int width, unsigned int height) |
|
217 |
+ unsigned int width, unsigned int height, |
|
218 |
+ flp_pixfmt_t pixfmt) |
|
218 | 219 |
{ |
219 | 220 |
flp_thread_mutex_lock(&p_displayer->mtx); |
220 |
- flp_display_data(p_displayer->p_display, p_data, stride_x, stride_y, |
|
221 |
- x, y, width, height); |
|
221 |
+ flp_display_data_fmt(p_displayer->p_display, p_data, stride_x, stride_y, |
|
222 |
+ x, y, width, height, pixfmt); |
|
222 | 223 |
flp_thread_mutex_unlock(&p_displayer->mtx); |
223 | 224 |
} |
224 | 225 |
|
226 |
+/** |
|
227 |
+ * \brief set image data to output on FlexiPix display |
|
228 |
+ * |
|
229 |
+ * see flp_displayer_data_fmt for documentation |
|
230 |
+ * pixfmt is fixed to flp_pixfmt_rgb24 |
|
231 |
+ */ |
|
232 |
+void flp_displayer_data(flp_displayer_t *p_displayer, flp_u8_t *p_data, |
|
233 |
+ int stride_x, int stride_y, |
|
234 |
+ unsigned int x, unsigned int y, |
|
235 |
+ unsigned int width, unsigned int height) |
|
236 |
+{ |
|
237 |
+ flp_displayer_data_fmt(p_displayer, p_data, stride_x, stride_y, |
|
238 |
+ x, y, width, height, flp_pixfmt_rgb24); |
|
239 |
+} |
|
240 |
+ |
|
225 | 241 |
/** |
226 | 242 |
* \brief trigger immediate sending of new image data to distributors |
227 | 243 |
* |
228 | 244 |