Stefan Schuermans commited on 2011-10-16 14:44:35
Showing 9 changed files, with 296 additions and 9 deletions.
| ... | ... |
@@ -23,19 +23,19 @@ static void gen_test_movie(stBlinkenMovie ** ppMovie, const char *str_format, |
| 23 | 23 |
mode = ModeTrans; |
| 24 | 24 |
if (sscanf(str_format, "%ux%u-%u/%u", &width, &height, &channels, &colors) |
| 25 | 25 |
!= 4) |
| 26 |
- printf("invalid movie format \"%s\"\n", str_format);
|
|
| 26 |
+ printf("invalid movie format \"%s\" for \"-t\"\n", str_format);
|
|
| 27 | 27 |
else if (mode == ModeNone) |
| 28 |
- printf("invalid test mode \"%s\"\n", str_mode);
|
|
| 28 |
+ printf("invalid test mode \"%s\" for \"-t\"\n", str_mode);
|
|
| 29 | 29 |
else if (sscanf(str_duration, "%u", &duration) != 1) |
| 30 |
- printf("invalid duration \"%s\"\n", str_duration);
|
|
| 30 |
+ printf("invalid duration \"%s\" for \"-t\"\n", str_duration);
|
|
| 31 | 31 |
else {
|
| 32 | 32 |
|
| 33 | 33 |
if (*ppMovie != NULL) |
| 34 | 34 |
BlinkenMovieFree(*ppMovie); |
| 35 | 35 |
*ppMovie = BlinkenMovieNew(height, width, channels, colors - 1); |
| 36 | 36 |
if (*ppMovie == NULL) |
| 37 |
- printf("could not create movie with format \"%ux%u-%x/%u\"\n", width,
|
|
| 38 |
- height, channels, colors); |
|
| 37 |
+ printf("could not create movie with format \"%ux%u-%x/%u\" for \"-t\"\n",
|
|
| 38 |
+ width, height, channels, colors); |
|
| 39 | 39 |
else {
|
| 40 | 40 |
|
| 41 | 41 |
unsigned int y, x, c, c2, c3, o, b, yy, xx, cc, oo; |
| ... | ... |
@@ -124,6 +124,33 @@ static void gen_test_movie(stBlinkenMovie ** ppMovie, const char *str_format, |
| 124 | 124 |
} // else |
| 125 | 125 |
} |
| 126 | 126 |
|
| 127 |
+static void copy_rect(stBlinkenMovie *pMovie, char *str_file, |
|
| 128 |
+ const char *str_src_pos, const char *str_dim, |
|
| 129 |
+ const char *str_dest_pos) |
|
| 130 |
+{
|
|
| 131 |
+ unsigned int sy, sx, h, w, dy, dx; |
|
| 132 |
+ stBlinkenMovie *pSrcMovie; |
|
| 133 |
+ |
|
| 134 |
+ if (sscanf(str_src_pos, "%u,%u", &sx, &sy) != 2) |
|
| 135 |
+ printf("invalid source position \"%s\" for \"-C\"\n", str_src_pos);
|
|
| 136 |
+ else if (sscanf(str_dim, "%ux%u", &w, &h) != 2) |
|
| 137 |
+ printf("invalid dimensions \"%s\" for \"-C\"\n", str_dim);
|
|
| 138 |
+ else if (sscanf(str_dest_pos, "%u,%u", &dx, &dy) != 2) |
|
| 139 |
+ printf("invalid destination position \"%s\" for \"-C\"\n", str_dest_pos);
|
|
| 140 |
+ else {
|
|
| 141 |
+ |
|
| 142 |
+ pSrcMovie = BlinkenMovieLoad(str_file); |
|
| 143 |
+ if (pSrcMovie == NULL) |
|
| 144 |
+ printf("could not read movie \"%s\"\n", str_file);
|
|
| 145 |
+ else {
|
|
| 146 |
+ |
|
| 147 |
+ BlinkenMovieCopyRect(pMovie, dy, dx, pSrcMovie, sy, sx, h, w); |
|
| 148 |
+ BlinkenMovieFree(pSrcMovie); |
|
| 149 |
+ |
|
| 150 |
+ } |
|
| 151 |
+ } |
|
| 152 |
+} |
|
| 153 |
+ |
|
| 127 | 154 |
int main(int argCnt, char **args) |
| 128 | 155 |
{
|
| 129 | 156 |
stBlinkenMovie *pMovie; |
| ... | ... |
@@ -168,6 +195,8 @@ int main(int argCnt, char **args) |
| 168 | 195 |
" delete frames\n" |
| 169 | 196 |
" -t <width>x<height>-<channels>/<colors> [dots|lines|trans] <duration>\n" |
| 170 | 197 |
" generate a test movie\n" |
| 198 |
+ " -C <file> <src-x>,<src-y> <width>x<height> <dest-x>,<dest-y>\n" |
|
| 199 |
+ " copy rectangular section of other movie\n" |
|
| 171 | 200 |
" -o <file>\n" |
| 172 | 201 |
" write movie to file (*.blm, *.bmm, *.bml, *.bbm)\n\n" |
| 173 | 202 |
"old syntax: %s <input-file> [<output-file>]\n\n", |
| ... | ... |
@@ -407,6 +436,32 @@ int main(int argCnt, char **args) |
| 407 | 436 |
} else |
| 408 | 437 |
printf("missing format for \"-t\"\n");
|
| 409 | 438 |
} |
| 439 |
+ // copy rectangular section of other movie |
|
| 440 |
+ else if (strcmp(args[i], "-C") == 0) {
|
|
| 441 |
+ if (i + 4 < argCnt) {
|
|
| 442 |
+ char *str_file; |
|
| 443 |
+ const char *str_src_pos, *str_dim, *str_dest_pos; |
|
| 444 |
+ i++; |
|
| 445 |
+ str_file = args[i]; |
|
| 446 |
+ i++; |
|
| 447 |
+ str_src_pos = args[i]; |
|
| 448 |
+ i++; |
|
| 449 |
+ str_dim = args[i]; |
|
| 450 |
+ i++; |
|
| 451 |
+ str_dest_pos = args[i]; |
|
| 452 |
+ copy_rect(pMovie, str_file, str_src_pos, str_dim, str_dest_pos); |
|
| 453 |
+ } else if (i + 3 < argCnt) {
|
|
| 454 |
+ printf("missing destination position for \"-C\"\n");
|
|
| 455 |
+ i += 3; |
|
| 456 |
+ } else if (i + 2 < argCnt) {
|
|
| 457 |
+ printf("missing dimensions for \"-C\"\n");
|
|
| 458 |
+ i += 2; |
|
| 459 |
+ } else if (i + 1 < argCnt) {
|
|
| 460 |
+ printf("missing source position for \"-C\"\n");
|
|
| 461 |
+ i++; |
|
| 462 |
+ } else |
|
| 463 |
+ printf("missing file name of source movie for \"-C\"\n");
|
|
| 464 |
+ } |
|
| 410 | 465 |
// write movie |
| 411 | 466 |
else if (strcmp(args[i], "-o") == 0) {
|
| 412 | 467 |
if (i + 1 < argCnt) {
|
| ... | ... |
@@ -646,6 +646,73 @@ void BlinkenFrameColorize(stBlinkenFrame *pFrame, int channels, int mode, |
| 646 | 646 |
pFrame->ppData = ppData; |
| 647 | 647 |
} |
| 648 | 648 |
|
| 649 |
+void BlinkenFrameCopyRect(stBlinkenFrame *pDest, int destY, int destX, |
|
| 650 |
+ stBlinkenFrame *pSrc, int srcY, int srcX, |
|
| 651 |
+ int height, int width) |
|
| 652 |
+{
|
|
| 653 |
+ int bFreeSrc = 0; |
|
| 654 |
+ int destI, srcI, y, x, c, dy, sy, di, si; |
|
| 655 |
+ |
|
| 656 |
+ if (pDest == NULL || pSrc == NULL) |
|
| 657 |
+ return; |
|
| 658 |
+ |
|
| 659 |
+ // make sure source frame matches dest frame in channels and maxval |
|
| 660 |
+ if (pSrc->channels != pDest->channels || pSrc->maxval != pDest->maxval) {
|
|
| 661 |
+ pSrc = BlinkenFrameClone(pSrc); |
|
| 662 |
+ if (pSrc == NULL) |
|
| 663 |
+ return; |
|
| 664 |
+ BlinkenFrameResize(pSrc, pSrc->height, pSrc->width, |
|
| 665 |
+ pDest->channels, pDest->maxval); |
|
| 666 |
+ bFreeSrc = 1; // source is now a temporary copy that needs to be freed |
|
| 667 |
+ } |
|
| 668 |
+ |
|
| 669 |
+ // correct coordinates |
|
| 670 |
+ if (destY < 0) {
|
|
| 671 |
+ height += destY; |
|
| 672 |
+ srcY -= destY; |
|
| 673 |
+ destY = 0; |
|
| 674 |
+ } |
|
| 675 |
+ if (destX < 0) {
|
|
| 676 |
+ width += destX; |
|
| 677 |
+ srcX -= destX; |
|
| 678 |
+ destX = 0; |
|
| 679 |
+ } |
|
| 680 |
+ if (srcY < 0) {
|
|
| 681 |
+ height += srcY; |
|
| 682 |
+ destY -= srcY; |
|
| 683 |
+ srcY = 0; |
|
| 684 |
+ } |
|
| 685 |
+ if (srcX < 0) {
|
|
| 686 |
+ width += srcX; |
|
| 687 |
+ destX -= srcX; |
|
| 688 |
+ srcX = 0; |
|
| 689 |
+ } |
|
| 690 |
+ if (height > pDest->height - destY) |
|
| 691 |
+ height = pDest->height - destY; |
|
| 692 |
+ if (width > pDest->width - destX) |
|
| 693 |
+ width = pDest->width - destX; |
|
| 694 |
+ if (height > pSrc->height - srcY) |
|
| 695 |
+ height = pSrc->height - srcY; |
|
| 696 |
+ if (width > pSrc->width - srcX) |
|
| 697 |
+ width = pSrc->width - srcX; |
|
| 698 |
+ if (height < 0) |
|
| 699 |
+ height = 0; |
|
| 700 |
+ if (width < 0) |
|
| 701 |
+ width = 0; |
|
| 702 |
+ |
|
| 703 |
+ // copy rectangular area |
|
| 704 |
+ destI = destX * pDest->channels; |
|
| 705 |
+ srcI = srcX * pSrc->channels; |
|
| 706 |
+ for (y = 0, dy = destY, sy = srcY; y < height; y++, dy++, sy++) |
|
| 707 |
+ for (x = 0, di = destI, si = srcI; x < width; x++) |
|
| 708 |
+ for (c = 0; c < pDest->channels; c++, di++, si++) |
|
| 709 |
+ pDest->ppData[dy][di] = pSrc->ppData[sy][si]; |
|
| 710 |
+ |
|
| 711 |
+ // free source if it is a temporary copy |
|
| 712 |
+ if (bFreeSrc) |
|
| 713 |
+ BlinkenFrameFree(pSrc); |
|
| 714 |
+} |
|
| 715 |
+ |
|
| 649 | 716 |
char *BlinkenFrameToString(stBlinkenFrame *pFrame) |
| 650 | 717 |
{
|
| 651 | 718 |
int size, y, x, c, i; |
| ... | ... |
@@ -48,6 +48,9 @@ void BlinkenFrameResize(stBlinkenFrame *pFrame, int height, int width, |
| 48 | 48 |
void BlinkenFrameScale(stBlinkenFrame *pFrame, int height, int width); |
| 49 | 49 |
void BlinkenFrameColorize(stBlinkenFrame *pFrame, int channels, int mode, |
| 50 | 50 |
int step); |
| 51 |
+void BlinkenFrameCopyRect(stBlinkenFrame *pDest, int destY, int destX, |
|
| 52 |
+ stBlinkenFrame *pSrc, int srcY, int srcX, |
|
| 53 |
+ int height, int width); |
|
| 51 | 54 |
|
| 52 | 55 |
char *BlinkenFrameToString(stBlinkenFrame *pFrame); |
| 53 | 56 |
|
| ... | ... |
@@ -611,6 +611,78 @@ void BlinkenMovieColorize(stBlinkenMovie *pMovie, int channels, int mode) |
| 611 | 611 |
} |
| 612 | 612 |
} |
| 613 | 613 |
|
| 614 |
+void BlinkenMovieCopyRect(stBlinkenMovie *pDest, int destY, int destX, |
|
| 615 |
+ stBlinkenMovie *pSrc, int srcY, int srcX, |
|
| 616 |
+ int height, int width) |
|
| 617 |
+{
|
|
| 618 |
+ int dcnt, scnt, di, si, dest_dur, src_dur, src_time_ofs; |
|
| 619 |
+ stBlinkenFrame *pFrame; |
|
| 620 |
+ |
|
| 621 |
+ if (pDest == NULL || pSrc == NULL) |
|
| 622 |
+ return; |
|
| 623 |
+ |
|
| 624 |
+ // exit if both movies empty |
|
| 625 |
+ dcnt = pDest->frameCnt; |
|
| 626 |
+ scnt = pSrc->frameCnt; |
|
| 627 |
+ if (dcnt == 0 || scnt == 0) |
|
| 628 |
+ return; |
|
| 629 |
+ |
|
| 630 |
+ // go throuh all source frames |
|
| 631 |
+ di = 0; |
|
| 632 |
+ si = 0; |
|
| 633 |
+ dest_dur = dcnt > 0 ? BlinkenFrameGetDuration(pDest->ppFrames[0]) : 0; |
|
| 634 |
+ src_dur = scnt > 0 ? BlinkenFrameGetDuration(pSrc->ppFrames[0]) : 0; |
|
| 635 |
+ src_time_ofs = 0; |
|
| 636 |
+ while (si < scnt) {
|
|
| 637 |
+ |
|
| 638 |
+ // make sure there is a frame in destination movie |
|
| 639 |
+ if (di >= dcnt) {
|
|
| 640 |
+ // append new empty frame that last until end of source frame |
|
| 641 |
+ pFrame = BlinkenFrameNew(pDest->height, pDest->width, |
|
| 642 |
+ pDest->channels, pDest->maxval, |
|
| 643 |
+ src_dur - src_time_ofs); |
|
| 644 |
+ if (pFrame == NULL) |
|
| 645 |
+ return; |
|
| 646 |
+ BlinkenFrameClear(pFrame); |
|
| 647 |
+ if (BlinkenMovieAppendFrame(pDest, pFrame) != 0) |
|
| 648 |
+ return; |
|
| 649 |
+ dcnt++; |
|
| 650 |
+ dest_dur = src_dur - src_time_ofs; |
|
| 651 |
+ } |
|
| 652 |
+ |
|
| 653 |
+ // make sure destination frame does not last longer than source frame |
|
| 654 |
+ if (dest_dur > src_dur - src_time_ofs) {
|
|
| 655 |
+ // split destination frame into two |
|
| 656 |
+ pFrame = BlinkenFrameClone(pDest->ppFrames[di]); |
|
| 657 |
+ if (pFrame == NULL) |
|
| 658 |
+ return; |
|
| 659 |
+ if (BlinkenMovieInsertFrame(pDest, di+1, pFrame) != 0) |
|
| 660 |
+ return; |
|
| 661 |
+ dcnt++; |
|
| 662 |
+ BlinkenFrameSetDuration(pDest->ppFrames[di], |
|
| 663 |
+ src_dur - src_time_ofs); |
|
| 664 |
+ BlinkenFrameSetDuration(pDest->ppFrames[di+1], |
|
| 665 |
+ dest_dur - (src_dur - src_time_ofs)); |
|
| 666 |
+ dest_dur = src_dur - src_time_ofs; |
|
| 667 |
+ } |
|
| 668 |
+ |
|
| 669 |
+ // copy from source frame to destination frame |
|
| 670 |
+ BlinkenFrameCopyRect(pDest->ppFrames[di], destY, destX, |
|
| 671 |
+ pSrc->ppFrames[si], srcY, srcX, height, width); |
|
| 672 |
+ src_time_ofs += dest_dur; |
|
| 673 |
+ di++; |
|
| 674 |
+ dest_dur = di < dcnt ? BlinkenFrameGetDuration(pDest->ppFrames[di]) : 0; |
|
| 675 |
+ |
|
| 676 |
+ // go to next source frame |
|
| 677 |
+ if (src_time_ofs >= src_dur) {
|
|
| 678 |
+ si++; |
|
| 679 |
+ src_dur = si < scnt ? BlinkenFrameGetDuration(pSrc->ppFrames[si]) : 0; |
|
| 680 |
+ src_time_ofs = 0; |
|
| 681 |
+ } |
|
| 682 |
+ |
|
| 683 |
+ } // while (si < scnt) |
|
| 684 |
+} |
|
| 685 |
+ |
|
| 614 | 686 |
char *BlinkenMovieToString(stBlinkenMovie *pMovie) |
| 615 | 687 |
{
|
| 616 | 688 |
char **strs, *str, *ptr; |
| ... | ... |
@@ -62,6 +62,9 @@ void BlinkenMovieResize(stBlinkenMovie *pMovie, int height, int width, |
| 62 | 62 |
int channels, int maxval); |
| 63 | 63 |
void BlinkenMovieScale(stBlinkenMovie *pMovie, int height, int width); |
| 64 | 64 |
void BlinkenMovieColorize(stBlinkenMovie *pMovie, int channels, int mode); |
| 65 |
+void BlinkenMovieCopyRect(stBlinkenMovie *pDest, int destY, int destX, |
|
| 66 |
+ stBlinkenMovie *pSrc, int srcY, int srcX, |
|
| 67 |
+ int height, int width); |
|
| 65 | 68 |
|
| 66 | 69 |
char *BlinkenMovieToString(stBlinkenMovie *pMovie); |
| 67 | 70 |
|
| ... | ... |
@@ -5,12 +5,9 @@ |
| 5 | 5 |
|
| 6 | 6 |
VERSION_MAJOR=0 |
| 7 | 7 |
VERSION_MINOR=6 |
| 8 |
-VERSION_REVISION=6 |
|
| 8 |
+VERSION_REVISION=7 |
|
| 9 | 9 |
VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_REVISION) |
| 10 | 10 |
|
| 11 |
-DATE:=$(shell date +%Y-%m-%d) |
|
| 12 |
-YEAR:=$(shell date +%Y) |
|
| 13 |
- |
|
| 14 | 11 |
UPDATE_FILES=Makefile */Makefile */*.c */*.h |
| 15 | 12 |
PACK_FILES=BlinkenLib ChangeLog config examples install Makefile |
| 16 | 13 |
|
| ... | ... |
@@ -0,0 +1,42 @@ |
| 1 |
+# BlinkenLights Movie 18x8 |
|
| 2 |
+ |
|
| 3 |
+@100 |
|
| 4 |
+110000000000000000 |
|
| 5 |
+000000000000000000 |
|
| 6 |
+000000000000000000 |
|
| 7 |
+000000000000000000 |
|
| 8 |
+000000000000000000 |
|
| 9 |
+000000000000000000 |
|
| 10 |
+000000000000000000 |
|
| 11 |
+000000000000000000 |
|
| 12 |
+ |
|
| 13 |
+@100 |
|
| 14 |
+111100000000000000 |
|
| 15 |
+100000000000000000 |
|
| 16 |
+000000000000000000 |
|
| 17 |
+000000000000000000 |
|
| 18 |
+000000000000000000 |
|
| 19 |
+000000000000000000 |
|
| 20 |
+000000000000000000 |
|
| 21 |
+000000000000000000 |
|
| 22 |
+ |
|
| 23 |
+@100 |
|
| 24 |
+111111000000000000 |
|
| 25 |
+100000000000000000 |
|
| 26 |
+100000000000000000 |
|
| 27 |
+000000000000000000 |
|
| 28 |
+000000000000000000 |
|
| 29 |
+000000000000000000 |
|
| 30 |
+000000000000000000 |
|
| 31 |
+000000000000000000 |
|
| 32 |
+ |
|
| 33 |
+@100 |
|
| 34 |
+111111110000000000 |
|
| 35 |
+100000000000000000 |
|
| 36 |
+100000000000000000 |
|
| 37 |
+100000000000000000 |
|
| 38 |
+000000000000000000 |
|
| 39 |
+000000000000000000 |
|
| 40 |
+000000000000000000 |
|
| 41 |
+000000000000000000 |
|
| 42 |
+ |
| ... | ... |
@@ -0,0 +1,42 @@ |
| 1 |
+# BlinkenLights Movie 18x8 |
|
| 2 |
+ |
|
| 3 |
+@150 |
|
| 4 |
+101000000000000000 |
|
| 5 |
+000000000000000000 |
|
| 6 |
+000000000000000000 |
|
| 7 |
+000000000000000000 |
|
| 8 |
+000000000000000000 |
|
| 9 |
+000000000000000000 |
|
| 10 |
+000000000000000000 |
|
| 11 |
+000000000000000000 |
|
| 12 |
+ |
|
| 13 |
+@150 |
|
| 14 |
+101010100000000000 |
|
| 15 |
+100000000000000000 |
|
| 16 |
+000000000000000000 |
|
| 17 |
+000000000000000000 |
|
| 18 |
+000000000000000000 |
|
| 19 |
+000000000000000000 |
|
| 20 |
+000000000000000000 |
|
| 21 |
+000000000000000000 |
|
| 22 |
+ |
|
| 23 |
+@150 |
|
| 24 |
+101010101010000000 |
|
| 25 |
+100000000000000000 |
|
| 26 |
+100000000000000000 |
|
| 27 |
+000000000000000000 |
|
| 28 |
+000000000000000000 |
|
| 29 |
+000000000000000000 |
|
| 30 |
+000000000000000000 |
|
| 31 |
+000000000000000000 |
|
| 32 |
+ |
|
| 33 |
+@150 |
|
| 34 |
+101010101010101000 |
|
| 35 |
+100000000000000000 |
|
| 36 |
+100000000000000000 |
|
| 37 |
+100000000000000000 |
|
| 38 |
+000000000000000000 |
|
| 39 |
+000000000000000000 |
|
| 40 |
+000000000000000000 |
|
| 41 |
+000000000000000000 |
|
| 42 |
+ |
|
| 0 | 43 |