www.pudn.com > MirGui.rar > MirMiniMap.cpp
// MirMiniMap.cpp: implementation of the CMirMiniMap class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MirMiniMap.h" #include////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMirMiniMap::CMirMiniMap() { m_fpWilFile = NULL; m_ImageData = NULL; m_dwImageWidth = 0; m_dwImageHeight = 0; m_dwMapIndex = 0; m_xpos = 0; m_ypos = 0; } CMirMiniMap::~CMirMiniMap() { } BOOL CMirMiniMap::InitMiniMap(char *wixfile, char *wilfile) { m_fpWilFile = fopen( wilfile, "rb" ); if( m_fpWilFile == NULL ) return FALSE; m_dwCntMMap = LoadOfs( wixfile, &m_pResOfs ); if( m_dwCntMMap == 0 || m_pResOfs == NULL ) return FALSE; if( !LoadPal( m_BitmapHeader.pals )) return FALSE; return TRUE; } DWORD CMirMiniMap::LoadOfs( char * szWixFile, DWORD ** ofsbuf ) { FILE * fp = NULL; DWORD dwcnt = 0; fp = fopen( szWixFile, "rb" ); if( fp == NULL ) return 0; fseek( fp, 0x2c, SEEK_SET ); fread( &dwcnt, 4, 1, fp ); if( dwcnt == 0 ) { fclose( fp ); return 0; } *ofsbuf = new DWORD[dwcnt]; fread( (void*)(*ofsbuf), dwcnt* 4, 1, fp ); fclose( fp ); return dwcnt; } char * CMirMiniMap::LoadBuf( DWORD idx, DWORD & width, DWORD & height ) { char * pData = NULL; WORD w,h; DWORD dwSize; if( m_fpWilFile == NULL ) return NULL; fseek( m_fpWilFile, m_pResOfs[idx], SEEK_SET ); fread( &w, 2, 1, m_fpWilFile ); if( w == 0 ) { return NULL; } fread( &h, 2, 1, m_fpWilFile ); if( h == 0 ) { return NULL; } width = w; height = h; dwSize = width * height; pData = new char[dwSize]; if( pData == NULL ) return NULL; fseek( m_fpWilFile, 4, SEEK_CUR ); fread( (void*)pData, dwSize, 1, m_fpWilFile ); return pData; } BOOL CMirMiniMap::LoadPal( char * ppal) { if( ppal == NULL ) return FALSE; fseek( m_fpWilFile, 0x38, SEEK_SET ); if( ftell( m_fpWilFile ) != 0x38 ) return FALSE; fread( (void*)ppal, 1024, 1, m_fpWilFile); return TRUE; } BOOL CMirMiniMap::SetMMap(DWORD index) { // BITMAP bm; if( m_ImageData != NULL ) delete []m_ImageData; m_ImageData = LoadBuf( index-1, m_dwImageWidth, m_dwImageHeight ); if( m_ImageData == NULL ) return FALSE; if( m_dwImageWidth == 0 || m_dwImageHeight == 0 ) return FALSE; BITMAPFILEHEADER bfheader; MakeBitmapHeader( &bfheader, &m_BitmapHeader.header , m_dwImageWidth, m_dwImageHeight, 8 ); return TRUE; } int CMirMiniMap::MakeBitmapHeader( BITMAPFILEHEADER * pBfHeader, BITMAPINFOHEADER * pBiHeader, int width, int height, int bits ) { int imagesize = width * height * (bits/ 8 ); int headersize = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ); memset( (void*)pBfHeader, 0, sizeof( BITMAPFILEHEADER ) ); memset( (void*)pBiHeader, 0, sizeof( BITMAPINFOHEADER ) ); if( bits == 8 ) { headersize += sizeof( DWORD) * 256; pBiHeader->biClrImportant = 0x100; pBiHeader->biClrUsed = 0x100; } /* if( (balian % 4) ) { imagesize = width * height * ( bits/8 ); } */ pBfHeader->bfSize = headersize + imagesize; pBfHeader->bfType = 0x4d42; pBfHeader->bfOffBits = headersize; pBiHeader->biWidth = width; pBiHeader->biHeight = height; pBiHeader->biBitCount = bits; pBiHeader->biPlanes = 1; pBiHeader->biCompression = 0; pBiHeader->biSize = 40; pBiHeader->biSizeImage = imagesize; return 1; } void CMirMiniMap::Draw(HDC dc, int x, int y, int w, int h ) { if( m_ImageData == NULL ) return; SetDIBitsToDevice( dc, x, y, w, h, (m_xpos + m_xpos/2 ) - (w/2), (m_dwImageHeight - m_ypos - (h/2)), 0, m_dwImageHeight,(void*)m_ImageData, (BITMAPINFO*)&m_BitmapHeader, DIB_RGB_COLORS ); SetPixel( dc, x + w/2,y + h/2, RGB( 255,255,255)); } void CMirMiniMap::SetCurPos(int x, int y) { m_xpos = x; m_ypos = y; }