source-engine/utils/hlfaceposer/mxbitmaptools.cpp

154 lines
3.3 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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 );
}