static mng_bool mngProcessHeaderFn(mng_handle mng, mng_uint32 width, mng_uint32 height) { mngstuff *mymng = (mngstuff *)mng_get_userdata(mng); GFXFormat format; mng_uint8 colorType = mng_get_colortype(mng); mng_uint8 alphaDepth = mng_get_alphadepth(mng); switch(colorType) { case MNG_COLORTYPE_GRAY: case MNG_COLORTYPE_JPEGGRAY: format = GFXFormatR8G8B8; mng_set_canvasstyle(mng, MNG_CANVAS_RGB8); break; case MNG_COLORTYPE_INDEXED: if(alphaDepth >= 1) { format = GFXFormatR8G8B8A8; mng_set_canvasstyle(mng, MNG_CANVAS_RGBA8); } else { format = GFXFormatR8G8B8; mng_set_canvasstyle(mng, MNG_CANVAS_RGB8); } case MNG_COLORTYPE_RGB: case MNG_COLORTYPE_JPEGCOLOR: if(alphaDepth >= 1) { format = GFXFormatR8G8B8A8; mng_set_canvasstyle(mng, MNG_CANVAS_RGBA8); } else { format = GFXFormatR8G8B8; mng_set_canvasstyle(mng, MNG_CANVAS_RGB8); } break; case MNG_COLORTYPE_RGBA: case MNG_COLORTYPE_JPEGCOLORA: format = GFXFormatR8G8B8A8; mng_set_canvasstyle(mng, MNG_CANVAS_RGBA8); break; default: // This case should never get hit, however it resolves a compiler // warning format = GFXFormat_FIRST; AssertISV( false, "Unknown color format in bitmap MNG Loading" ); } mymng->image->allocateBitmap(width, height, false, format); return MNG_TRUE; }
static mng_bool mng_process_header_callback (mng_handle mng_h, mng_uint32 width, mng_uint32 height) { FUNCTION_ENTRY(); GtkMngView * mng_view; mng_view = GTK_MNG_VIEW (mng_get_userdata (mng_h)); mng_view->width = width; mng_view->height = height; g_width = width; g_height = height; g_free (mng_view->MNG_drawing_buffer); mng_view->MNG_drawing_buffer = g_new0 (guchar, 3 * width * height); g_free (mng_view->MNG_alpha_buffer); mng_view->MNG_alpha_buffer = g_new0 (guchar, width * height); printf("width %d height %d\n", width, height); printf("mng_get_framecount %d\n", mng_get_framecount(mng_view->MNG_handle)); printf("mng_get_layercount %d\n", mng_get_layercount(mng_view->MNG_handle)); printf("mng_get_playtime %d\n", mng_get_playtime(mng_view->MNG_handle)); printf("mng_get_ticks %d\n", mng_get_ticks(mng_view->MNG_handle)); printf("mng_get_colortype %d\n", mng_get_colortype(mng_view->MNG_handle)); printf("mng_get_interlace %d\n", mng_get_interlace(mng_view->MNG_handle)); printf("mng_get_viewgamma %f\n", mng_get_viewgamma(mng_view->MNG_handle)); printf("mng_get_displaygamma %f\n", mng_get_displaygamma(mng_view->MNG_handle)); printf("mng_get_dfltimggamma %f\n", mng_get_dfltimggamma(mng_view->MNG_handle)); printf("mng_get_viewgammaint %d\n", mng_get_viewgammaint(mng_view->MNG_handle)); printf("mng_get_displaygammaint %d\n", mng_get_displaygammaint(mng_view->MNG_handle)); printf("mng_get_dfltimggammaint %d\n", mng_get_dfltimggammaint(mng_view->MNG_handle)); gtk_widget_queue_resize (GTK_WIDGET (mng_view)); FUNCTION_EXIT(); return MNG_TRUE; }
static bool sReadMNG(Stream &stream, GBitmap *bitmap) { PROFILE_SCOPE(sReadMNG); mngstuff mnginfo; dMemset(&mnginfo, 0, sizeof(mngstuff)); mng_handle mng = mng_initialize(&mnginfo, mngMallocFn, mngFreeFn, MNG_NULL); if(mng == NULL) return false; // setup the callbacks mng_setcb_errorproc(mng, mngFatalErrorFn); mng_setcb_openstream(mng, mngOpenDataFn); mng_setcb_closestream(mng, mngCloseDataFn); mng_setcb_readdata(mng, mngReadDataFn); mng_setcb_processheader(mng, mngProcessHeaderFn); mng_setcb_getcanvasline(mng, mngCanvasLineFn); mng_setcb_refresh(mng, mngRefreshFn); mng_setcb_gettickcount(mng, mngGetTicksFn); mng_setcb_settimer(mng, mngSetTimerFn); mnginfo.image = bitmap; mnginfo.stream = &stream; mng_read(mng); mng_display(mng); // hacks :( // libmng doesn't support returning data in gray/gray alpha format, // so we grab as RGB/RGBA and just cut off the g and b mng_uint8 colorType = mng_get_colortype(mng); switch(colorType) { case MNG_COLORTYPE_GRAY: case MNG_COLORTYPE_JPEGGRAY: { GBitmap temp(*bitmap); bitmap->deleteImage(); bitmap->allocateBitmap(temp.getWidth(), temp.getHeight(), false, GFXFormatA8); // force getColor to read in in the same color value for each channel // since the gray colortype has the real alpha in the first channel temp.setFormat( GFXFormatA8 ); ColorI color; for(U32 row = 0; row < bitmap->getHeight(); row++) { for(U32 col = 0; col < bitmap->getWidth(); col++) { temp.getColor(col, row, color); bitmap->setColor(col, row, color); } } } break; } mng_cleanup(&mng); // Check this bitmap for transparency bitmap->checkForTransparency(); return true; }