mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
154 lines
3.3 KiB
C++
154 lines
3.3 KiB
C++
//========= 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 );
|
|
} |