Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}