Stefan Schuermans commited on 2019-05-30 18:29:21
Showing 3 changed files, with 115 additions and 1 deletions.
| ... | ... |
@@ -40,6 +40,36 @@ unsigned long BlinkenFrameGetColor(stBlinkenFrame *pFrame, int y, int x); |
| 40 | 40 |
void BlinkenFrameSetColor(stBlinkenFrame *pFrame, int y, int x, |
| 41 | 41 |
unsigned long color); |
| 42 | 42 |
|
| 43 |
+/** |
|
| 44 |
+ * get data of an rectangular area of pixels |
|
| 45 |
+ * \param[in] pFrame BlinkenFrame to read |
|
| 46 |
+ * \param[in] y first y coordinate of area |
|
| 47 |
+ * \param[in] dy size of area in y direction |
|
| 48 |
+ * \param[in] x first x coordinate of area |
|
| 49 |
+ * \param[in] dx size of area in x direction |
|
| 50 |
+ * \param[in] c first channel of area |
|
| 51 |
+ * \param[in] dc number of channels in area |
|
| 52 |
+ * \param[in] pData pointer to buffer for pixel data, size must be dy * dx * dc |
|
| 53 |
+ */ |
|
| 54 |
+void BlinkenFrameGetPixelData(stBlinkenFrame const *pFrame, |
|
| 55 |
+ int y, int dy, int x, int dx, int c, int dc, |
|
| 56 |
+ unsigned char *pData); |
|
| 57 |
+ |
|
| 58 |
+/** |
|
| 59 |
+ * set data of an rectangular area of pixels |
|
| 60 |
+ * \param[in] pFrame BlinkenFrame to modify |
|
| 61 |
+ * \param[in] y first y coordinate of area |
|
| 62 |
+ * \param[in] dy size of area in y direction |
|
| 63 |
+ * \param[in] x first x coordinate of area |
|
| 64 |
+ * \param[in] dx size of area in x direction |
|
| 65 |
+ * \param[in] c first channel of area |
|
| 66 |
+ * \param[in] dc number of channels in area |
|
| 67 |
+ * \param[in] pData pointer to new pixel data, size must be dy * dx * dc |
|
| 68 |
+ */ |
|
| 69 |
+void BlinkenFrameSetPixelData(stBlinkenFrame *pFrame, |
|
| 70 |
+ int y, int dy, int x, int dx, int c, int dc, |
|
| 71 |
+ unsigned char const *pData); |
|
| 72 |
+ |
|
| 43 | 73 |
int BlinkenFrameIsEmpty(stBlinkenFrame *pFrame); |
| 44 | 74 |
// returns 1 if frame is empty (i.e. black), returns 0 otherwise |
| 45 | 75 |
|
| ... | ... |
@@ -280,6 +280,90 @@ void BlinkenFrameSetColor(stBlinkenFrame *pFrame, int y, int x, |
| 280 | 280 |
alpha_) / 255); |
| 281 | 281 |
} |
| 282 | 282 |
|
| 283 |
+void BlinkenFrameGetPixelData(stBlinkenFrame const *pFrame, |
|
| 284 |
+ int y, int dy, int x, int dx, int c, int dc, |
|
| 285 |
+ unsigned char *pData) |
|
| 286 |
+{
|
|
| 287 |
+ int height, width, channels; |
|
| 288 |
+ unsigned char const **ppFrameData; |
|
| 289 |
+ int sy, ey, iy, sx, ex, ix, sc, ec, ic; // start/end/index x/y/channel |
|
| 290 |
+ int fy, fix, fic; // indexes into frame data |
|
| 291 |
+ int biy, bix, bic; // index into caller's data buffer |
|
| 292 |
+ |
|
| 293 |
+ // no frame -> leave |
|
| 294 |
+ if (pFrame == NULL) {
|
|
| 295 |
+ return; |
|
| 296 |
+ } |
|
| 297 |
+ |
|
| 298 |
+ height = pFrame->height; |
|
| 299 |
+ width = pFrame->width; |
|
| 300 |
+ channels = pFrame->channels; |
|
| 301 |
+ ppFrameData = (unsigned char const **)pFrame->ppData; |
|
| 302 |
+ |
|
| 303 |
+ // compute start and end for each coordinate |
|
| 304 |
+ sy = y < 0 ? -y : 0; |
|
| 305 |
+ ey = y + dy > height ? height - y : dy; |
|
| 306 |
+ sx = x < 0 ? -x : 0; |
|
| 307 |
+ ex = x + dx > width ? width - x : dx; |
|
| 308 |
+ sc = c < 0 ? -c : 0; |
|
| 309 |
+ ec = c + dc > channels ? channels - c : dc; |
|
| 310 |
+ |
|
| 311 |
+ // get pixel data |
|
| 312 |
+ for (iy = sy, fy = y, biy = (sy * dx + sx) * dc + sc; |
|
| 313 |
+ iy < ey; ++iy, ++fy, biy += dx * dc) {
|
|
| 314 |
+ for (ix = sx, fix = x * channels + c, bix = biy; |
|
| 315 |
+ ix < ex; ++ix, fix += channels, bix += dc) {
|
|
| 316 |
+ for (ic = sc, fic = fix, bic = bix; ic < ec; ++ic, ++fic, ++bic) {
|
|
| 317 |
+ pData[bic] = ppFrameData[fy][fic]; |
|
| 318 |
+ } |
|
| 319 |
+ } |
|
| 320 |
+ } |
|
| 321 |
+} |
|
| 322 |
+ |
|
| 323 |
+void BlinkenFrameSetPixelData(stBlinkenFrame *pFrame, |
|
| 324 |
+ int y, int dy, int x, int dx, int c, int dc, |
|
| 325 |
+ unsigned char const *pData) |
|
| 326 |
+{
|
|
| 327 |
+ int height, width, channels; |
|
| 328 |
+ unsigned char maxval; |
|
| 329 |
+ unsigned char **ppFrameData; |
|
| 330 |
+ int sy, ey, iy, sx, ex, ix, sc, ec, ic; // start/end/index x/y/channel |
|
| 331 |
+ int fy, fix, fic; // indexes into frame data |
|
| 332 |
+ int biy, bix, bic; // index into caller's data buffer |
|
| 333 |
+ unsigned char value; |
|
| 334 |
+ |
|
| 335 |
+ // no frame -> leave |
|
| 336 |
+ if (pFrame == NULL) {
|
|
| 337 |
+ return; |
|
| 338 |
+ } |
|
| 339 |
+ |
|
| 340 |
+ height = pFrame->height; |
|
| 341 |
+ width = pFrame->width; |
|
| 342 |
+ channels = pFrame->channels; |
|
| 343 |
+ maxval = pFrame->maxval; |
|
| 344 |
+ ppFrameData = pFrame->ppData; |
|
| 345 |
+ |
|
| 346 |
+ // compute start and end for each coordinate |
|
| 347 |
+ sy = y < 0 ? -y : 0; |
|
| 348 |
+ ey = y + dy > height ? height - y : dy; |
|
| 349 |
+ sx = x < 0 ? -x : 0; |
|
| 350 |
+ ex = x + dx > width ? width - x : dx; |
|
| 351 |
+ sc = c < 0 ? -c : 0; |
|
| 352 |
+ ec = c + dc > channels ? channels - c : dc; |
|
| 353 |
+ |
|
| 354 |
+ // set pixel data |
|
| 355 |
+ for (iy = sy, fy = y, biy = (sy * dx + sx) * dc + sc; |
|
| 356 |
+ iy < ey; ++iy, ++fy, biy += dx * dc) {
|
|
| 357 |
+ for (ix = sx, fix = x * channels + c, bix = biy; |
|
| 358 |
+ ix < ex; ++ix, fix += channels, bix += dc) {
|
|
| 359 |
+ for (ic = sc, fic = fix, bic = bix; ic < ec; ++ic, ++fic, ++bic) {
|
|
| 360 |
+ value = pData[bic]; |
|
| 361 |
+ ppFrameData[fy][fic] = value > maxval ? maxval : value; |
|
| 362 |
+ } |
|
| 363 |
+ } |
|
| 364 |
+ } |
|
| 365 |
+} |
|
| 366 |
+ |
|
| 283 | 367 |
int BlinkenFrameIsEmpty(stBlinkenFrame *pFrame) |
| 284 | 368 |
// returns 1 if frame is empty (i.e. black), returns 0 otherwise |
| 285 | 369 |
{
|