LOADBMP.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************Module*Header*******************************
  2. * Module Name: loadbmp.c
  3. *
  4. * Contains function that loads a bitmap file
  5. *
  6. * Created: 08-Jan-1992 11:06:37
  7. *
  8. * Copyright (C) 1993-1997 Microsoft Corporation
  9. *
  10. * Contains the main routine for loading a DI bitmap file.
  11. *
  12. * Dependencies:
  13. *
  14. *   (#defines)
  15. *   (#includes)
  16. *       #include <windows.h>
  17. *       #include "jtypes.h"
  18. *
  19. **************************************************************************/
  20. #include <windows.h>
  21. #include "julia.h"
  22. extern HWND ghwndMain;
  23. BOOL bSelectDIBPal(HDC, PINFO, LPBITMAPINFO, BOOL);
  24. BOOL bFreeRleFile(PINFO);
  25. BOOL LoadBitmapFile(HDC, PINFO, PSTR);
  26. /******************************Public*Routine******************************
  27. *
  28. * LoadBitmapFile
  29. *
  30. * Effects:  Loads the bitmap from file and put into pInfo->hBmpSaved
  31. *
  32. * Warnings: pszFileName contains the full path
  33. *
  34. **************************************************************************/
  35. BOOL LoadBitmapFile(HDC hDC, PINFO pInfo, PSTR pszFileName)
  36. {
  37.     BOOL            bSuccess;
  38.     HANDLE          hFile, hMapFile;
  39.     LPVOID          pMapFile;
  40.     LPBITMAPINFOHEADER pbmh;
  41.     LPBITMAPINFO    pbmi;
  42.     PBYTE           pjTmp;
  43.     ULONG           sizBMI;
  44.     INT             iNumClr;
  45.     BOOL            bCoreHdr;
  46.     PFILEINFO       pFileInfo;
  47.     bSuccess = TRUE;
  48.     if ((hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
  49.             OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL)) == (HANDLE)-1) 
  50. {
  51.         OutputDebugString("Fail in file open");
  52.         bSuccess = FALSE;
  53.         goto ErrExit1;
  54.     }
  55.     //
  56.     // Create a map file of the opened file
  57.     //
  58.     if ((hMapFile = CreateFileMapping(hFile, NULL,
  59.                              PAGE_READONLY, 0, 0, NULL)) == (HANDLE)-1) 
  60. {
  61.         OutputDebugString("Fail in creating map file");
  62.         bSuccess = FALSE;
  63.         goto ErrExit2;
  64.     }
  65.     //
  66.     // Map a view of the whole file
  67.     //
  68.     if ((pMapFile = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0)) == NULL) 
  69. {
  70.         OutputDebugString("Fail in mapping view of the Map File object");
  71.         bSuccess = FALSE;
  72.         goto ErrExit3;
  73.     }
  74.     //
  75.     // Saving the DIB file handle, etc in pInfo...
  76.     // freeing existing objects, if any
  77.     //
  78.     bFreeRleFile(pInfo);
  79.     pFileInfo = &(pInfo->RleData.rgFileInfo[0]);
  80.     pFileInfo->hFile      = hFile;
  81.     pFileInfo->hMapFile   = hMapFile;
  82.     pFileInfo->lpvMapView = pMapFile;
  83.     //
  84.     // First check that it is a bitmap file
  85.     //
  86.     if (*((PWORD)pMapFile) != 0x4d42)  // 'BM'
  87. {              
  88.         MessageBox(ghwndMain, 
  89.        GetStringRes (IDS_ERR_NOT_A_DIB),
  90.    NULL, MB_OK);
  91.         bSuccess = FALSE;
  92.         goto ErrExit3;
  93.     }
  94.     //
  95.     // The file header doesn't end on DWORD boundary...
  96.     //
  97.     pbmh = (LPBITMAPINFOHEADER)((PBYTE)pMapFile + sizeof(BITMAPFILEHEADER));
  98.     {
  99.         BITMAPCOREHEADER bmch, *pbmch;
  100.         BITMAPINFOHEADER bmih, *pbmih;
  101.         PBYTE            pjTmp;
  102.         ULONG            ulSiz;
  103.         pbmch = &bmch;
  104.         pbmih = &bmih;
  105.         pjTmp = (PBYTE)pbmh;
  106.         ulSiz = sizeof(BITMAPCOREHEADER);
  107.         while (ulSiz--) {
  108.             *(((PBYTE)pbmch)++) = *(((PBYTE)pjTmp)++);
  109.         }
  110.         pjTmp = (PBYTE)pbmh;
  111.         ulSiz = sizeof(BITMAPINFOHEADER);
  112.         while (ulSiz--) {
  113.             *(((PBYTE)pbmih)++) = *(((PBYTE)pjTmp)++);
  114.         }
  115.         //
  116.         // Use the size to determine if it is a BitmapCoreHeader or
  117.         // BitmapInfoHeader
  118.         //
  119.         // Does PM supports 16 and 32 bpp? How?
  120.         //
  121.         if (bmch.bcSize == sizeof(BITMAPCOREHEADER))
  122.         {
  123.             WORD wBitCount;
  124.             wBitCount = bmch.bcBitCount;
  125.             iNumClr = ((wBitCount == 24) ? 0 : (1 << wBitCount));
  126.             sizBMI = sizeof(BITMAPCOREHEADER)+sizeof(RGBTRIPLE)*iNumClr;
  127.             bCoreHdr = TRUE;
  128.         }
  129.         else            // BITMAPINFOHEADER
  130.         {
  131.             WORD wBitCount;
  132.             wBitCount = bmih.biBitCount;
  133.             switch (wBitCount) {
  134.                 case 16:
  135.                 case 32:
  136.                     sizBMI = sizeof(BITMAPINFOHEADER)+sizeof(DWORD)*3;
  137.                     break;
  138.                 case 24:
  139.                     sizBMI = sizeof(BITMAPINFOHEADER);
  140.                     break;
  141.                 default:
  142.                     iNumClr = (1 << wBitCount);
  143.                     sizBMI = sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*iNumClr;
  144.                     break;
  145.             }
  146.             bCoreHdr = FALSE;
  147.         }
  148.     }
  149.     if ((pbmi = (LPBITMAPINFO) LocalAlloc(LMEM_FIXED,sizBMI)) == NULL) 
  150. {
  151.         bSuccess = FALSE;
  152.         goto ErrExit3;
  153.     }
  154.     //
  155.     // Make sure we pass in a DWORD aligned BitmapInfo to CreateDIBitmap
  156.     // Otherwise, exception on the MIPS platform
  157.     // CR!!!  Equivalent to memcpy
  158.     //
  159.     pjTmp = (PBYTE)pbmi;
  160.     while(sizBMI--)
  161.     {
  162.         *(((PBYTE)pjTmp)++) = *(((PBYTE)pbmh)++);
  163.     }
  164.     //
  165.     // assuming CreateDIBitmap() is doing a byte fetch...
  166.     //
  167.     pMapFile = (PBYTE)pMapFile + ((BITMAPFILEHEADER *)pMapFile)->bfOffBits;
  168.     //
  169.     // Select the palette into the DC first before CreateDIBitmap()
  170.     //
  171.     bSelectDIBPal(hDC, pInfo, pbmi, bCoreHdr);
  172.     if ((pInfo->hBmpSaved = CreateDIBitmap(hDC, (LPBITMAPINFOHEADER)pbmi,
  173.                         CBM_INIT, pMapFile, pbmi, DIB_RGB_COLORS)) == NULL) 
  174. {
  175.         OutputDebugString("Fail in creating DIB bitmap from file!");
  176.         bSuccess = FALSE;
  177.         goto ErrExit4;
  178.     }
  179.     //
  180.     // Saving the DIB...free memory when the windows is closed.
  181.     //
  182.     pInfo->RleData.rgpjFrame[0] = pMapFile;
  183.     pInfo->RleData.rgpbmi[0]    = pbmi;
  184.     pInfo->RleData.pbmi         = (PBITMAPINFO) &(pInfo->RleData.rgpbmi[0]);
  185.     pInfo->RleData.ulFrames     = 1;
  186.     pInfo->RleData.ulFiles      = 1;
  187.     // set flag to use original DIB as source for blting so HT can be done
  188.     pInfo->bUseDIB = TRUE;
  189.     pInfo->bCoreHdr = bCoreHdr;
  190.     return (bSuccess);
  191. ErrExit4:
  192.     LocalFree(pbmi);
  193. ErrExit3:
  194.     CloseHandle(hMapFile);
  195. ErrExit2:
  196.     CloseHandle(hFile);
  197. ErrExit1:
  198.     return (bSuccess);
  199. }