summaryrefslogtreecommitdiff
path: root/utils/hlfaceposer/mxbitmaptools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hlfaceposer/mxbitmaptools.cpp')
-rw-r--r--utils/hlfaceposer/mxbitmaptools.cpp154
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