diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/hlfaceposer/mxbitmaptools.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/hlfaceposer/mxbitmaptools.cpp')
| -rw-r--r-- | utils/hlfaceposer/mxbitmaptools.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/utils/hlfaceposer/mxbitmaptools.cpp b/utils/hlfaceposer/mxbitmaptools.cpp new file mode 100644 index 0000000..87b23c9 --- /dev/null +++ b/utils/hlfaceposer/mxbitmaptools.cpp @@ -0,0 +1,154 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "mxbitmaptools.h" +#include <mxtk/mx.h> +#include "hlfaceposer.h" +#include "filesystem.h" + +bool LoadBitmapFromFile( const char *relative, mxbitmapdata_t& bitmap ) +{ + + bitmap.valid = false; + bitmap.image = NULL; + bitmap.width = -1; + bitmap.height = -1; + + // Draw + HDC dc = GetDC( NULL ); + if ( !dc ) + { + return false; + } + + int width, height; + + width = 100; + height = 100; + + HBITMAP bmNewImage = (HBITMAP)0; + + HBITMAP bm, oldbm; + bm = CreateCompatibleBitmap( dc, width, height ); + if ( bm ) + { + oldbm = (HBITMAP)SelectObject( dc, bm ); + + HDC memdc = CreateCompatibleDC( dc ); + if ( memdc ) + { + char filename[ 512 ]; + filesystem->RelativePathToFullPath( relative, "MOD", filename, sizeof( filename ) ); + + bmNewImage = (HBITMAP)LoadImage( + (HINSTANCE) GetModuleHandle(0), filename, + IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE ); + + if ( !bmNewImage ) + { + filesystem->RelativePathToFullPath( relative, "GAME", filename, sizeof( filename ) ); + + bmNewImage = (HBITMAP)LoadImage( + (HINSTANCE) GetModuleHandle(0), filename, + IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE ); + } + + if ( bmNewImage ) + { + HBITMAP oldmembm = (HBITMAP)SelectObject( memdc, bmNewImage ); + + BITMAPINFO bmi; + memset( &bmi, 0, sizeof( bmi ) ); + bmi.bmiHeader.biSize = sizeof( BITMAPINFOHEADER ); + + if ( GetDIBits( memdc, bmNewImage, 0, 0, NULL, &bmi, DIB_RGB_COLORS ) ) + { + bitmap.width = bmi.bmiHeader.biWidth; + bitmap.height = bmi.bmiHeader.biHeight; + } + + SelectObject( memdc, oldmembm ); + } + + DeleteDC( memdc ); + } + + SelectObject( dc, oldbm ); + DeleteObject( bm ); + } + + ReleaseDC( NULL, dc ); + + if ( bmNewImage && + bitmap.width != -1 && + bitmap.height != -1 ) + { + bitmap.image = bmNewImage; + bitmap.valid = true; + } + + return bitmap.valid; +} + +void DrawBitmapToWindow( mxWindow *wnd, int x, int y, int w, int h, mxbitmapdata_t& bitmap ) +{ + if ( !bitmap.valid ) + return; + + // Draw + HDC dc = GetDC( (HWND) wnd->getHandle() ); + if ( !dc ) + return; + + HBITMAP bm, oldbm; + bm = CreateCompatibleBitmap( dc, w, h ); + oldbm = (HBITMAP)SelectObject( dc, bm ); + + HDC memdc = CreateCompatibleDC( dc ); + HBITMAP oldmembm = (HBITMAP)SelectObject( memdc, bitmap.image ); + + int oldmode = SetStretchBltMode( dc, COLORONCOLOR ); + + StretchBlt( dc, x, y, w, h, memdc, 0, 0, bitmap.width, bitmap.height, SRCCOPY ); + + SetStretchBltMode( dc, oldmode ); + + SelectObject( memdc, oldmembm ); + DeleteDC( memdc ); + + SelectObject( dc, oldbm ); + DeleteObject( bm ); + ReleaseDC( (HWND) wnd->getHandle(), dc ); + + RECT rc; + rc.left = x; + rc.right = x + w; + rc.top = y; + rc.bottom = y + h; + + ValidateRect( (HWND)wnd->getHandle(), &rc ); +} + +void DrawBitmapToDC( void *hdc, int x, int y, int w, int h, mxbitmapdata_t& bitmap ) +{ + if ( !bitmap.valid ) + return; + + HDC dc = (HDC)hdc; + + HDC memdc = CreateCompatibleDC( dc ); + HBITMAP oldmembm = (HBITMAP)SelectObject( memdc, bitmap.image ); + + int oldmode = SetStretchBltMode( dc, COLORONCOLOR ); + + StretchBlt( dc, x, y, w, h, memdc, 0, 0, bitmap.width, bitmap.height, SRCCOPY ); + + SetStretchBltMode( dc, oldmode ); + + SelectObject( memdc, oldmembm ); + DeleteDC( memdc ); +}
\ No newline at end of file |