Click here to Skip to main content
15,860,861 members
Articles / Desktop Programming / MFC

Simple decoder/encoder for MNG animations

Rate me:
Please Sign up or sign in to vote.
4.71/5 (8 votes)
1 Oct 2001CPOL2 min read 103.4K   1.4K   45   9
CxImageMNG: the module of CxImage used to play MNG animations.

Introduction

CxImageMNG is the module of CxImage used to play MNG animations. It uses the CxImage members, but to play the animation, additional variables and functions are required. I decided to keep the MNG stuff separated from the "static" formats, to limit the growth of the base class due to the new features.

As with the other modules, CxImageMNG is mainly an interface for the LibMNG functions, it takes care of the I/O operations and of the specific requirements of the library. CxImageMNG can also read PNG and JNG images.

What do I need?

  1. LibMNG. You can find the latest version here.
  2. JPEG and ZLIB libraries. Used by LibMNG to endode/decode files.

All these libraries are included in the source code.

Structures and callbacks

"Libmng makes extensive use of callback functions. This is meant to keep the library as platform-independent and flexible as possible." In CxImageMNG, these are declared as:

C++
mng_setcb_errorproc    (mng_handle, mymngerror);
mng_setcb_openstream   (mng_handle, mymngopenstream);
mng_setcb_closestream  (mng_handle, mymngclosestream);
mng_setcb_readdata     (mng_handle, mymngreadstream);
mng_setcb_processheader(mng_handle, mymngprocessheader);
mng_setcb_getcanvasline(mng_handle, mymnggetcanvasline);
mng_setcb_refresh      (mng_handle, mymngrefresh);
mng_setcb_gettickcount (mng_handle, mymnggetticks);
mng_setcb_settimer     (mng_handle, mymngsettimer);
mng_setcb_refresh      (mng_handle, mymngrefresh);

Some of these are empty (mymngopenstream), or obvious (mymngreadstream), the most useful for the final applications are mymngprocessheader, where we get the initial information about the image, and mymngsettimer, where we get the essential value for the timer.

Another important parameter is pUserdata, where the application can store its parameters; in CxImageMNG, this is a pointer to the mnginfo variable.

C++
typedef struct
{
  FILE *file;        // file handle
  BYTE *image;       // image pixels
  HANDLE thread;     // timer
  mng_uint32 delay;  // timer duration
  mng_uint32 width;  // image attributes
  mng_uint32 height;
  mng_uint32 effwdt;
  mng_int16 bpp;
  mng_bool animation; // true if it's an animation
  mng_bool animation_enabled; // enable the timer
  float speed;       // speed factor
} mngstuff;

In the callbacks, this information is available at all times through the mng_get_userdata function.

How to play animations

First, we must load the file:

C++
image = new CxImageMNG();
image->ReadFile(filename);

Then, if it's an animation, we must create a thread to play it:

C++
if (image->mnginfo.animation) {
    image->mnginfo.animation_enabled=1;
    DWORD dwID;
    image->mnginfo.thread = CreateThread(NULL,0,RunMNGThread,this,0,&dwID);
}

In the end, we must handle the execution of the thread:

C++
unsigned long _stdcall RunMNGThread(void *lpParam){
    Sleep((DWORD)(image->mnginfo.delay / image->mnginfo.speed));
    while (image->mnginfo.animation_enabled && image->Resume()){
        SendMessage(hWnd, WM_USER_NEWFRAME,0,0);
        Sleep((DWORD)(image->mnginfo.delay / image->mnginfo.speed));
    }
    image->mnginfo.thread=0;
    return 0;
}

The Resume() function is used to obtain the next frame. To stop the animation, simply set image->mnginfo.animation_enabled = 0. The thread is automatically closed in the CxImageMNG destructor.

Credits

  • LIBMNG Copyright (c) 2000,2001 Gerard Juyn.
  • Original mng.cpp code created by Nikolaus Brennig, November 14th, 2000.
  • Special thanks to Frank Haug for suggestions and code.

More specific credits and disclaimers are in every header file of each library.

Compatibility

Win95, WinNT, Win98, WinME, W2K, WinXP = Yes.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Italy Italy
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralPNG animation Pin
serup28-Feb-09 8:10
serup28-Feb-09 8:10 
GeneralRe: PNG animation Pin
Davide Pizzolato1-Mar-09 6:51
Davide Pizzolato1-Mar-09 6:51 
QuestionRichiesta Pin
Nikitto7-Jan-08 3:43
Nikitto7-Jan-08 3:43 
GeneralMPEG-2 parser Pin
hiravi19-Oct-04 11:29
hiravi19-Oct-04 11:29 
GeneralMNG transparency Pin
galleus27-Dec-03 0:22
galleus27-Dec-03 0:22 
GeneralRe: MNG transparency Pin
galleus27-Dec-03 8:35
galleus27-Dec-03 8:35 
GeneralUsing it for COM Pin
JDMoore4-Feb-02 23:14
JDMoore4-Feb-02 23:14 
GeneralRe: Using it for COM Pin
Davide Pizzolato4-Feb-02 23:42
Davide Pizzolato4-Feb-02 23:42 
I think you must redefine these callbacks:
static mng_bool mymngopenstream(mng_handle mng)
static mng_bool mymngopenstreamwrite(mng_handle mng)
static mng_bool mymngclosestream(mng_handle mng)
static mng_bool mymngreadstream(mng_handle mng, mng_ptr buffer, mng_uint32 size, mng_uint32 *bytesread)
static mng_bool mymngwritestream (mng_handle mng, mng_ptr pBuf, mng_uint32 iSize, mng_uint32 *iWritten)

GeneralRe: Using it for COM Pin
Davide Pizzolato29-May-02 1:20
Davide Pizzolato29-May-02 1:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.