LOADBMP.C
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:
Windows编程
开发平台:
Visual C++
- /******************************Module*Header*******************************
- * Module Name: loadbmp.c
- *
- * Contains function that loads a bitmap file
- *
- * Created: 08-Jan-1992 11:06:37
- *
- * Copyright (C) 1993-1997 Microsoft Corporation
- *
- * Contains the main routine for loading a DI bitmap file.
- *
- * Dependencies:
- *
- * (#defines)
- * (#includes)
- * #include <windows.h>
- * #include "jtypes.h"
- *
- **************************************************************************/
- #include <windows.h>
- #include "julia.h"
- extern HWND ghwndMain;
- BOOL bSelectDIBPal(HDC, PINFO, LPBITMAPINFO, BOOL);
- BOOL bFreeRleFile(PINFO);
- BOOL LoadBitmapFile(HDC, PINFO, PSTR);
- /******************************Public*Routine******************************
- *
- * LoadBitmapFile
- *
- * Effects: Loads the bitmap from file and put into pInfo->hBmpSaved
- *
- * Warnings: pszFileName contains the full path
- *
- **************************************************************************/
- BOOL LoadBitmapFile(HDC hDC, PINFO pInfo, PSTR pszFileName)
- {
- BOOL bSuccess;
- HANDLE hFile, hMapFile;
- LPVOID pMapFile;
- LPBITMAPINFOHEADER pbmh;
- LPBITMAPINFO pbmi;
- PBYTE pjTmp;
- ULONG sizBMI;
- INT iNumClr;
- BOOL bCoreHdr;
- PFILEINFO pFileInfo;
- bSuccess = TRUE;
- if ((hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL)) == (HANDLE)-1)
- {
- OutputDebugString("Fail in file open");
- bSuccess = FALSE;
- goto ErrExit1;
- }
- //
- // Create a map file of the opened file
- //
- if ((hMapFile = CreateFileMapping(hFile, NULL,
- PAGE_READONLY, 0, 0, NULL)) == (HANDLE)-1)
- {
- OutputDebugString("Fail in creating map file");
- bSuccess = FALSE;
- goto ErrExit2;
- }
- //
- // Map a view of the whole file
- //
- if ((pMapFile = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0)) == NULL)
- {
- OutputDebugString("Fail in mapping view of the Map File object");
- bSuccess = FALSE;
- goto ErrExit3;
- }
- //
- // Saving the DIB file handle, etc in pInfo...
- // freeing existing objects, if any
- //
- bFreeRleFile(pInfo);
- pFileInfo = &(pInfo->RleData.rgFileInfo[0]);
- pFileInfo->hFile = hFile;
- pFileInfo->hMapFile = hMapFile;
- pFileInfo->lpvMapView = pMapFile;
- //
- // First check that it is a bitmap file
- //
- if (*((PWORD)pMapFile) != 0x4d42) // 'BM'
- {
- MessageBox(ghwndMain,
- GetStringRes (IDS_ERR_NOT_A_DIB),
- NULL, MB_OK);
- bSuccess = FALSE;
- goto ErrExit3;
- }
- //
- // The file header doesn't end on DWORD boundary...
- //
- pbmh = (LPBITMAPINFOHEADER)((PBYTE)pMapFile + sizeof(BITMAPFILEHEADER));
- {
- BITMAPCOREHEADER bmch, *pbmch;
- BITMAPINFOHEADER bmih, *pbmih;
- PBYTE pjTmp;
- ULONG ulSiz;
- pbmch = &bmch;
- pbmih = &bmih;
- pjTmp = (PBYTE)pbmh;
- ulSiz = sizeof(BITMAPCOREHEADER);
- while (ulSiz--) {
- *(((PBYTE)pbmch)++) = *(((PBYTE)pjTmp)++);
- }
- pjTmp = (PBYTE)pbmh;
- ulSiz = sizeof(BITMAPINFOHEADER);
- while (ulSiz--) {
- *(((PBYTE)pbmih)++) = *(((PBYTE)pjTmp)++);
- }
- //
- // Use the size to determine if it is a BitmapCoreHeader or
- // BitmapInfoHeader
- //
- // Does PM supports 16 and 32 bpp? How?
- //
- if (bmch.bcSize == sizeof(BITMAPCOREHEADER))
- {
- WORD wBitCount;
- wBitCount = bmch.bcBitCount;
- iNumClr = ((wBitCount == 24) ? 0 : (1 << wBitCount));
- sizBMI = sizeof(BITMAPCOREHEADER)+sizeof(RGBTRIPLE)*iNumClr;
- bCoreHdr = TRUE;
- }
- else // BITMAPINFOHEADER
- {
- WORD wBitCount;
- wBitCount = bmih.biBitCount;
- switch (wBitCount) {
- case 16:
- case 32:
- sizBMI = sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3;
- break;
- case 24:
- sizBMI = sizeof(BITMAPINFOHEADER);
- break;
- default:
- iNumClr = (1 << wBitCount);
- sizBMI = sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*iNumClr;
- break;
- }
- bCoreHdr = FALSE;
- }
- }
- if ((pbmi = (LPBITMAPINFO) LocalAlloc(LMEM_FIXED,sizBMI)) == NULL)
- {
- bSuccess = FALSE;
- goto ErrExit3;
- }
- //
- // Make sure we pass in a DWORD aligned BitmapInfo to CreateDIBitmap
- // Otherwise, exception on the MIPS platform
- // CR!!! Equivalent to memcpy
- //
- pjTmp = (PBYTE)pbmi;
- while(sizBMI--)
- {
- *(((PBYTE)pjTmp)++) = *(((PBYTE)pbmh)++);
- }
- //
- // assuming CreateDIBitmap() is doing a byte fetch...
- //
- pMapFile = (PBYTE)pMapFile + ((BITMAPFILEHEADER *)pMapFile)->bfOffBits;
- //
- // Select the palette into the DC first before CreateDIBitmap()
- //
- bSelectDIBPal(hDC, pInfo, pbmi, bCoreHdr);
- if ((pInfo->hBmpSaved = CreateDIBitmap(hDC, (LPBITMAPINFOHEADER)pbmi,
- CBM_INIT, pMapFile, pbmi, DIB_RGB_COLORS)) == NULL)
- {
- OutputDebugString("Fail in creating DIB bitmap from file!");
- bSuccess = FALSE;
- goto ErrExit4;
- }
- //
- // Saving the DIB...free memory when the windows is closed.
- //
- pInfo->RleData.rgpjFrame[0] = pMapFile;
- pInfo->RleData.rgpbmi[0] = pbmi;
- pInfo->RleData.pbmi = (PBITMAPINFO) &(pInfo->RleData.rgpbmi[0]);
- pInfo->RleData.ulFrames = 1;
- pInfo->RleData.ulFiles = 1;
- // set flag to use original DIB as source for blting so HT can be done
- pInfo->bUseDIB = TRUE;
- pInfo->bCoreHdr = bCoreHdr;
- return (bSuccess);
- ErrExit4:
- LocalFree(pbmi);
- ErrExit3:
- CloseHandle(hMapFile);
- ErrExit2:
- CloseHandle(hFile);
- ErrExit1:
- return (bSuccess);
- }