Guest User

Untitled

a guest
Apr 22nd, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. HBITMAP OpenGX::ImageStack::RenderToBitmap( void ) const {
  2.   HBITMAP ret;
  3.   Gdiplus::Bitmap *Result = new Gdiplus::Bitmap( ( int )_screen.width, ( int )_screen.height, PixelFormat32bppARGB );
  4.   Gdiplus::BitmapData info = Gdiplus::BitmapData();
  5.   Result->LockBits( new Gdiplus::Rect( 0, 0, ( int )_screen.width, ( int )_screen.height ), ( Gdiplus::ImageLockModeRead | Gdiplus::ImageLockModeWrite ), PixelFormat32bppARGB, &info );
  6.   byte Balpha, Svalue;
  7.   byte *assignment;
  8.   float Salphaf;
  9.   OpenGX::Image *Bimage;
  10.   int Width, Height, Line, i, x, y, y_offset, x_border, y_max, x_max;
  11.   OpenGX::Pixel BPixel, SPixel;
  12.   OpenGX::Pixel *ptr, *baseptr;
  13.   OpenGX::PointI Boffset;
  14.   OpenGX::RectangleI BArea;
  15.   ptr = ( OpenGX::Pixel* )info.Scan0;
  16.   baseptr = ( OpenGX::Pixel* )info.Scan0;
  17.   Width = ( int )_screen.width;
  18.   Height = ( int )_screen.height;
  19.   Line = info.Stride / 4;
  20.   for( i = nEntries - 1; i >= 0; i-- ) {
  21.     Bimage = _base[ i ];
  22.     Boffset = offset[ i ];
  23.     BArea = OpenGX::RectangleI( Boffset.x,
  24.       Boffset.y,
  25.       Boffset.x + Bimage->width > Width ? Width - Boffset.x : ( int )Bimage->width,
  26.       Boffset.y + Bimage->height > Height ? Height - Boffset.y : ( int )Bimage->height );
  27.     x_border = 0 > BArea.x ? 0 : BArea.x;
  28.     y_max = BArea.y + BArea.height;
  29.     x_max = BArea.x + BArea.width;
  30.     for( y = ( 0 > BArea.y ? 0 : BArea.y ); y < y_max; y++ ) {
  31.       y_offset = y - BArea.y;
  32.       ptr = baseptr + y * Line + x_border;
  33.       for( x = x_border; x < x_max; x++ ) {
  34.         if( ptr->a != 0xFF ) {
  35.           BPixel = Bimage->pixels[ x - BArea.x ][ y_offset ];
  36.           if( ptr->a == 0x00 ) {
  37.             *ptr++ = BPixel;
  38.           } else if( BPixel.a != 0x00 ) {
  39.             Salphaf = ( float )ptr->a / 255;
  40.             Balpha = BPixel.a;
  41.  
  42.             Svalue = SPixel.b;
  43.             assignment = ( byte* )ptr;
  44.             *assignment = ( byte )( Svalue + Salphaf * ( *assignment - Svalue ) );
  45.             Svalue = SPixel.g;
  46.             assignment++;
  47.             *assignment = ( byte )( Svalue + Salphaf * ( *assignment - Svalue ) );
  48.             Svalue = SPixel.r;
  49.             assignment++;
  50.             *assignment = ( byte )( Svalue + Salphaf * ( *assignment - Svalue ) );
  51.             assignment++;
  52.             *assignment = Balpha > *assignment ? Balpha : *assignment;
  53.             ptr++;
  54.           } else {
  55.             ptr++;
  56.           }
  57.         } else {
  58.           ptr++;
  59.         }
  60.       }
  61.     }
  62.   }
  63.   Result->UnlockBits( &info );
  64.   Result->GetHBITMAP( Gdiplus::Color( 0, 0, 0, 0 ), &ret );
  65.   delete Bimage;
  66.   delete Result;
  67.   return ret;
  68. }
Add Comment
Please, Sign In to add comment