//----------------------------------------------------------------------------- IPlatformBitmap* IPlatformBitmap::createFromPath (UTF8StringPtr absolutePath) { UTF8StringHelper path (absolutePath); IStream* stream = 0; if (SUCCEEDED (SHCreateStreamOnFileEx (path, STGM_READ|STGM_SHARE_DENY_WRITE, 0, false, 0, &stream))) { #if VSTGUI_DIRECT2D_SUPPORT if (getD2DFactory ()) { D2DBitmap* result = new D2DBitmap (); if (result->loadFromStream (stream)) { stream->Release (); return result; } stream->Release (); result->forget (); return 0; } #endif GdiplusBitmap* bitmap = new GdiplusBitmap (); if (bitmap->loadFromStream (stream)) { stream->Release (); return bitmap; } bitmap->forget (); stream->Release (); } return 0; }
//----------------------------------------------------------------------------- COffscreenContext* Win32Frame::createOffscreenContext (CCoord width, CCoord height) { #if VSTGUI_DIRECT2D_SUPPORT if (getD2DFactory ()) { D2DBitmap* bitmap = new D2DBitmap (CPoint (width, height)); D2DDrawContext* context = new D2DDrawContext (bitmap); bitmap->forget (); return context; } #endif GdiplusBitmap* bitmap = new GdiplusBitmap (CPoint (width, height)); GdiplusDrawContext* context = new GdiplusDrawContext (bitmap); bitmap->forget (); return context; }
//----------------------------------------------------------------------------- IPlatformBitmap* IPlatformBitmap::createFromMemory (const void* ptr, uint32_t memSize) { #ifdef __GNUC__ typedef IStream* (*SHCreateMemStreamProc) (const BYTE* pInit, UINT cbInit); HMODULE shlwDll = LoadLibraryA ("shlwapi.dll"); SHCreateMemStreamProc proc = reinterpret_cast<SHCreateMemStreamProc> (GetProcAddress (shlwDll, MAKEINTRESOURCEA (12))); IStream* stream = proc (static_cast<const BYTE*> (ptr), memSize); #else IStream* stream = SHCreateMemStream ((const BYTE*)ptr, memSize); #endif if (stream) { #if VSTGUI_DIRECT2D_SUPPORT if (getD2DFactory ()) { D2DBitmap* result = new D2DBitmap (); if (result->loadFromStream (stream)) { stream->Release (); return result; } stream->Release (); result->forget (); return 0; } #endif GdiplusBitmap* bitmap = new GdiplusBitmap (); if (bitmap->loadFromStream (stream)) { stream->Release (); return bitmap; } bitmap->forget (); stream->Release (); } #ifdef __GNUC__ FreeLibrary (shlwDll); #endif return 0; }
//----------------------------------------------------------------------------- void GdiplusDrawContext::drawBitmap (CBitmap* cbitmap, const CRect& dest, const CPoint& offset, float alpha) { alpha *= currentState.globalAlpha; if (alpha == 0.f || pGraphics == 0) return; IPlatformBitmap* platformBitmap = cbitmap ? cbitmap->getPlatformBitmap () : 0; GdiplusBitmap* gpb = platformBitmap ? dynamic_cast<GdiplusBitmap*> (platformBitmap) : 0; Gdiplus::Bitmap* bitmap = gpb ? gpb->getBitmap () : 0; if (bitmap) { GdiplusDrawScope drawScope (pGraphics, currentState.clipRect, getCurrentTransform ()); Gdiplus::ImageAttributes imageAtt; if (alpha != 1.f) { // introducing the alpha blend matrix Gdiplus::ColorMatrix colorMatrix = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, alpha, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, }; // create the imageattribute modifier imageAtt.SetColorMatrix (&colorMatrix, Gdiplus::ColorMatrixFlagsDefault, Gdiplus::ColorAdjustTypeBitmap); #if 1 Gdiplus::Rect myDestRect( (INT)dest.left, (INT)dest.top, (INT)dest.getWidth (), (INT)dest.getHeight ()); pGraphics->DrawImage ( bitmap, myDestRect, (INT)offset.x, (INT)offset.y, (INT)dest.getWidth (), (INT)dest.getHeight (), Gdiplus::UnitPixel, &imageAtt); #else // create a temporary bitmap to prevent OutOfMemory errors Gdiplus::Bitmap myBitmapBuffer ((INT)dest.getWidth (), (INT)dest.getHeight (),PixelFormat32bppARGB); // create a graphics context for the temporary bitmap Gdiplus::Graphics* myGraphicsBuffer = Gdiplus::Graphics::FromImage (&myBitmapBuffer); // copy the rectangle we want to paint to the temporary bitmap Gdiplus::Rect myTransRect( 0, 0, (INT)dest.getWidth (), (INT)dest.getHeight ()); // transfer the bitmap (without modification by imageattr!) myGraphicsBuffer->DrawImage ( bitmap,myTransRect, (INT)offset.x, (INT)offset.y, (INT)dest.getWidth (), (INT)dest.getHeight (), Gdiplus::UnitPixel, 0); // now transfer the temporary to the real context at the advised location Gdiplus::Rect myDestRect ( (INT)dest.left, (INT)dest.top, (INT)dest.getWidth (), (INT)dest.getHeight ()); // transfer from temporary bitmap to real context (with imageattr) pGraphics->DrawImage ( &myBitmapBuffer, myDestRect, (INT)0, (INT)0, (INT)dest.getWidth (), (INT)dest.getHeight (), Gdiplus::UnitPixel, &imageAtt); // delete the temporary context of the temporary bitmap delete myGraphicsBuffer; #endif } else { Gdiplus::Rect myDestRect( (INT)dest.left, (INT)dest.top, (INT)dest.getWidth (), (INT)dest.getHeight ()); pGraphics->DrawImage ( bitmap, myDestRect, (INT)offset.x, (INT)offset.y, (INT)dest.getWidth (), (INT)dest.getHeight (), Gdiplus::UnitPixel, 0); } } }