BlinkenLib v.0.4 (2005-07-02)
Christian Heimke

Christian Heimke commited on 2011-07-15 09:02:58
Showing 13 changed files, with 510 additions and 105 deletions.

... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -8,6 +8,7 @@
8 8
 
9 9
 #include <stdio.h>
10 10
 #include <stdlib.h>
11
+#include <string.h>
11 12
 
12 13
 #include "BlinkenLib.h"
13 14
 
... ...
@@ -20,7 +21,7 @@ int main( int argCnt, char * * args )
20 21
 
21 22
   //print info
22 23
   printf( "BlinkenLib - BlinkenConv\n"
23
-          "version 0.3.1 date 2005-03-05\n"
24
+          "version 0.4 date 2005-07-02\n"
24 25
           "Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>\n"
25 26
           "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
26 27
           "a blinkenarea.org project\n"
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -23,7 +23,7 @@ struct sBlinkenFrame
23 23
   int channels;
24 24
   int maxval;
25 25
   int duration;
26
-  unsigned char * * * pppData;
26
+  unsigned char * * ppData;
27 27
 };
28 28
 
29 29
 //blinken protocol headers
... ...
@@ -78,8 +78,8 @@ stBlinkenFrame * BlinkenFrameNew( int height, int width, int channels, int maxva
78 78
   pFrame->maxval = maxval;
79 79
   pFrame->duration = duration;
80 80
 
81
-  pFrame->pppData = (unsigned char * * *)malloc3D( height, width, channels, sizeof( unsigned char ) );
82
-  if( pFrame->pppData == NULL )
81
+  pFrame->ppData = (unsigned char * *)malloc2D( height, width * channels, sizeof( unsigned char ) );
82
+  if( pFrame->ppData == NULL )
83 83
   {
84 84
     free( pFrame );
85 85
     return NULL;
... ...
@@ -90,7 +90,7 @@ stBlinkenFrame * BlinkenFrameNew( int height, int width, int channels, int maxva
90 90
 
91 91
 stBlinkenFrame * BlinkenFrameClone( stBlinkenFrame * pSrcFrame )
92 92
 {
93
-  int y, x, c;
93
+  int y, x, c, i;
94 94
   stBlinkenFrame * pFrame;
95 95
 
96 96
   if( pSrcFrame == NULL )
... ...
@@ -102,9 +102,9 @@ stBlinkenFrame * BlinkenFrameClone( stBlinkenFrame * pSrcFrame )
102 102
     return NULL;
103 103
 
104 104
   for( y = 0; y < pFrame->height; y++ )
105
-    for( x = 0; x < pFrame->width; x++ )
106
-      for( c = 0; c < pFrame->channels; c++ )
107
-        pFrame->pppData[y][x][c] = pSrcFrame->pppData[y][x][c];
105
+    for( x = 0, i = 0; x < pFrame->width; x++ )
106
+      for( c = 0; c < pFrame->channels; c++, i++ )
107
+        pFrame->ppData[y][i] = pSrcFrame->ppData[y][i];
108 108
 
109 109
   return pFrame;
110 110
 }
... ...
@@ -114,21 +114,21 @@ void BlinkenFrameFree( stBlinkenFrame * pFrame )
114 114
   if( pFrame == NULL )
115 115
     return;
116 116
 
117
-  free( pFrame->pppData );
117
+  free( pFrame->ppData );
118 118
   free( pFrame );
119 119
 }
120 120
 
121 121
 void BlinkenFrameClear( stBlinkenFrame * pFrame )
122 122
 {
123
-  int y, x, c;
123
+  int y, x, c, i;
124 124
 
125 125
   if( pFrame == NULL )
126 126
     return;
127 127
 
128 128
   for( y = 0; y < pFrame->height; y++ )
129
-    for( x = 0; x < pFrame->width; x++ )
130
-      for( c = 0; c < pFrame->channels; c++ )
131
-        pFrame->pppData[y][x][c] = 0;
129
+    for( x = 0, i = 0; x < pFrame->width; x++ )
130
+      for( c = 0; c < pFrame->channels; c++, i++ )
131
+        pFrame->ppData[y][i] = 0;
132 132
 }
133 133
 
134 134
 int BlinkenFrameGetHeight( stBlinkenFrame * pFrame )
... ...
@@ -190,7 +190,7 @@ unsigned char BlinkenFrameGetPixel( stBlinkenFrame * pFrame, int y, int x, int c
190 190
       c < 0 || c >= pFrame->channels )
191 191
       return 0;
192 192
 
193
-  return pFrame->pppData[y][x][c];
193
+  return pFrame->ppData[y][x * pFrame->channels + c];
194 194
 }
195 195
 
196 196
 void BlinkenFrameSetPixel( stBlinkenFrame * pFrame, int y, int x, int c, unsigned char val )
... ...
@@ -203,7 +203,7 @@ void BlinkenFrameSetPixel( stBlinkenFrame * pFrame, int y, int x, int c, unsigne
203 203
 
204 204
   if( val > pFrame->maxval )
205 205
     val = pFrame->maxval;
206
-  pFrame->pppData[y][x][c] = val;
206
+  pFrame->ppData[y][x * pFrame->channels + c] = val;
207 207
 }
208 208
 
209 209
 unsigned long BlinkenFrameGetColor( stBlinkenFrame * pFrame, int y, int x )
... ...
@@ -213,16 +213,18 @@ unsigned long BlinkenFrameGetColor( stBlinkenFrame * pFrame, int y, int x )
213 213
       x < 0 || x >= pFrame->width )
214 214
       return 0;
215 215
 
216
+  int i = x * pFrame->channels;
217
+
216 218
   if( pFrame->channels == 1 )
217
-    return (((unsigned long)pFrame->pppData[y][x][0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 16 |
218
-           (((unsigned long)pFrame->pppData[y][x][0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 8 |
219
-           (((unsigned long)pFrame->pppData[y][x][0] * 255 + pFrame->maxval / 2) / pFrame->maxval);
219
+    return (((unsigned long)pFrame->ppData[y][i + 0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 16 |
220
+           (((unsigned long)pFrame->ppData[y][i + 0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 8 |
221
+           (((unsigned long)pFrame->ppData[y][i + 0] * 255 + pFrame->maxval / 2) / pFrame->maxval);
220 222
   if( pFrame->channels == 2 )
221
-    return (((unsigned long)pFrame->pppData[y][x][0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 16 |
222
-           (((unsigned long)pFrame->pppData[y][x][1] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 8;
223
-  return (((unsigned long)pFrame->pppData[y][x][0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 16 |
224
-         (((unsigned long)pFrame->pppData[y][x][1] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 8 |
225
-         (((unsigned long)pFrame->pppData[y][x][2] * 255 + pFrame->maxval / 2) / pFrame->maxval);
223
+    return (((unsigned long)pFrame->ppData[y][i + 0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 16 |
224
+           (((unsigned long)pFrame->ppData[y][i + 1] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 8;
225
+  return (((unsigned long)pFrame->ppData[y][i + 0] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 16 |
226
+         (((unsigned long)pFrame->ppData[y][i + 1] * 255 + pFrame->maxval / 2) / pFrame->maxval) << 8 |
227
+         (((unsigned long)pFrame->ppData[y][i + 2] * 255 + pFrame->maxval / 2) / pFrame->maxval);
226 228
 }
227 229
 
228 230
 void BlinkenFrameSetColor( stBlinkenFrame * pFrame, int y, int x, unsigned long color )
... ...
@@ -234,30 +236,32 @@ void BlinkenFrameSetColor( stBlinkenFrame * pFrame, int y, int x, unsigned long
234 236
       x < 0 || x >= pFrame->width )
235 237
       return;
236 238
 
239
+  int i = x * pFrame->channels;
240
+
237 241
   alpha = (color >> 24) & 0xFF;
238 242
   alpha_ = 255 - alpha;
239 243
   if( pFrame->channels >= 1 )
240
-    pFrame->pppData[y][x][0] = (unsigned char)(( ((((color >> 16) & 0xFF) * pFrame->maxval + 127) / 255) * alpha
241
-                                               + (unsigned long)pFrame->pppData[y][x][0] * alpha_
244
+    pFrame->ppData[y][i + 0] = (unsigned char)(( ((((color >> 16) & 0xFF) * pFrame->maxval + 127) / 255) * alpha
245
+                                               + (unsigned long)pFrame->ppData[y][i + 0] * alpha_
242 246
                                                ) / 255);
243 247
   if( pFrame->channels >= 2 )
244
-    pFrame->pppData[y][x][1] = (unsigned char)(( ((((color >> 8) & 0xFF) * pFrame->maxval + 127) / 255) * alpha
245
-                                               + (unsigned long)pFrame->pppData[y][x][1] * alpha_
248
+    pFrame->ppData[y][i + 1] = (unsigned char)(( ((((color >> 8) & 0xFF) * pFrame->maxval + 127) / 255) * alpha
249
+                                               + (unsigned long)pFrame->ppData[y][i + 1] * alpha_
246 250
                                                ) / 255);
247 251
   if( pFrame->channels >= 3 )
248
-    pFrame->pppData[y][x][2] = (unsigned char)(( (((color & 0xFF) * pFrame->maxval + 127) / 255) * alpha
249
-                                               + (unsigned long)pFrame->pppData[y][x][2] * alpha_
252
+    pFrame->ppData[y][i + 2] = (unsigned char)(( (((color & 0xFF) * pFrame->maxval + 127) / 255) * alpha
253
+                                               + (unsigned long)pFrame->ppData[y][i + 2] * alpha_
250 254
                                                ) / 255);
251 255
   for( c = 3; c < pFrame->channels; c++ )
252
-    pFrame->pppData[y][x][c] = (unsigned char)(( 0
253
-                                               + (unsigned long)pFrame->pppData[y][x][c] * alpha_
256
+    pFrame->ppData[y][i + c] = (unsigned char)(( 0
257
+                                               + (unsigned long)pFrame->ppData[y][i + c] * alpha_
254 258
                                                ) / 255);
255 259
 }
256 260
 
257 261
 void BlinkenFrameResize( stBlinkenFrame * pFrame, int height, int width, int channels, int maxval )
258 262
 {
259
-  unsigned char * * * pppData;
260
-  int y, x, c;
263
+  unsigned char * * ppData;
264
+  int y, x, c, i, j;
261 265
   int emptyY, emptyX, skipY, skipX, rangeY, rangeX;
262 266
   unsigned long val, div;
263 267
 
... ...
@@ -280,13 +284,13 @@ void BlinkenFrameResize( stBlinkenFrame * pFrame, int height, int width, int cha
280 284
     return;
281 285
 
282 286
   //allocate new data array
283
-  pppData = (unsigned char * * *)malloc3D( height, width, channels, sizeof( unsigned char ) );
284
-  if( pppData == NULL )
287
+  ppData = (unsigned char * *)malloc2D( height, width * channels, sizeof( unsigned char ) );
288
+  if( ppData == NULL )
285 289
     return;
286 290
   for( y = 0; y < height; y++ )
287
-    for( x = 0; x < width; x++ )
288
-      for( c = 0; c < channels; c++ )
289
-        pppData[y][x][c] = 0;
291
+    for( x = 0, i = 0; x < width; x++ )
292
+      for( c = 0; c < channels; c++, i++ )
293
+        ppData[y][i] = 0;
290 294
 
291 295
   //get number of pixels to skip / to leave empty in X and Y direction
292 296
   if( height > pFrame->height )
... ...
@@ -319,22 +323,24 @@ void BlinkenFrameResize( stBlinkenFrame * pFrame, int height, int width, int cha
319 323
   {
320 324
     for( x = 0; x < rangeX; x++ )
321 325
     {
326
+      i = (skipX + x) * pFrame->channels;
327
+      j = (emptyX + x) * channels;
322 328
       if( channels >= pFrame->channels ) //add channels: copy last channel into new channels
323 329
       {
324
-        for( c = 0; c < pFrame->channels; c++ )
325
-          pppData[emptyY + y][emptyX + x][c] = (unsigned char)(((unsigned long)pFrame->pppData[skipY + y][skipX + x][c] * maxval + pFrame->maxval / 2) / pFrame->maxval);
326
-        for( ; c < channels; c++ )
327
-          pppData[emptyY + y][emptyX + x][c] = pppData[emptyY + y][emptyX + x][pFrame->channels - 1];
330
+        for( c = 0; c < pFrame->channels; c++, i++, j++ )
331
+          ppData[emptyY + y][j] = (unsigned char)(((unsigned long)pFrame->ppData[skipY + y][i] * maxval + pFrame->maxval / 2) / pFrame->maxval);
332
+        for( ; c < channels; c++, j++ )
333
+          ppData[emptyY + y][j] = ppData[emptyY + y][j - 1];
328 334
       }
329 335
       else //remove channels: merge leftover channels with last kept channel
330 336
       {
331 337
         val = 0;
332
-        for( c = 0; c < channels - 1; c++ )
333
-          pppData[emptyY + y][emptyX + x][c] = (unsigned char)(((unsigned long)pFrame->pppData[skipY + y][skipX + x][c] * maxval + pFrame->maxval / 2) / pFrame->maxval);
334
-        for( c = channels - 1; c < pFrame->channels; c++ )
335
-          val += (unsigned long)pFrame->pppData[skipY + y][skipX + x][c];
338
+        for( c = 0; c < channels - 1; c++, i++, j++ )
339
+          ppData[emptyY + y][j] = (unsigned char)(((unsigned long)pFrame->ppData[skipY + y][i] * maxval + pFrame->maxval / 2) / pFrame->maxval);
340
+        for( c = channels - 1; c < pFrame->channels; c++, i++ )
341
+          val += (unsigned long)pFrame->ppData[skipY + y][i];
336 342
         div = pFrame->maxval * (pFrame->channels - channels + 1);
337
-        pppData[emptyY + y][emptyX + x][channels - 1] = (unsigned char)((val * maxval + div / 2) / div);
343
+        ppData[emptyY + y][j++] = (unsigned char)((val * maxval + div / 2) / div);
338 344
       }
339 345
     }
340 346
   }
... ...
@@ -343,15 +349,15 @@ void BlinkenFrameResize( stBlinkenFrame * pFrame, int height, int width, int cha
343 349
   pFrame->width = width;
344 350
   pFrame->channels = channels;
345 351
   pFrame->maxval = maxval;
346
-  free( pFrame->pppData );
347
-  pFrame->pppData = pppData;
352
+  free( pFrame->ppData );
353
+  pFrame->ppData = ppData;
348 354
 }
349 355
 
350 356
 void BlinkenFrameScale( stBlinkenFrame * pFrame, int height, int width )
351 357
 {
352
-  unsigned char * * * pppData;
358
+  unsigned char * * ppData;
353 359
   double scaleHor, scaleVer, ox, oy, ox1, oy1, val;
354
-  int c, nx, ny, x, y, oxi, oyi, ox1i, oy1i;
360
+  int chans, c, nx, ny, x, y, oxi, oyi, ox1i, oy1i;
355 361
 
356 362
   if( pFrame == NULL )
357 363
     return;
... ...
@@ -369,12 +375,13 @@ void BlinkenFrameScale( stBlinkenFrame * pFrame, int height, int width )
369 375
   scaleVer = (double)height / (double)pFrame->height;
370 376
 
371 377
   //allocate new data array
372
-  pppData = (unsigned char * * *)malloc3D( height, width, pFrame->channels, sizeof( unsigned char ) );
373
-  if( pppData == NULL )
378
+  ppData = (unsigned char * *)malloc2D( height, width * pFrame->channels, sizeof( unsigned char ) );
379
+  if( ppData == NULL )
374 380
     return;
375 381
 
376 382
   //scale every channel
377
-  for( c = 0; c < pFrame->channels; c++ )
383
+  chans = pFrame->channels;
384
+  for( c = 0; c < chans; c++ )
378 385
   {
379 386
     for( ny = 0; ny < height; ny++ )
380 387
     {
... ...
@@ -385,7 +392,7 @@ void BlinkenFrameScale( stBlinkenFrame * pFrame, int height, int width )
385 392
         oy1 = (double)(ny + 1) / scaleVer - 0.000001;
386 393
         ox1 = (double)(nx + 1) / scaleHor - 0.000001;
387 394
         if( oy < 0 || ox < 0 || oy1 >= pFrame->height || ox1 >= pFrame->width) //out of old picture
388
-          pppData[ny][nx][c] = 0;
395
+          ppData[ny][nx * chans + c] = 0;
389 396
         else
390 397
         {
391 398
           oyi = (int)oy;
... ...
@@ -396,14 +403,14 @@ void BlinkenFrameScale( stBlinkenFrame * pFrame, int height, int width )
396 403
           {
397 404
             if( oxi == ox1i) //one source pixel
398 405
             {
399
-              val = (double)pFrame->pppData[oyi][oxi][c];
406
+              val = (double)pFrame->ppData[oyi][oxi * chans + c];
400 407
             }
401 408
             else //one line of source pixels
402 409
             {
403
-              val = (double)pFrame->pppData[oyi][oxi][c] * (1 - ox + oxi)
404
-                  + (double)pFrame->pppData[oyi][ox1i][c] * (ox1 - ox1i);
410
+              val = (double)pFrame->ppData[oyi][oxi * chans + c] * (1 - ox + oxi)
411
+                  + (double)pFrame->ppData[oyi][ox1i * chans + c] * (ox1 - ox1i);
405 412
               for( x = oxi + 1; x < ox1i; x++ )
406
-                val += (double)pFrame->pppData[oyi][x][c];
413
+                val += (double)pFrame->ppData[oyi][x * chans + c];
407 414
               val /= ox1 - ox;
408 415
             }
409 416
           }
... ...
@@ -411,35 +418,35 @@ void BlinkenFrameScale( stBlinkenFrame * pFrame, int height, int width )
411 418
           {
412 419
             if( oxi == ox1i )
413 420
             {
414
-              val = (double)pFrame->pppData[oyi][oxi][c] * (1 - oy + oyi)
415
-                  + (double)pFrame->pppData[oy1i][oxi][c] * (oy1 - oy1i);
421
+              val = (double)pFrame->ppData[oyi][oxi * chans + c] * (1 - oy + oyi)
422
+                  + (double)pFrame->ppData[oy1i][oxi * chans + c] * (oy1 - oy1i);
416 423
               for( y = oyi + 1; y < oy1i; y++ )
417
-                val += (double)pFrame->pppData[y][oxi][c];
424
+                val += (double)pFrame->ppData[y][oxi * chans + c];
418 425
               val /= oy1 - oy;
419 426
             }
420 427
             else //rectangle of source pixels
421 428
             {
422
-              val = (double)pFrame->pppData[oyi][oxi][c] * (1 - oy + oyi) * (1 - ox + oxi)
423
-                  + (double)pFrame->pppData[oyi][ox1i][c] * (1 - oy + oyi) * (ox1 - ox1i)
424
-                  + (double)pFrame->pppData[oy1i][oxi][c] * (oy1 - oy1i) * (1 - ox + oxi)
425
-                  + (double)pFrame->pppData[oy1i][ox1i][c] * (oy1 - oy1i) * (ox1 - ox1i);
429
+              val = (double)pFrame->ppData[oyi][oxi* chans + c] * (1 - oy + oyi) * (1 - ox + oxi)
430
+                  + (double)pFrame->ppData[oyi][ox1i * chans + c] * (1 - oy + oyi) * (ox1 - ox1i)
431
+                  + (double)pFrame->ppData[oy1i][oxi * chans + c] * (oy1 - oy1i) * (1 - ox + oxi)
432
+                  + (double)pFrame->ppData[oy1i][ox1i * chans + c] * (oy1 - oy1i) * (ox1 - ox1i);
426 433
               for( y = oyi + 1; y < oy1i; y++ )
427 434
               {
428
-                val += (double)pFrame->pppData[y][oxi][c] * (1 - ox + oxi)
429
-                     + (double)pFrame->pppData[y][ox1i][c] * (ox1 - ox1i);
435
+                val += (double)pFrame->ppData[y][oxi * chans + c] * (1 - ox + oxi)
436
+                     + (double)pFrame->ppData[y][ox1i * chans + c] * (ox1 - ox1i);
430 437
               }
431 438
               for( x = oxi + 1; x < ox1i; x++ )
432 439
               {
433
-                val += (double)pFrame->pppData[oyi][x][c] * (1 - oy + oyi)
434
-                     + (double)pFrame->pppData[oy1i][x][c] * (oy1 - oy1i);
440
+                val += (double)pFrame->ppData[oyi][x * chans + c] * (1 - oy + oyi)
441
+                     + (double)pFrame->ppData[oy1i][x * chans + c] * (oy1 - oy1i);
435 442
               }
436 443
               for( y = oyi + 1; y < oy1i; y++ )
437 444
                 for( x = oxi + 1; x < ox1i; x++ )
438
-                  val += (double)pFrame->pppData[y][x][c];
445
+                  val += (double)pFrame->ppData[y][x * chans + c];
439 446
               val /= (oy1 - oy) * (ox1 - ox);
440 447
             }
441 448
           }
442
-          pppData[ny][nx][c] = (unsigned char)(val + 0.5);
449
+          ppData[ny][nx * chans + c] = (unsigned char)(val + 0.5);
443 450
         }
444 451
       } //for( nx ...
445 452
     } //for( ny ...
... ...
@@ -447,13 +454,13 @@ void BlinkenFrameScale( stBlinkenFrame * pFrame, int height, int width )
447 454
 
448 455
   pFrame->height = height;
449 456
   pFrame->width = width;
450
-  free( pFrame->pppData );
451
-  pFrame->pppData = pppData;
457
+  free( pFrame->ppData );
458
+  pFrame->ppData = ppData;
452 459
 }
453 460
 
454 461
 char * BlinkenFrameToString( stBlinkenFrame * pFrame )
455 462
 {
456
-  int size, y, x, c;
463
+  int size, y, x, c, i;
457 464
   char * str, * ptr;
458 465
   unsigned long val;
459 466
 
... ...
@@ -470,11 +477,11 @@ char * BlinkenFrameToString( stBlinkenFrame * pFrame )
470 477
   
471 478
   for( y = 0; y < pFrame->height; y++ )
472 479
   {
473
-    for( x = 0; x < pFrame->width; x++ )
480
+    for( x = 0, i = 0; x < pFrame->width; x++ )
474 481
     {
475 482
       val = 0;
476
-      for( val = 0, c = 0; c < pFrame->channels; c++ )
477
-        val += pFrame->pppData[y][x][c];
483
+      for( val = 0, c = 0; c < pFrame->channels; c++, i++ )
484
+        val += pFrame->ppData[y][i];
478 485
       val = val * 7 / pFrame->maxval / pFrame->channels;
479 486
       *ptr = " -+*%#&@"[val];
480 487
       ptr++;
... ...
@@ -491,7 +498,7 @@ char * BlinkenFrameToString( stBlinkenFrame * pFrame )
491 498
 int BlinkenFrameToNetwork( stBlinkenFrame * pFrame, etBlinkenProto proto, char * pData, int maxLength )
492 499
 //returns length or -1 on error
493 500
 {
494
-  int y, x, c, i, val;
501
+  int y, x, c, i, j, val;
495 502
 
496 503
   if( pFrame == NULL )
497 504
     return -1;
... ...
@@ -512,11 +519,11 @@ int BlinkenFrameToNetwork( stBlinkenFrame * pFrame, etBlinkenProto proto, char *
512 519
       i = sizeof( stBlinkenProtoBlpHdr ); //put data into packet
513 520
       for( y = 0; y < pFrame->height; y++ )
514 521
       {
515
-        for( x = 0; x < pFrame->width; x++, i++ )
522
+        for( x = 0, j = 0; x < pFrame->width; x++, i++ )
516 523
         {
517 524
            val = 0;
518
-           for( c = 0; c < pFrame->channels; c++ )
519
-             val += pFrame->pppData[y][x][c];
525
+           for( c = 0; c < pFrame->channels; c++, j++ )
526
+             val += pFrame->ppData[y][j];
520 527
            pData[i] = (val >= pFrame->channels * pFrame->maxval / 2 ? 0x01 : 0x00);
521 528
         }
522 529
       }
... ...
@@ -532,11 +539,11 @@ int BlinkenFrameToNetwork( stBlinkenFrame * pFrame, etBlinkenProto proto, char *
532 539
       i = sizeof( stBlinkenProtoEblpHdr ); //put data into packet
533 540
       for( y = 0; y < pFrame->height; y++ )
534 541
       {
535
-        for( x = 0; x < pFrame->width; x++, i++ )
542
+        for( x = 0, j = 0; x < pFrame->width; x++, i++ )
536 543
         {
537 544
            val = 0;
538
-           for( c = 0; c < pFrame->channels; c++ )
539
-             val += pFrame->pppData[y][x][c];
545
+           for( c = 0; c < pFrame->channels; c++, j++ )
546
+             val += pFrame->ppData[y][j];
540 547
            val /= pFrame->channels;
541 548
            pData[i] = (pFrame->maxval == 255 ? (unsigned char)val
542 549
                                              : (unsigned char)((val * 255 + pFrame->maxval / 2) / pFrame->maxval));
... ...
@@ -554,9 +561,9 @@ int BlinkenFrameToNetwork( stBlinkenFrame * pFrame, etBlinkenProto proto, char *
554 561
       ((stBlinkenProtoMcufHdr *)pData)->maxval = htons( pFrame->maxval );
555 562
       i = sizeof( stBlinkenProtoMcufHdr ); //put data into packet
556 563
       for( y = 0; y < pFrame->height; y++ )
557
-        for( x = 0; x < pFrame->width; x++ )
558
-           for( c = 0; c < pFrame->channels; c++, i++ )
559
-             pData[i] = pFrame->pppData[y][x][c];
564
+        for( x = 0, j = 0; x < pFrame->width; x++ )
565
+           for( c = 0; c < pFrame->channels; c++, i++, j++ )
566
+             pData[i] = pFrame->ppData[y][j];
560 567
       return i; //return length
561 568
 
562 569
     default:
... ...
@@ -569,7 +576,7 @@ stBlinkenFrame * BlinkenFrameFromNetwork( char * pData, int length, etBlinkenPro
569 576
 //returns protocol in *pProto if pProto not NULL
570 577
 {
571 578
   stBlinkenFrame * pFrame;
572
-  int height, width, channels, maxval, y, x, c, i;
579
+  int height, width, channels, maxval, y, x, c, i, j;
573 580
 
574 581
   if( length >= (int)sizeof( stBlinkenProtoBlpHdr ) &&
575 582
       ((stBlinkenProtoBlpHdr *)pData)->magic == htonl( BlinkenProtoBlpMagic ) )
... ...
@@ -586,10 +593,10 @@ stBlinkenFrame * BlinkenFrameFromNetwork( char * pData, int length, etBlinkenPro
586 593
     pFrame = BlinkenFrameNew( height, width, 1, 1, 0 ); //create frame according to header data
587 594
     if( pFrame == NULL )
588 595
       return NULL;
589
-    i = sizeof( stBlinkenProtoEblpHdr ); //put data into frame
596
+    i = sizeof( stBlinkenProtoBlpHdr ); //put data into frame
590 597
     for( y = 0; y < pFrame->height; y++ )
591 598
       for( x = 0; x < pFrame->width; x++, i++ )
592
-        pFrame->pppData[y][x][0] = pData[i];
599
+        pFrame->ppData[y][x * 1 + 0] = pData[i];
593 600
     return pFrame;
594 601
   }
595 602
 
... ...
@@ -611,7 +618,7 @@ stBlinkenFrame * BlinkenFrameFromNetwork( char * pData, int length, etBlinkenPro
611 618
     i = sizeof( stBlinkenProtoEblpHdr ); //put data into frame
612 619
     for( y = 0; y < pFrame->height; y++ )
613 620
       for( x = 0; x < pFrame->width; x++, i++ )
614
-        pFrame->pppData[y][x][0] = pData[i];
621
+        pFrame->ppData[y][x * 1 + 0] = pData[i];
615 622
     return pFrame;
616 623
   }
617 624
 
... ...
@@ -636,9 +643,9 @@ stBlinkenFrame * BlinkenFrameFromNetwork( char * pData, int length, etBlinkenPro
636 643
       return NULL;
637 644
     i = sizeof( stBlinkenProtoMcufHdr ); //put data into frame
638 645
     for( y = 0; y < pFrame->height; y++ )
639
-      for( x = 0; x < pFrame->width; x++ )
640
-        for( c = 0; c < pFrame->channels; c++, i++ )
641
-          pFrame->pppData[y][x][c] = pData[i];
646
+      for( x = 0, j = 0; x < pFrame->width; x++ )
647
+        for( c = 0; c < pFrame->channels; c++, i++, j++ )
648
+          pFrame->ppData[y][j] = pData[i];
642 649
     return pFrame;
643 650
   }
644 651
 
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -0,0 +1,194 @@
1
+/* BlinkenLib
2
+ * version 0.4 date 2005-07-02
3
+ * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4
+ * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5
+ * a blinkenarea.org project
6
+ * powered by eventphone.de
7
+ */
8
+
9
+#include <stdio.h>
10
+#include <stdlib.h>
11
+#include <string.h>
12
+#include <sys/types.h>
13
+#include <sys/socket.h>
14
+#include <netinet/in.h>
15
+#include <arpa/inet.h>
16
+
17
+#include "BlinkenLib.h"
18
+
19
+int main( int argCnt, char * * args )
20
+{
21
+  int i, udpSocket, bound, val, timeout;
22
+  char txt[64];
23
+  unsigned short port;
24
+  struct sockaddr_in addr;
25
+  stBlinkenMovie * pMovie;
26
+
27
+  //print info
28
+  printf( "BlinkenLib - BlinkenRecv\n"
29
+          "version 0.4 date 2005-07-02\n"
30
+          "Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>\n"
31
+          "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
32
+          "a blinkenarea.org project\n"
33
+          "powered by eventphone.de\n\n" );
34
+
35
+  //print syntax
36
+  if( argCnt <= 1 )
37
+  {
38
+    printf( "syntax: %s <parameter> [...]\n\n"
39
+            "parameters:\n"
40
+            "  -l [<ip>:]<port>\n"
41
+            "     local address (defaults to 0.0.0.0:2323)\n"
42
+            "     must occur before -r and -o, may only occur once\n"
43
+            "  -r <ip>[:<port>]\n"
44
+            "     remote addess (defaults to every remote address)\n"
45
+            "  -t <milliseconds>\n"
46
+            "     set timeout (to detect movie end, defaults to 5000)\n"
47
+            "  -o <file>\n"
48
+            "     receive movie and write it to file (*.blm, *.bmm, *.bml, *.bbm)\n\n",
49
+            args[0] );
50
+    return 0;
51
+  }
52
+
53
+  //create udp socket
54
+  udpSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
55
+  if( udpSocket == -1 )
56
+  {
57
+    printf( "cannot create UDP socket\n" );
58
+    return -1;
59
+  }
60
+  bound = 0;
61
+
62
+  //process parameters
63
+  timeout = 5000;
64
+  for( i = 1; i < argCnt; i++ )
65
+  {
66
+
67
+    //local address
68
+    if( strcmp( args[i], "-l" ) == 0 )
69
+    {
70
+      if( i + 1 < argCnt )
71
+      {
72
+        i++;
73
+        if( sscanf( args[i], "%32[0-9.]:%hu", txt, &port ) == 2 )
74
+        {
75
+          addr.sin_family = AF_INET;
76
+          addr.sin_port = htons( port );
77
+          addr.sin_addr.s_addr = inet_addr( txt );
78
+          if( bind( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
79
+            printf( "could not set local address to \"%s\"\n", args[i] );
80
+          else
81
+            bound = 1;
82
+        }
83
+        else if( sscanf( args[i], "%hu", &port ) == 1 )
84
+        {
85
+          addr.sin_family = AF_INET;
86
+          addr.sin_port = htons( port );
87
+          addr.sin_addr.s_addr = htonl( INADDR_ANY );
88
+          if( bind( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
89
+            printf( "could not set local address to \"%s\"\n", args[i] );
90
+          else
91
+            bound = 1;
92
+        }
93
+        else
94
+          printf( "invalid local address \"%s\"\n", args[i] );
95
+      }
96
+      else
97
+        printf( "missing local address for \"-l\"\n" );
98
+    }
99
+
100
+    //remote address
101
+    else if( strcmp( args[i], "-r" ) == 0 )
102
+    {
103
+      if( i + 1 < argCnt )
104
+      {
105
+        i++;
106
+        if( sscanf( args[i], "%32[0-9.]:%hu", txt, &port ) == 2 )
107
+        {
108
+          addr.sin_family = AF_INET;
109
+          addr.sin_port = htons( port );
110
+          addr.sin_addr.s_addr = inet_addr( txt );
111
+          if( connect( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
112
+            printf( "could not set remote address to \"%s\"\n", args[i] );
113
+        }
114
+        else if( sscanf( args[i], "%32[0-9.]", txt ) == 1 )
115
+        {
116
+          addr.sin_family = AF_INET;
117
+          addr.sin_port = htons( 23230 );
118
+          addr.sin_addr.s_addr = inet_addr( txt );
119
+          if( connect( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
120
+            printf( "could not set remote address to \"%s\"\n", args[i] );
121
+        }
122
+        else
123
+          printf( "invalid remote address \"%s\"\n", args[i] );
124
+      }
125
+      else
126
+        printf( "missing remote address for \"-r\"\n" );
127
+    }
128
+
129
+    //timeout
130
+    else if( strcmp( args[i], "-t" ) == 0 )
131
+    {
132
+      if( i + 1 < argCnt )
133
+      {
134
+        i++;
135
+        if( sscanf( args[i], "%hu", &val ) == 1 )
136
+          timeout = val;
137
+        else
138
+          printf( "invalid timeout value \"%s\"\n", args[i] );
139
+      }
140
+      else
141
+        printf( "missing timeout value for \"-t\"\n" );
142
+    }
143
+
144
+    //receive movie and write it to file
145
+    else if( strcmp( args[i], "-o" ) == 0 )
146
+    {
147
+      if( i + 1 < argCnt )
148
+      {
149
+        i++;
150
+        if( ! bound ) //try to bind if not bound
151
+        {
152
+          printf( "no local address to receive movie for file \"%s\" to,\n"
153
+                  "  using default local address \"0.0.0.0:2323\"\n", args[i] );
154
+          addr.sin_family = AF_INET;
155
+          addr.sin_port = htons( 2323 );
156
+          addr.sin_addr.s_addr = htonl( INADDR_ANY );
157
+          if( bind( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
158
+            printf( "could not set local address to \"0.0.0.0:2323\"\n" );
159
+          else
160
+            bound = 1;
161
+        }
162
+        if( bound )
163
+        {
164
+          printf( "receiving movie for file \"%s\"...\n", args[i] );
165
+          pMovie = BlinkenMovieReceive( udpSocket, timeout, NULL );
166
+          if( pMovie == NULL )
167
+            printf( "could not receive movie for file \"%s\"\n", args[i] );
168
+          else
169
+          {
170
+            if( BlinkenMovieSave( pMovie, args[i] ) < 0 )
171
+              printf( "could not write movie \"%s\"\n", args[i] );
172
+            else
173
+              printf( "movie \"%s\" written\n", args[i] );
174
+            BlinkenMovieFree( pMovie );
175
+          }
176
+        }
177
+        else
178
+          printf( "no local address set to receive movie for file \"%s\" on\n", args[i] );
179
+      }
180
+      else
181
+        printf( "missing output filename for \"-o\"\n" );
182
+    }
183
+
184
+    //unknown parameter
185
+    else
186
+      printf( "unknown parameter \"%s\", call without parameters to get help\n", args[i] );
187
+
188
+  } //for( i ...
189
+
190
+  //close socket
191
+  close( udpSocket );
192
+
193
+  return 0;
194
+}
... ...
@@ -0,0 +1,197 @@
1
+/* BlinkenLib
2
+ * version 0.4 date 2005-07-02
3
+ * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4
+ * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5
+ * a blinkenarea.org project
6
+ * powered by eventphone.de
7
+ */
8
+
9
+#include <stdio.h>
10
+#include <stdlib.h>
11
+#include <string.h>
12
+#include <sys/types.h>
13
+#include <sys/socket.h>
14
+#include <netinet/in.h>
15
+#include <arpa/inet.h>
16
+
17
+#include "BlinkenLib.h"
18
+
19
+int main( int argCnt, char * * args )
20
+{
21
+  int i, udpSocket, connected;
22
+  etBlinkenProto proto;
23
+  char txt[64];
24
+  unsigned short port;
25
+  struct sockaddr_in addr;
26
+  stBlinkenMovie * pMovie;
27
+
28
+  //print info
29
+  printf( "BlinkenLib - BlinkenSend\n"
30
+          "version 0.4 date 2005-07-02\n"
31
+          "Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>\n"
32
+          "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
33
+          "a blinkenarea.org project\n"
34
+          "powered by eventphone.de\n\n" );
35
+
36
+  //print syntax
37
+  if( argCnt <= 1 )
38
+  {
39
+    printf( "syntax: %s <parameter> [...]\n\n"
40
+            "parameters:\n"
41
+            "  -s [<ip>:]<port>\n"
42
+            "     source address (defaults to 0.0.0.0:0)\n"
43
+            "     must occur before -d and -i, may only occur once\n"
44
+            "  -d <ip>[:<port>]\n"
45
+            "     destination addess (defaults to 127.0.0.1:2323)\n"
46
+            "  -p [BLP|EBLP|MCUF]\n"
47
+            "     protocol to use (defaults to MCUF)\n"
48
+            "  -i <file>\n"
49
+            "     read movie from file (*.blm, *.bmm, *.bml, *.bbm) and send it\n\n",
50
+            args[0] );
51
+    return 0;
52
+  }
53
+
54
+  //create udp socket
55
+  udpSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
56
+  if( udpSocket == -1 )
57
+  {
58
+    printf( "cannot create UDP socket\n" );
59
+    return -1;
60
+  }
61
+  connected = 0;
62
+
63
+  //process parameters
64
+  proto = BlinkenProtoMcuf;
65
+  for( i = 1; i < argCnt; i++ )
66
+  {
67
+
68
+    //source address
69
+    if( strcmp( args[i], "-s" ) == 0 )
70
+    {
71
+      if( i + 1 < argCnt )
72
+      {
73
+        i++;
74
+        if( sscanf( args[i], "%32[0-9.]:%hu", txt, &port ) == 2 )
75
+        {
76
+          addr.sin_family = AF_INET;
77
+          addr.sin_port = htons( port );
78
+          addr.sin_addr.s_addr = inet_addr( txt );
79
+          if( bind( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
80
+            printf( "could not set source address to \"%s\"\n", args[i] );
81
+        }
82
+        else if( sscanf( args[i], "%hu", &port ) == 1 )
83
+        {
84
+          addr.sin_family = AF_INET;
85
+          addr.sin_port = htons( port );
86
+          addr.sin_addr.s_addr = htonl( INADDR_ANY );
87
+          if( bind( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
88
+            printf( "could not set source address to \"%s\"\n", args[i] );
89
+        }
90
+        else
91
+          printf( "invalid source address \"%s\"\n", args[i] );
92
+      }
93
+      else
94
+        printf( "missing source address for \"-s\"\n" );
95
+    }
96
+
97
+    //destination address
98
+    else if( strcmp( args[i], "-d" ) == 0 )
99
+    {
100
+      if( i + 1 < argCnt )
101
+      {
102
+        i++;
103
+        if( sscanf( args[i], "%32[0-9.]:%hu", txt, &port ) == 2 )
104
+        {
105
+          addr.sin_family = AF_INET;
106
+          addr.sin_port = htons( port );
107
+          addr.sin_addr.s_addr = inet_addr( txt );
108
+          if( connect( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
109
+            printf( "could not set destination address to \"%s\"\n", args[i] );
110
+          else
111
+            connected = 1;
112
+        }
113
+        else if( sscanf( args[i], "%32[0-9.]", txt ) == 1 )
114
+        {
115
+          addr.sin_family = AF_INET;
116
+          addr.sin_port = htons( 2323 );
117
+          addr.sin_addr.s_addr = inet_addr( txt );
118
+          if( connect( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
119
+            printf( "could not set destination address to \"%s\"\n", args[i] );
120
+          else
121
+            connected = 1;
122
+        }
123
+        else
124
+          printf( "invalid destination address \"%s\"\n", args[i] );
125
+      }
126
+      else
127
+        printf( "missing destination address for \"-d\"\n" );
128
+    }
129
+
130
+    //protocol to use
131
+    else if( strcmp( args[i], "-p" ) == 0 )
132
+    {
133
+      if( i + 1 < argCnt )
134
+      {
135
+        i++;
136
+        if( strcasecmp( args[i], "BLP" ) == 0 )
137
+          proto = BlinkenProtoBlp;
138
+        else if( strcasecmp( args[i], "EBLP" ) == 0 )
139
+          proto = BlinkenProtoEblp;
140
+        else if( strcasecmp( args[i], "MCUF" ) == 0 )
141
+          proto = BlinkenProtoMcuf;
142
+        else
143
+          printf( "unknown protocol \"%s\"\n", args[i] );
144
+      }
145
+      else
146
+        printf( "missing protocol for \"-p\"\n" );
147
+    }
148
+
149
+    //read movie and sent it
150
+    else if( strcmp( args[i], "-i" ) == 0 )
151
+    {
152
+      if( i + 1 < argCnt )
153
+      {
154
+        i++;
155
+        if( ! connected ) //try to connect if not yet connected
156
+        {
157
+          printf( "no destination address to sent movie \"%s\" to,\n"
158
+                  "  using default destination address \"127.0.0.1:2323\"\n", args[i] );
159
+          addr.sin_family = AF_INET;
160
+          addr.sin_port = htons( 2323 );
161
+          addr.sin_addr.s_addr = htonl( INADDR_LOOPBACK );
162
+          if( connect( udpSocket, (struct sockaddr *)&addr, sizeof( addr ) ) != 0 )
163
+            printf( "could not set destination address to \"127.0.0.1:2323\"\n" );
164
+          else
165
+            connected = 1;
166
+        }
167
+        if( connected )
168
+        {
169
+          pMovie = BlinkenMovieLoad( args[i] );
170
+          if( pMovie == NULL )
171
+            printf( "could not read movie \"%s\"\n", args[i] );
172
+          else
173
+          {
174
+            printf( "movie \"%s\" read - sending...\n", args[i] );
175
+            BlinkenMovieSend( pMovie, udpSocket, proto );
176
+            printf( "movie \"%s\" sent\n", args[i] );
177
+            BlinkenMovieFree( pMovie );
178
+          }
179
+        }
180
+        else
181
+          printf( "no destination address to sent movie \"%s\" to\n", args[i] );
182
+      }
183
+      else
184
+        printf( "missing input filename for \"-i\"\n" );
185
+    }
186
+
187
+    //unknown parameter
188
+    else
189
+      printf( "unknown parameter \"%s\", call without parameters to get help\n", args[i] );
190
+
191
+  } //for( i ...
192
+
193
+  //close socket
194
+  close( udpSocket );
195
+
196
+  return 0;
197
+}
... ...
@@ -1,3 +1,7 @@
1
+0.4 2005-07-02
2
+--------------
3
+changed pppData[y][x][c] to ppData[y][x * channels + c]
4
+
1 5
 0.3.1 2005-03-05
2 6
 ----------------
3 7
 loading *.bml: channels="1" is now default
... ...
@@ -1,5 +1,5 @@
1 1
 # BlinkenLib
2
-# version 0.3.1 date 2005-03-05
2
+# version 0.4 date 2005-07-02
3 3
 # Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
 # Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
 # a blinkenarea.org project
... ...
@@ -10,6 +10,7 @@ CFLAGS=-W -Wall -O2
10 10
 LFLAGS=
11 11
 AR=ar
12 12
 ARFLAGS=cr
13
+RANLIB=ranlib
13 14
 
14 15
 .phony: all clean
15 16
 
... ...
@@ -26,6 +27,7 @@ Tools.o: Tools.c Tools.h
26 27
 
27 28
 BlinkenLib.a: BlinkenFrame.o BlinkenMovie.o Tools.o
28 29
 	$(AR) $(ARFLAGS) BlinkenLib.a BlinkenFrame.o BlinkenMovie.o Tools.o
30
+	$(RANLIB) BlinkenLib.a
29 31
 
30 32
 BlinkenConv: BlinkenConv.c BlinkenLib.h BlinkenLib.a
31 33
 	$(CC) $(LFLAGS) -o BlinkenConv BlinkenConv.c BlinkenLib.a
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.3.1 date 2005-03-05
2
+ * version 0.4 date 2005-07-02
3 3
  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6 6