BlinkenLib v.0.6.0 (2008-05-15)
Christian Heimke

Christian Heimke commited on 2011-07-15 09:08:32
Showing 22 changed files, with 716 additions and 41 deletions.

... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
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.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
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.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
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.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -9,7 +9,6 @@
9 9
 #include <stdlib.h>
10 10
 #include <string.h>
11 11
 
12
-#include <BlinkenLib/BlinkenColorizer.h>
13 12
 #include <BlinkenLib/BlinkenLib.h>
14 13
 
15 14
 int main( int argCnt, char * * args )
... ...
@@ -22,7 +21,8 @@ int main( int argCnt, char * * args )
22 21
 
23 22
   //print info
24 23
   printf( "BlinkenLib - BlinkenConv\n"
25
-          "version 0.5.5 date 2008-03-29\n"
24
+          "version 0.6.0 date 2008-05-15\n"
25
+          "config "BLINKENLIB_CONFIG"\n"
26 26
           "Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>\n"
27 27
           "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
28 28
           "a blinkenarea.org project\n\n" );
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -267,6 +267,32 @@ void BlinkenFrameSetColor( stBlinkenFrame * pFrame, int y, int x, unsigned long
267 267
                                                ) / 255);
268 268
 }
269 269
 
270
+int BlinkenFrameIsEmpty( stBlinkenFrame * pFrame )
271
+//returns 1 if frame is empty (i.e. black), returns 0 otherwise
272
+{
273
+  int y, x, c, i;
274
+
275
+  if( pFrame == NULL )
276
+    return 0;
277
+
278
+  for( y = 0; y < pFrame->height; y++ ) {
279
+    for( x = 0, i = 0; x < pFrame->width; x++ ) {
280
+      for( c = 0; c < pFrame->channels; c++, i++ ) {
281
+        if( pFrame->ppData[y][i] != 0 )
282
+          break; //pixel is not black -> abort
283
+      }
284
+      if( c < pFrame->channels )
285
+        break;
286
+    }
287
+    if( x < pFrame->width )
288
+      break;
289
+  }
290
+  if( y < pFrame->height )
291
+    return 0; //aborted somewhere -> at least ony pixel is not black
292
+  else
293
+    return 1; //not aborted -> all pixels are black
294
+}
295
+
270 296
 int BlinkenFrameCompare( stBlinkenFrame * pFrame1, stBlinkenFrame * pFrame2 )
271 297
 //returns -1 for frame1 smaller, 0 for equal, 1 for frame2 smaller
272 298
 {
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -34,6 +34,9 @@ void BlinkenFrameSetPixel( stBlinkenFrame * pFrame, int y, int x, int c, unsigne
34 34
 unsigned long BlinkenFrameGetColor( stBlinkenFrame * pFrame, int y, int x );
35 35
 void BlinkenFrameSetColor( stBlinkenFrame * pFrame, int y, int x, unsigned long color );
36 36
 
37
+int BlinkenFrameIsEmpty( stBlinkenFrame * pFrame );
38
+//returns 1 if frame is empty (i.e. black), returns 0 otherwise
39
+
37 40
 int BlinkenFrameCompare( stBlinkenFrame * pFrame1, stBlinkenFrame * pFrame2 );
38 41
 //returns -1 for frame1 smaller, 0 for equal, 1 for frame2 smaller
39 42
 
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
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
 #ifndef INC_BlinkenLib_BlinkenLib
9 9
 #define INC_BlinkenLib_BlinkenLib
10 10
 
11
+#include <BlinkenLib/config.h>
11 12
 #include <BlinkenLib/BlinkenColorizer.h>
12 13
 #include <BlinkenLib/BlinkenMovie.h>
13 14
 #include <BlinkenLib/BlinkenFrame.h>
... ...
@@ -0,0 +1,502 @@
1
+/* BlinkenLib
2
+ * version 0.6.0 date 2008-05-15
3
+ * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4
+ * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5
+ * a blinkenarea.org project
6
+ */
7
+
8
+#include <stdio.h>
9
+#include <stdlib.h>
10
+#include <strings.h>
11
+
12
+#include <zlib.h>
13
+
14
+#define MNG_INCLUDE_WRITE_PROCS
15
+#define MNG_ACCESS_CHUNKS
16
+#define MNG_SUPPORT_READ
17
+#define MNG_SUPPORT_DISPLAY
18
+#define MNG_SUPPORT_WRITE
19
+#include <libmng.h>
20
+
21
+#include <BlinkenLib/config.h>
22
+#include <BlinkenLib/BlinkenConstants.h>
23
+#include <BlinkenLib/BlinkenFrame.h>
24
+#include <BlinkenLib/BlinkenMovie.h>
25
+#include <BlinkenLib/BlinkenMng.h>
26
+
27
+// type for state of the MNG read/write process
28
+typedef struct _BlMng_userdata {
29
+  FILE * hFile; // handle of open file
30
+  unsigned int width; // size of canvas
31
+  unsigned int height;
32
+  unsigned char * canvas; // canvas (i.e. pixel data, size is height * width * 3)
33
+  unsigned int counter_msec; // current number of milliseconds
34
+  unsigned int timer_msec; // the MNG library will be called after this number of milliseconds
35
+  stBlinkenMovie * movie; // movie being created
36
+} BlMng_userdata;
37
+
38
+mng_ptr BlMng_alloc( mng_size_t iSize )
39
+{
40
+  void * ptr = malloc( iSize );
41
+  if( ptr != NULL )
42
+    memset( ptr, 0, iSize );
43
+  return (mng_ptr)ptr;
44
+}
45
+
46
+void BlMng_free( mng_ptr pPtr, mng_size_t __attribute__(( unused )) iSize )
47
+{
48
+  free( pPtr );
49
+}
50
+
51
+mng_bool BlMng_openstream( mng_handle __attribute__(( unused )) hMNG )
52
+{
53
+  return MNG_TRUE;
54
+}
55
+
56
+mng_bool BlMng_closestream( mng_handle __attribute__(( unused )) hMNG )
57
+{
58
+  return MNG_TRUE;
59
+}
60
+
61
+// read data from the open file
62
+mng_bool BlMng_readdata( mng_handle hMNG, mng_ptr pBuf, mng_uint32 iSize, mng_uint32 * iRead )
63
+{
64
+  BlMng_userdata * data = (BlMng_userdata *)mng_get_userdata( hMNG );
65
+  *iRead = fread( pBuf, 1, iSize, data->hFile );
66
+  return MNG_TRUE;
67
+}
68
+
69
+// write data to the open file
70
+mng_bool BlMng_writedata( mng_handle hMNG, mng_ptr pBuf, mng_uint32 iSize, mng_uint32 * iWritten )
71
+{
72
+  BlMng_userdata * data = (BlMng_userdata *)mng_get_userdata( hMNG );
73
+  *iWritten = fwrite( pBuf, 1, iSize, data->hFile );
74
+  return MNG_TRUE;
75
+}
76
+
77
+// MNG library has processed the header information
78
+mng_bool BlMng_processheader( mng_handle hMNG, mng_uint32 iWidth, mng_uint32 iHeight )
79
+{
80
+  BlMng_userdata * data = (BlMng_userdata *)mng_get_userdata( hMNG );
81
+
82
+  // free old canvas (in case there is already one)
83
+  if( data->canvas != NULL ) {
84
+    free( data->canvas );
85
+    data->canvas = NULL;
86
+    printf( "</blm>\n" );
87
+  }
88
+
89
+  // free old movie
90
+  if( data->movie ) {
91
+    BlinkenMovieFree( data->movie );
92
+    data->movie = NULL;
93
+  }
94
+
95
+  // remember dimensions and allocate new canvas
96
+  data->width = iWidth;
97
+  data->height = iHeight;
98
+  data->canvas = (unsigned char *)malloc( iHeight * iWidth * 3 );
99
+  if( data->canvas == NULL )
100
+    return MNG_FALSE;
101
+  data->counter_msec = 0;
102
+  data->timer_msec = 0;
103
+
104
+  // create new empty movie
105
+  data->movie = BlinkenMovieNew( iHeight, iWidth, 3, 255 ); // always 24 bit RGB
106
+  if( data->movie == NULL )
107
+    return MNG_FALSE;
108
+
109
+  return  MNG_TRUE;
110
+}
111
+
112
+// get access to a line of the canvas
113
+mng_ptr BlMng_getcanvasline( mng_handle hMNG, mng_uint32 iLinenr )
114
+{
115
+  BlMng_userdata * data = (BlMng_userdata *)mng_get_userdata( hMNG );
116
+
117
+  // return pointer to line
118
+  if( iLinenr < data->height )
119
+    return (mng_ptr)(data->canvas + iLinenr * data->width * 3);
120
+  else
121
+    return (mng_ptr)NULL;
122
+}
123
+
124
+// the MNG library thinks that (a part of) the canvas should be shown
125
+mng_bool BlMng_refresh( mng_handle __attribute__(( unused )) hMNG, mng_uint32 __attribute__(( unused )) iX, mng_uint32 __attribute__(( unused )) iY, mng_uint32 __attribute__(( unused )) iWidth, mng_uint32 __attribute__(( unused )) iHeight )
126
+{
127
+  // nothing to do here for BlinkenLib as we are only converting and not displaying
128
+  return MNG_TRUE;
129
+}
130
+
131
+// the MNG library want to know how many milliseconds have passed
132
+mng_uint32 BlMng_gettickcount( mng_handle hMNG )
133
+{
134
+  BlMng_userdata * data = (BlMng_userdata *)mng_get_userdata( hMNG );
135
+
136
+  // just return the current number of milliseconds (only converting, do not use real time for this)
137
+  return data->counter_msec;
138
+}
139
+
140
+// the MNG library wants to be be called again after some milliseconds
141
+mng_bool BlMng_settimer( mng_handle hMNG, mng_uint32 iMsecs )
142
+{
143
+  BlMng_userdata * data = (BlMng_userdata *)mng_get_userdata( hMNG );
144
+
145
+  // just remember the number of milliseconds
146
+  data->timer_msec = iMsecs;
147
+
148
+  return MNG_TRUE;
149
+}
150
+
151
+// save as new frame to current movie
152
+void BlMng_save_frame( stBlinkenMovie * movie, unsigned int msec, unsigned int width, unsigned int height, unsigned char * data )
153
+{
154
+  stBlinkenFrame * frame;
155
+  unsigned int c, x, y;
156
+
157
+  // check that a movie is present
158
+  if( movie == NULL )
159
+    return;
160
+
161
+  // create new frame (24 bit RGB)
162
+  frame = BlinkenFrameNew( height, width, 3, 255, msec );
163
+  if( frame == NULL )
164
+    return;
165
+
166
+  // set pixels of frame
167
+  for( y = 0; y < height; y++ ) {
168
+    for( x = 0; x < width; x++ ) {
169
+      for( c = 0; c < 3; c++ ) {
170
+        BlinkenFrameSetPixel( frame, y, x, c, *data );
171
+        data++;
172
+      }
173
+    }
174
+  }
175
+
176
+  // append frame to movie
177
+  if( BlinkenMovieAppendFrame( movie, frame ) != 0 )
178
+    BlinkenFrameFree( frame );
179
+}
180
+
181
+// compress pixel data in a frame
182
+void BlMng_compress_frame( stBlinkenFrame * frame, unsigned char * * p_out_ptr, unsigned int * p_out_len )
183
+{
184
+  unsigned int width = BlinkenFrameGetWidth( frame );
185
+  unsigned int height = BlinkenFrameGetHeight( frame );
186
+  // channels is always 3, maxval is always 255 - this function is only called with frames from moivies with those parameters
187
+  unsigned int row_stride, raw_len, y, x, c;
188
+  unsigned char * raw_ptr, * ptr, * out_ptr;
189
+  unsigned long out_len;
190
+
191
+  // assemble raw data to compress
192
+  row_stride = width * 3 + 1; // rows are preceeded by filter ID
193
+  raw_len = row_stride * height;
194
+  raw_ptr = (unsigned char *)malloc( raw_len );
195
+  ptr = raw_ptr;
196
+  for( y = 0; y < height; y++ ) {
197
+    // filter ID
198
+    *ptr = MNG_FILTER_NONE; // no filtering
199
+    ptr++;
200
+    // pixel data of row
201
+    for( x = 0; x < width; x++ ) {
202
+      for( c = 0; c < 3; c++ ) {
203
+        *ptr = BlinkenFrameGetPixel( frame, y, x, c );
204
+        ptr++;
205
+      }
206
+    }
207
+  } // for( y ...
208
+
209
+  // compress data
210
+  out_len = raw_len + (raw_len + 999) / 1000 + 12; // must be at least <source length> * 1.001 + 12
211
+  out_ptr = (unsigned char *)malloc( out_len );
212
+  compress2( out_ptr, &out_len, raw_ptr, raw_len, Z_BEST_COMPRESSION );
213
+  free( raw_ptr );
214
+
215
+  // return allocated compressed data
216
+  *p_out_ptr = out_ptr;
217
+  *p_out_len = (unsigned int)out_len;
218
+}
219
+
220
+
221
+
222
+// load a MNG file as BlinkenMovie
223
+stBlinkenMovie * BlinkenMngLoad( char * pFilename )
224
+{
225
+  BlMng_userdata * data;
226
+  mng_handle hMNG;
227
+  stBlinkenMovie * movie = NULL;
228
+
229
+  if( pFilename == NULL )
230
+    return NULL;
231
+
232
+  // create new structure for state of operation
233
+  data = (BlMng_userdata *)malloc( sizeof( BlMng_userdata ) );
234
+  if( data != NULL ) {
235
+    data->hFile = NULL;
236
+    data->width = 0;
237
+    data->height = 0;
238
+    data->canvas = NULL;
239
+    data->movie = NULL;
240
+
241
+    // open MNG file for reading
242
+    data->hFile = fopen( pFilename, "rb" );
243
+    if( data->hFile != NULL ) {
244
+
245
+      // initialize MNG library
246
+      hMNG = mng_initialize( (mng_ptr)data, BlMng_alloc, BlMng_free, MNG_NULL );
247
+      if( hMNG ) {
248
+
249
+        // set MNG callbacks
250
+        if( mng_setcb_openstream( hMNG, BlMng_openstream ) == 0 &&
251
+            mng_setcb_closestream( hMNG, BlMng_closestream ) == 0 &&
252
+            mng_setcb_readdata( hMNG, BlMng_readdata ) == 0 &&
253
+            mng_setcb_processheader( hMNG, BlMng_processheader ) == 0 &&
254
+            mng_setcb_getcanvasline( hMNG, BlMng_getcanvasline ) == 0 &&
255
+            mng_setcb_refresh( hMNG, BlMng_refresh ) == 0 &&
256
+            mng_setcb_gettickcount( hMNG, BlMng_gettickcount ) == 0 &&
257
+            mng_setcb_settimer( hMNG, BlMng_settimer ) == 0 &&
258
+            mng_set_canvasstyle( hMNG, MNG_CANVAS_RGB8 ) == 0 ) {
259
+
260
+          // read MNG file to memory
261
+          if( mng_read( hMNG ) == 0 ) {
262
+
263
+            // start "displaying"
264
+            mng_retcode iRC = mng_display( hMNG );
265
+            if( iRC == 0 || iRC == MNG_NEEDTIMERWAIT ) {
266
+
267
+              // "display" loop
268
+              int b_saved = 0;
269
+              while( iRC == MNG_NEEDTIMERWAIT && data->timer_msec > 0 ) {
270
+
271
+                // save fame to movie
272
+                BlMng_save_frame( data->movie, data->timer_msec, data->width, data->height, data->canvas );
273
+                b_saved = 1;
274
+
275
+                // let requeired time elapse for MNG library
276
+                data->counter_msec += data->timer_msec;
277
+                data->timer_msec = 0;
278
+
279
+                // "display" next frame
280
+                iRC = mng_display_resume( hMNG );
281
+                if( iRC != 0 && iRC != MNG_NEEDTIMERWAIT )
282
+                  break;
283
+
284
+              } // while( iRC == MNG_NEEDTIMERWAIT && data->timer_msec > 0 )
285
+
286
+              // save single frame if no frame saved yet (i.e. not an animated MNG image)
287
+              if( ! b_saved )
288
+                BlMng_save_frame( data->movie, data->timer_msec, data->width, data->height, data->canvas );
289
+
290
+              // if movie has more than one frame and the last frame is empty with duration of 1ms, remove last frame
291
+              //  - a black frame with 1ms duration is inserted by MNG library when MNG requests to clean canvas after displaying
292
+              //    - the reqauest to clear canvas after end of MNG anmation is needed to preserve duration of last frame (when converting from native format to MNG)
293
+              //  - remove this frame that is created by the described side effect
294
+              {
295
+                unsigned int frame_cnt = BlinkenMovieGetFrameCnt( data->movie );
296
+                if( frame_cnt >= 1 ) {
297
+                  stBlinkenFrame * frame = BlinkenMovieGetFrame( data->movie, frame_cnt - 1 );
298
+                  if( frame != NULL && BlinkenFrameIsEmpty( frame ) )
299
+                    BlinkenMovieDeleteFrame( data->movie, frame_cnt - 1 );
300
+                }
301
+              }
302
+
303
+              // stop "displaying"
304
+              mng_display_freeze( hMNG );
305
+
306
+            } // if( iRC == 0 || iRC == MNG_NEEDTIMERWAIT )
307
+
308
+          } // if( mng_read( ... ) == 0 )
309
+ 
310
+        } // if( mng_setcb_... )
311
+  
312
+        // shutdown MNG library
313
+        mng_cleanup( &hMNG );
314
+
315
+      } // if( hMNG )
316
+
317
+      // close file
318
+      fclose( data->hFile );
319
+
320
+    } // if( data->hFile != NULL )
321
+
322
+    // fetch created movie from state
323
+    movie = data->movie;
324
+    data->movie = NULL;
325
+
326
+    // free data structure for state
327
+    if( data->canvas != NULL )
328
+      free( data->canvas );
329
+    free( data );
330
+
331
+  } // if( data != NULL )
332
+
333
+  return movie;
334
+}
335
+
336
+int BlinkenMngSave( stBlinkenMovie * pMovie, char * pFilename )
337
+{
338
+  BlMng_userdata * data;
339
+  mng_handle hMNG;
340
+  int b_success = 0;
341
+
342
+  if( pMovie == NULL || pFilename == NULL )
343
+    return -1;
344
+
345
+  // create new structure for state of operation
346
+  data = (BlMng_userdata *)malloc( sizeof( BlMng_userdata ) );
347
+  if( data != NULL ) {
348
+    data->hFile = NULL;
349
+    data->width = BlinkenMovieGetWidth( pMovie );
350
+    data->height = BlinkenMovieGetHeight( pMovie );
351
+    data->canvas = NULL;
352
+    data->movie = NULL;
353
+
354
+    // convert movie to suitable format
355
+    data->movie = BlinkenMovieClone( pMovie );
356
+    if( data->movie != NULL ) {
357
+      BlinkenMovieResize( data->movie, data->height, data->width, 3, 255 );
358
+
359
+      // open MNG file for writing
360
+      data->hFile = fopen( pFilename, "wb" );
361
+      if( data->hFile != NULL ) {
362
+
363
+        // initialize MNG library
364
+        hMNG = mng_initialize( (mng_ptr)data, BlMng_alloc, BlMng_free, MNG_NULL );
365
+        if( hMNG ) {
366
+
367
+          // set MNG callbacks
368
+          if( mng_setcb_openstream( hMNG, BlMng_openstream ) == 0 &&
369
+              mng_setcb_closestream( hMNG, BlMng_closestream ) == 0 &&
370
+              mng_setcb_writedata( hMNG, BlMng_writedata ) == 0 ) {
371
+
372
+            // create new MNG image in memory
373
+            if( mng_create( hMNG ) == 0 ) {
374
+
375
+              // write MNG chunks
376
+              do {
377
+                unsigned int frame_cnt = BlinkenMovieGetFrameCnt( data->movie );
378
+                unsigned int total_duration = BlinkenMovieGetDuration( data->movie );
379
+                unsigned int frame_no;
380
+
381
+                // write MG header chunks
382
+                if( mng_putchunk_mhdr( hMNG,
383
+                                       data->width, data->height, // dimensions
384
+                                       1000, 0, frame_cnt, total_duration, // ticks per second, layer, frame count, duration
385
+                                       MNG_SIMPLICITY_VALID | MNG_SIMPLICITY_SIMPLEFEATURES | MNG_SIMPLICITY_COMPLEXFEATURES // simplicity
386
+                                     ) != 0 )
387
+                  break;
388
+
389
+                if( mng_putchunk_save( hMNG,
390
+                                       MNG_TRUE, // empty SAVE chunk
391
+                                       0, 0 // no offset, no count
392
+                                     ) != 0 )
393
+                  break;
394
+
395
+                // tell MNG player to clear canvas after end of MNG animation
396
+                //  - this is needed to preserve duration of last frame
397
+                //  - this results in a black frame with 1ms duration at the end of the MNG as side effect
398
+                if( mng_putchunk_term( hMNG,
399
+                                       MNG_TERMACTION_CLEAR, MNG_ITERACTION_CLEAR, // show last frame forever after end of animation
400
+                                       0, 0 // no repeat delay, no maximum iteration count
401
+                                     ) != 0 )
402
+                  break;
403
+
404
+                // write frames
405
+                for( frame_no = 0; frame_no < frame_cnt; frame_no++ ) {
406
+
407
+                  // get current frame
408
+                  stBlinkenFrame * frame = BlinkenMovieGetFrame( data->movie, frame_no );
409
+                  unsigned int frame_duration = BlinkenFrameGetDuration( frame );
410
+
411
+                  // write MNG frame header chunks
412
+                  if( mng_putchunk_seek( hMNG,
413
+                                         0, MNG_NULL // no name
414
+                                       ) != 0 )
415
+                    break;
416
+
417
+                  if( mng_putchunk_fram( hMNG,
418
+                                         MNG_FALSE, frame_no == 0 ? MNG_FRAMINGMODE_1 : MNG_FRAMINGMODE_NOCHANGE, // empty, mode
419
+                                         0, MNG_NULL, // frame name
420
+                                         MNG_CHANGEDELAY_DEFAULT, MNG_CHANGETIMOUT_NO, MNG_CHANGECLIPPING_NO, MNG_CHANGESYNCID_NO, // changing only delay
421
+                                         frame_duration, 0, // new delay, no new timeout
422
+                                         0, 0, 0, 0, 0, // no new boundary
423
+                                         0, 0 // no count, no IDs
424
+                                       ) != 0 )
425
+                    break;
426
+
427
+                  if( mng_putchunk_defi( hMNG,
428
+                                         0, MNG_DONOTSHOW_VISIBLE, MNG_ABSTRACT, // no ID, visible, abstract
429
+                                         MNG_TRUE, 0, 0, // top left location
430
+                                         MNG_FALSE, 0, 0, 0, 0 // no clipping
431
+                                       ) != 0 )
432
+                    break;
433
+
434
+                  if( mng_putchunk_ihdr( hMNG,
435
+                                         data->width, data->height, 8, MNG_COLORTYPE_RGB, // dimensions and 8 bit RGB
436
+                                         MNG_COMPRESSION_DEFLATE, MNG_FILTER_ADAPTIVE, MNG_INTERLACE_NONE // deflate compression, adaptive filter, no interlacing
437
+                                       ) != 0 )
438
+                    break;
439
+
440
+                  // write MNG frame data
441
+                  {
442
+                    unsigned char * ptr;
443
+                    unsigned int len;
444
+                    mng_retcode iRC;
445
+
446
+                    BlMng_compress_frame( frame, &ptr, &len );
447
+
448
+                    iRC = mng_putchunk_idat( hMNG, (mng_uint32)len, (mng_ptr)ptr );
449
+                    free( ptr );
450
+                    if( iRC != 0 )
451
+                      break;
452
+                  }
453
+
454
+                  // write MNG frame footer
455
+                  if( mng_putchunk_iend( hMNG ) != 0 )
456
+                    break;
457
+
458
+                } // for( frame ...
459
+                if( frame_no < frame_cnt ) // if not all frames have been processed there was en error
460
+                  break;
461
+
462
+                // output MNG end chunk
463
+                if( mng_putchunk_mend( hMNG ) != 0 )
464
+                  break;
465
+
466
+                // write MNG chuks to file
467
+                if( mng_write( hMNG ) != 0 )
468
+                  break;
469
+
470
+                b_success = 1;
471
+
472
+              } while( 0 );
473
+
474
+            } // if( mng_create( hMNG ) == 0 )
475
+
476
+          } // if( mng_setcb_... )
477
+    
478
+          // shutdown MNG library
479
+          mng_cleanup( &hMNG );
480
+
481
+        } // if( hMNG )
482
+
483
+        // close file
484
+        fclose( data->hFile );
485
+
486
+      } // if( data->hFile != NULL )
487
+
488
+      // free movie
489
+      BlinkenMovieFree( data->movie );
490
+
491
+    } // if( data->movie != NULL )
492
+
493
+    // free data structure for state
494
+    if( data->canvas != NULL )
495
+      free( data->canvas );
496
+    free( data );
497
+
498
+  } // if( data != NULL )
499
+
500
+  return b_success ? 0 : -1;
501
+}
502
+
... ...
@@ -0,0 +1,24 @@
1
+/* BlinkenLib
2
+ * version 0.6.0 date 2008-05-15
3
+ * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4
+ * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5
+ * a blinkenarea.org project
6
+ */
7
+
8
+#ifndef INC_BlinkenLib_BlinkenMng
9
+#define INC_BlinkenLib_BlinkenMng
10
+
11
+#include <BlinkenLib/config.h>
12
+#include <BlinkenLib/BlinkenFrame.h>
13
+#include <BlinkenLib/BlinkenMovie.h>
14
+
15
+#ifndef BLINKENLIB_CFG_MNG
16
+#error This file is to be used for MNG support only.
17
+#endif // #ifndef BLINKENLIB_CFG_MNG
18
+
19
+stBlinkenMovie * BlinkenMngLoad( char * pFilename );
20
+
21
+int BlinkenMngSave( stBlinkenMovie * pMovie, char * pFilename );
22
+
23
+#endif //#ifndef INC_BlinkenLib_BlinkenMng
24
+
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -23,6 +23,9 @@
23 23
 #include <BlinkenLib/BlinkenFrame.h>
24 24
 #include <BlinkenLib/BlinkenMovie.h>
25 25
 #include <BlinkenLib/Tools.h>
26
+#ifdef BLINKENLIB_CFG_MNG
27
+#include <BlinkenLib/BlinkenMng.h>
28
+#endif // #ifdef BLINKENLIB_CFG_MNG
26 29
 
27 30
 struct sBlinkenMovie
28 31
 {
... ...
@@ -1115,6 +1118,15 @@ stBlinkenMovie * BlinkenMovieLoadBbm( char * pFilename )
1115 1118
   return pMovie;
1116 1119
 }
1117 1120
 
1121
+#ifdef BLINKENLIB_CFG_MNG
1122
+
1123
+stBlinkenMovie * BlinkenMovieLoadMng( char * pFilename )
1124
+{
1125
+  return BlinkenMngLoad( pFilename );
1126
+}
1127
+
1128
+#endif // #ifdef BLINKENLIB_CFG_MNG
1129
+
1118 1130
 stBlinkenMovie * BlinkenMovieLoad( char * pFilename )
1119 1131
 {
1120 1132
   int len;
... ...
@@ -1131,6 +1143,10 @@ stBlinkenMovie * BlinkenMovieLoad( char * pFilename )
1131 1143
     return BlinkenMovieLoadBml( pFilename );
1132 1144
   if( len > 4 && strcmp( pFilename + len - 4, ".bbm" ) == 0 )
1133 1145
     return BlinkenMovieLoadBbm( pFilename );
1146
+#ifdef BLINKENLIB_CFG_MNG
1147
+  if( len > 4 && strcmp( pFilename + len - 4, ".mng" ) == 0 )
1148
+    return BlinkenMovieLoadMng( pFilename );
1149
+#endif // #ifdef BLINKENLIB_CFG_MNG
1134 1150
   return NULL;
1135 1151
 }
1136 1152
 
... ...
@@ -1443,6 +1459,15 @@ int BlinkenMovieSaveBbm( stBlinkenMovie * pMovie, char * pFilename )
1443 1459
   return 0;
1444 1460
 }
1445 1461
 
1462
+#ifdef BLINKENLIB_CFG_MNG
1463
+
1464
+int BlinkenMovieSaveMng( stBlinkenMovie * pMovie, char * pFilename )
1465
+{
1466
+  return BlinkenMngSave( pMovie, pFilename );
1467
+}
1468
+
1469
+#endif // #ifdef BLINKENLIB_CFG_MNG
1470
+
1446 1471
 int BlinkenMovieSave( stBlinkenMovie * pMovie, char * pFilename )
1447 1472
 {
1448 1473
   int len;
... ...
@@ -1459,6 +1484,10 @@ int BlinkenMovieSave( stBlinkenMovie * pMovie, char * pFilename )
1459 1484
     return BlinkenMovieSaveBml( pMovie, pFilename );
1460 1485
   if( len > 4 && strcmp( pFilename + len - 4, ".bbm" ) == 0 )
1461 1486
     return BlinkenMovieSaveBbm( pMovie, pFilename );
1487
+#ifdef BLINKENLIB_CFG_MNG
1488
+  if( len > 4 && strcmp( pFilename + len - 4, ".mng" ) == 0 )
1489
+    return BlinkenMovieSaveMng( pMovie, pFilename );
1490
+#endif // #ifdef BLINKENLIB_CFG_MNG
1462 1491
   return -1;
1463 1492
 }
1464 1493
 
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
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
 #ifndef INC_BlinkenLib_BlinkenMovie
9 9
 #define INC_BlinkenLib_BlinkenMovie
10 10
 
11
+#include <BlinkenLib/config.h>
11 12
 #include <BlinkenLib/BlinkenFrame.h>
12 13
 
13 14
 #ifdef WIN32
... ...
@@ -58,12 +59,18 @@ stBlinkenMovie * BlinkenMovieLoadBlm( char * pFilename );
58 59
 stBlinkenMovie * BlinkenMovieLoadBmm( char * pFilename );
59 60
 stBlinkenMovie * BlinkenMovieLoadBml( char * pFilename );
60 61
 stBlinkenMovie * BlinkenMovieLoadBbm( char * pFilename );
62
+#ifdef BLINKENLIB_CFG_MNG
63
+stBlinkenMovie * BlinkenMovieLoadMng( char * pFilename );
64
+#endif // #ifdef BLINKENLIB_CFG_MNG
61 65
 stBlinkenMovie * BlinkenMovieLoad( char * pFilename );
62 66
 
63 67
 int BlinkenMovieSaveBlm( stBlinkenMovie * pMovie, char * pFilename );
64 68
 int BlinkenMovieSaveBmm( stBlinkenMovie * pMovie, char * pFilename );
65 69
 int BlinkenMovieSaveBml( stBlinkenMovie * pMovie, char * pFilename );
66 70
 int BlinkenMovieSaveBbm( stBlinkenMovie * pMovie, char * pFilename );
71
+#ifdef BLINKENLIB_CFG_MNG
72
+int BlinkenMovieSaveMng( stBlinkenMovie * pMovie, char * pFilename );
73
+#endif // #ifdef BLINKENLIB_CFG_MNG
67 74
 int BlinkenMovieSave( stBlinkenMovie * pMovie, char * pFilename );
68 75
 
69 76
 void BlinkenMovieSend( stBlinkenMovie * pMovie, SOCKET udpSocket, etBlinkenProto proto, int maxidle );
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -409,7 +409,8 @@ int main( int argCnt, char * * args )
409 409
 
410 410
   //print info
411 411
   printf( "BlinkenLib - BlinkenOutput\n"
412
-          "version 0.5.5 date 2008-03-29\n"
412
+          "version 0.6.0 date 2008-05-15\n"
413
+          "config "BLINKENLIB_CONFIG"\n"
413 414
           "Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>\n"
414 415
           "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
415 416
           "a blinkenarea.org project\n\n" );
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -350,7 +350,7 @@ int main( int argCnt, char * * args )
350 350
 
351 351
   //print info
352 352
   printf( "BlinkenLib - BlinkenOutput\n"
353
-          "version 0.5.5 date 2008-03-29\n"
353
+          "version 0.6.0 date 2008-05-15"
354 354
           "Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>\n"
355 355
           "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
356 356
           "a blinkenarea.org project\n\n" );
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -32,7 +32,8 @@ int main( int argCnt, char * * args )
32 32
 
33 33
   //print info
34 34
   printf( "BlinkenLib - BlinkenRecv\n"
35
-          "version 0.5.5 date 2008-03-29\n"
35
+          "version 0.6.0 date 2008-05-15\n"
36
+          "config "BLINKENLIB_CONFIG"\n"
36 37
           "Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>\n"
37 38
           "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
38 39
           "a blinkenarea.org project\n\n" );
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -35,7 +35,8 @@ int main( int argCnt, char * * args )
35 35
 
36 36
   //print info
37 37
   printf( "BlinkenLib - BlinkenSend\n"
38
-          "version 0.5.5 date 2008-03-29\n"
38
+          "version 0.6.0 date 2008-05-15\n"
39
+          "config "BLINKENLIB_CONFIG"\n"
39 40
           "Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>\n"
40 41
           "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n"
41 42
           "a blinkenarea.org project\n\n" );
... ...
@@ -1,5 +1,5 @@
1 1
 # BlinkenLib
2
-# version 0.5.5 date 2008-03-29
2
+# version 0.6.0 date 2008-05-15
3 3
 # Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
 # Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
 # a blinkenarea.org project
... ...
@@ -11,23 +11,37 @@ AR=ar
11 11
 RANLIB=ranlib
12 12
 
13 13
 VERSION_MAJOR=0
14
-VERSION_MINOR=5
15
-VERSION_REVISION=5
14
+VERSION_MINOR=6
15
+VERSION_REVISION=0
16 16
 VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_REVISION)
17 17
 
18
-LIB_OBJS=BlinkenColorizer.o BlinkenFrame.o BlinkenMovie.o Tools.o
18
+include ../config/config.mk
19
+
20
+ifeq ($(BLINKENLIB_CFG_MNG),1)
21
+BLINKEN_MNG_H=BlinkenMng.h
22
+BLINKEN_MNG_O=BlinkenMng.o
23
+LMNG=-lmng -lz
24
+endif
25
+
26
+LIB_OBJS=BlinkenColorizer.o BlinkenFrame.o BlinkenMovie.o $(BLINKEN_MNG_O) Tools.o
19 27
 
20 28
 .phony: all clean
21 29
 
22 30
 all: libBlinkenLib.a libBlinkenLib.so.$(VERSION_MAJOR) libBlinkenLib.so.$(VERSION) libBlinkenLib.so BlinkenConv BlinkenSend BlinkenRecv BlinkenOutput
23 31
 
32
+config.h: ../config/config.h
33
+	cp $< $@
34
+
24 35
 BlinkenColorizer.o: BlinkenColorizer.c BlinkenColorizer.h Tools.h
25 36
 	$(CC) $(CFLAGS) -c -o $@ $<
26 37
 
27
-BlinkenFrame.o: BlinkenFrame.c BlinkenFrame.h BlinkenColorizer.h Tools.h
38
+BlinkenFrame.o: BlinkenFrame.c BlinkenConstants.h BlinkenColorizer.h BlinkenFrame.h BlinkenColorizer.h Tools.h
39
+	$(CC) $(CFLAGS) -c -o $@ $<
40
+
41
+BlinkenMovie.o: BlinkenMovie.c BlinkenConstants.h BlinkenColorizer.h BlinkenFrame.h BlinkenMovie.h $(BLINKEN_MNG_H) Tools.h config.h
28 42
 	$(CC) $(CFLAGS) -c -o $@ $<
29 43
 
30
-BlinkenMovie.o: BlinkenMovie.c BlinkenFrame.h BlinkenMovie.h Tools.h
44
+BlinkenMng.o: BlinkenMng.c BlinkenConstants.h BlinkenColorizer.h BlinkenFrame.h BlinkenMovie.h Tools.h config.h
31 45
 	$(CC) $(CFLAGS) -c -o $@ $<
32 46
 
33 47
 Tools.o: Tools.c Tools.h
... ...
@@ -38,38 +52,40 @@ libBlinkenLib.a: $(LIB_OBJS)
38 52
 	$(RANLIB) $@
39 53
 
40 54
 libBlinkenLib.so.$(VERSION): $(LIB_OBJS)
41
-	$(CC) -shared -Wl,-soname,libBlinkenLib.so.$(VERSION_MAJOR) -o $@ $+
55
+	$(CC) -shared -Wl,-soname,libBlinkenLib.so.$(VERSION_MAJOR) -o $@ $+ $(LMNG)
42 56
 
43 57
 libBlinkenLib.so.$(VERSION_MAJOR): libBlinkenLib.so.$(VERSION)
58
+	rm -f $@
44 59
 	ln -s $< $@
45 60
 
46 61
 libBlinkenLib.so: libBlinkenLib.so.$(VERSION_MAJOR)
62
+	rm -f $@
47 63
 	ln -s $< $@
48 64
 
49
-BlinkenConv.o: BlinkenConv.c BlinkenLib.h
65
+BlinkenConv.o: BlinkenConv.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenFrame.h BlinkenMovie.h
50 66
 	$(CC) $(CFLAGS) -c -o $@ $<
51 67
 
52 68
 BlinkenConv: BlinkenConv.o libBlinkenLib.so
53 69
 	$(CC) $(LFLAGS) -o $@ $< -lBlinkenLib
54 70
 
55
-BlinkenSend.o: BlinkenSend.c BlinkenLib.h
71
+BlinkenSend.o: BlinkenSend.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenFrame.h BlinkenMovie.h
56 72
 	$(CC) $(CFLAGS) -c -o $@ $<
57 73
 
58 74
 BlinkenSend: BlinkenSend.o libBlinkenLib.so
59 75
 	$(CC) $(LFLAGS) -o $@ $< -lBlinkenLib
60 76
 
61
-BlinkenRecv.o: BlinkenRecv.c BlinkenLib.h
77
+BlinkenRecv.o: BlinkenRecv.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenFrame.h BlinkenMovie.h
62 78
 	$(CC) $(CFLAGS) -c -o $@ $<
63 79
 
64 80
 BlinkenRecv: BlinkenRecv.o libBlinkenLib.so
65 81
 	$(CC) $(LFLAGS) -o $@ $< -lBlinkenLib
66 82
 
67
-BlinkenOutput.o: BlinkenOutput.c BlinkenLib.h
83
+BlinkenOutput.o: BlinkenOutput.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenFrame.h BlinkenMovie.h
68 84
 	$(CC) $(CFLAGS) -c -o $@ $<
69 85
 
70 86
 BlinkenOutput: BlinkenOutput.o libBlinkenLib.so
71 87
 	$(CC) $(LFLAGS) -o $@ $< -lBlinkenLib
72 88
 
73 89
 clean:
74
-	rm -f BlinkenConv BlinkenSend BlinkenRecv BlinkenOutput libBlinkenLib.so libBlinkenLib.so.$(VERSION) libBlinkenLib.so.$(VERSION_MAJOR) libBlinkenLib.a *.o
90
+	rm -f BlinkenConv BlinkenSend BlinkenRecv BlinkenOutput libBlinkenLib.so libBlinkenLib.so.$(VERSION) libBlinkenLib.so.$(VERSION_MAJOR) libBlinkenLib.a *.o config.h
75 91
 
... ...
@@ -1,5 +1,5 @@
1 1
 /* BlinkenLib
2
- * version 0.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
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.5.5 date 2008-03-29
2
+ * version 0.6.0 date 2008-05-15
3 3
  * Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
... ...
@@ -1,3 +1,7 @@
1
+0.6.0 2008-5-13
2
+---------------
3
+added MNG support
4
+
1 5
 0.5.5 2008-03-29
2 6
 ----------------
3 7
 restructured location of source and include files
... ...
@@ -1,5 +1,5 @@
1 1
 # BlinkenLib
2
-# version 0.5.5 date 2008-03-29
2
+# version 0.6.0 date 2008-05-15
3 3
 # Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4 4
 # Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
 # a blinkenarea.org project
... ...
@@ -7,8 +7,8 @@
7 7
 INSTALL=install
8 8
 
9 9
 VERSION_MAJOR=0
10
-VERSION_MINOR=5
11
-VERSION_REVISION=5
10
+VERSION_MINOR=6
11
+VERSION_REVISION=0
12 12
 VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_REVISION)
13 13
 
14 14
 ENV_PREFIX=$(shell echo $$PREFIX)
... ...
@@ -25,19 +25,25 @@ else
25 25
   endif
26 26
 endif
27 27
 
28
-HEADERS=BlinkenLib.h BlinkenMovie.h BlinkenFrame.h BlinkenColorizer.h
28
+HEADERS=BlinkenLib.h BlinkenMovie.h BlinkenFrame.h BlinkenColorizer.h config.h
29 29
 LIBS=libBlinkenLib.a libBlinkenLib.so.$(VERSION)
30 30
 EXECS=BlinkenConv BlinkenSend BlinkenRecv BlinkenOutput
31 31
 
32
-.phony: all clean install uninstall
32
+.phony: all conf clean distclean install uninstall
33 33
 
34
-all:
34
+all: conf
35 35
 	$(MAKE) -C BlinkenLib all
36 36
 
37
-clean:
37
+conf:
38
+	$(MAKE) -C config all
39
+
40
+clean: conf
38 41
 	$(MAKE) -C BlinkenLib clean
39 42
 
40
-install:
43
+distclean: clean
44
+	$(MAKE) -C config clean
45
+
46
+install: all
41 47
 	$(INSTALL) -d $(PREFIX)/include/BlinkenLib
42 48
 	$(INSTALL) -t $(PREFIX)/include/BlinkenLib $(addprefix BlinkenLib/, $(HEADERS))
43 49
 	$(INSTALL) -d $(PREFIX)/lib
... ...
@@ -0,0 +1,32 @@
1
+# BlinkenLib
2
+# version 0.6.0 date 2008-05-15
3
+# Copyright 2004-2008 Stefan Schuermans <stefan@blinkenarea.org>
4
+# Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5
+# a blinkenarea.org project
6
+
7
+CC=gcc
8
+
9
+.phony: all clean
10
+
11
+all: config.cfg config.mk config.h
12
+
13
+mng.cfg:
14
+	echo -n "MNG=" >mng.cfg
15
+	(($(CC) -o mng mng.c -lmng && ./mng && echo "1") || echo "0") >>mng.cfg
16
+	rm -f mng
17
+
18
+config.cfg: mng.cfg
19
+	cat $+ >config.cfg
20
+
21
+config.mk: config.cfg
22
+	sed 's/^\([A-Z]*\)=\([01]\)$$/BLINKENLIB_CFG_\1=\2/' <$< >$@
23
+
24
+config.h: config.cfg
25
+	sed 's/^\([A-Z]*\)=0$$/#undef BLINKENLIB_CFG_\1/;s/^\([A-Z]*\)=1$$/#define BLINKENLIB_CFG_\1/' <$< >$@
26
+	echo -n '#define BLINKENLIB_CONFIG "' >>$@
27
+	sed 's/^\([A-Z]*\)=0$$/\1-/;s/^\([A-Z]*\)=1$$/\1+/' <$< | tr '\n' ' ' | sed 's/ *$$//' >>$@
28
+	echo '"' >>$@
29
+
30
+clean:
31
+	rm -f *.cfg config.mk config.h
32
+
... ...
@@ -0,0 +1,22 @@
1
+#include <libmng.h>
2
+
3
+mng_ptr my_mng_alloc( mng_size_t iSize )
4
+{
5
+  void * ptr = malloc( iSize );
6
+  memset( ptr, 0, iSize );
7
+  return (mng_ptr)ptr;
8
+}
9
+
10
+void my_mng_free( mng_ptr pPtr, mng_size_t __attribute__(( unused )) iSize )
11
+{
12
+  free( pPtr );
13
+}
14
+
15
+int main( )
16
+{
17
+  mng_handle hMNG = mng_initialize( MNG_NULL, my_mng_alloc, my_mng_free, MNG_NULL ); 
18
+  mng_cleanup( &hMNG );
19
+
20
+  return 0;
21
+}
22
+
0 23