Annotation of mstools/samples/mandel/savebmp.c, revision 1.1

1.1     ! root        1: /******************************Module*Header*******************************\
        !             2: * Module Name: savebmp.c
        !             3: *
        !             4: *
        !             5: * Created: 06-Jan-1992 10:59:36
        !             6: * Author: Petrus Wong
        !             7: *
        !             8: * Copyright (c) 1990 Microsoft Corporation
        !             9: *
        !            10: * Contains the main routine, SaveBitmapFile, for saving a DDB into file
        !            11: * in DIB format.
        !            12: *
        !            13: * Dependencies:
        !            14: *
        !            15: *   (#defines)
        !            16: *   (#includes)
        !            17: *       #include <windows.h>
        !            18: *       #include "jtypes.h"
        !            19: *
        !            20: \**************************************************************************/
        !            21: #include <windows.h>
        !            22: #include "jtypes.h"
        !            23: 
        !            24: 
        !            25: extern HWND ghwndMain;
        !            26: extern char   gtext[256];
        !            27: BOOL SaveBitmapFile(HDC, HBITMAP, PSTR);
        !            28: void ErrorOut(char errstring[30]);
        !            29: 
        !            30: /******************************Public*Routine******************************\
        !            31: * SaveBitmapFile
        !            32: *
        !            33: *
        !            34: * Effects: Save pInfo->hBmpSaved into disk specified by pszFileName
        !            35: *
        !            36: * Warnings: assumes hBmpSaved is not selected into window's DC other than
        !            37: *           pInfo->hwnd's DC
        !            38: *
        !            39: * History:
        !            40: *  14-Jan-1992 -by- Petrus Wong
        !            41: * Wrote it.
        !            42: \**************************************************************************/
        !            43: 
        !            44: BOOL SaveBitmapFile(HDC hDC, HBITMAP hBmp, PSTR pszFileName)
        !            45: {
        !            46:     int         hFile;
        !            47:     OFSTRUCT    ofReOpenBuff;
        !            48:     HBITMAP     hTmpBmp, hBmpOld;
        !            49:     BOOL        bSuccess;
        !            50:     BITMAPFILEHEADER    bfh;
        !            51:     PBITMAPINFO pbmi;
        !            52:     PBYTE       pBits;
        !            53:     BITMAPINFO  bmi;
        !            54:     PBYTE pjTmp, pjTmpBmi;
        !            55:     ULONG sizBMI;
        !            56: 
        !            57: 
        !            58:     bSuccess = TRUE;
        !            59:     if (!hBmp) {
        !            60:         MessageBox(ghwndMain, "There's no Bitmap to save!", "Error", MB_OK);
        !            61:         return FALSE;
        !            62:     }
        !            63: 
        !            64:     //
        !            65:     // Let the graphics engine to retrieve the dimension of the bitmap for us
        !            66:     // GetDIBits uses the size to determine if it's BITMAPCOREINFO or BITMAPINFO
        !            67:     // if BitCount != 0, color table will be retrieved
        !            68:     //
        !            69:     bmi.bmiHeader.biSize = 0x28;              // GDI need this to work
        !            70:     bmi.bmiHeader.biBitCount = 0;             // don't get the color table
        !            71:     if ((GetDIBits(hDC, hBmp, 0, 0, (LPSTR)NULL, &bmi, DIB_RGB_COLORS)) == 0) {
        !            72:         MessageBox(ghwndMain, "GetDIBits failed!", "Error", MB_OK);
        !            73:         return FALSE;
        !            74:     }
        !            75: 
        !            76:     //
        !            77:     // Now that we know the size of the image, alloc enough memory to retrieve
        !            78:     // the actual bits
        !            79:     //
        !            80:     if ((pBits = (PBYTE)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
        !            81:                 bmi.bmiHeader.biWidth * bmi.bmiHeader.biHeight)) == NULL) {
        !            82:         MessageBox(ghwndMain, "Failed in Memory Allocation for pBits!", "Error", MB_OK);
        !            83:         return FALSE;
        !            84:     }
        !            85: 
        !            86:     //
        !            87:     // Note: 24 bits per pixel has no color table.  So, we don't have to
        !            88:     // allocate memory for retrieving that.  Otherwise, we do.
        !            89:     //
        !            90:     pbmi = &bmi;                                      // assume no color table
        !            91:     if (bmi.bmiHeader.biBitCount != 24) {             // has color table
        !            92:         sizBMI = sizeof(BITMAPINFO)+sizeof(RGBQUAD)*(1<<bmi.bmiHeader.biBitCount);
        !            93:         //
        !            94:         // I need more memory for the color table
        !            95:         //
        !            96:         if ((pbmi = (PBITMAPINFO)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizBMI )) == NULL) {
        !            97:             MessageBox(ghwndMain, "Failed in Memory Allocation for pbmi!", "Error", MB_OK);
        !            98:             bSuccess = FALSE;
        !            99:             goto ErrExit1;
        !           100:         }
        !           101: #if 0
        !           102:         pbmi->bmiHeader.biSize = bmi.bmiHeader.biSize;
        !           103:         pbmi->bmiHeader.biWidth = bmi.bmiHeader.biWidth;
        !           104:         pbmi->bmiHeader.biHeight = bmi.bmiHeader.biHeight;
        !           105:         pbmi->bmiHeader.biPlanes = bmi.bmiHeader.biPlanes;
        !           106:         pbmi->bmiHeader.biBitCount = bmi.bmiHeader.biBitCount;
        !           107:         pbmi->bmiHeader.biCompression = bmi.bmiHeader.biCompression;
        !           108:         pbmi->bmiHeader.biSizeImage = bmi.bmiHeader.biSizeImage;
        !           109:         pbmi->bmiHeader.biXPelsPerMeter = bmi.bmiHeader.biXPelsPerMeter;
        !           110:         pbmi->bmiHeader.biYPelsPerMeter = bmi.bmiHeader.biYPelsPerMeter;
        !           111:         pbmi->bmiHeader.biClrUsed = bmi.bmiHeader.biClrUsed;
        !           112:         pbmi->bmiHeader.biClrImportant = bmi.bmiHeader.biClrImportant;
        !           113: #endif
        !           114:         //
        !           115:         // Now that we've a bigger chunk of memory, let's copy the Bitmap
        !           116:         // info header data over
        !           117:         //
        !           118:         pjTmp = (PBYTE)pbmi;
        !           119:         pjTmpBmi = (PBYTE)&bmi;
        !           120:         sizBMI = sizeof(BITMAPINFOHEADER);
        !           121: 
        !           122:         while(sizBMI--)
        !           123:         {
        !           124:             *(((PBYTE)pjTmp)++) = *((pjTmpBmi)++);
        !           125:         }
        !           126: 
        !           127:     }
        !           128: 
        !           129:     //
        !           130:     // Let's open the file and get ready for writing
        !           131:     //
        !           132:     if ((hFile = OpenFile(pszFileName, (LPOFSTRUCT)&ofReOpenBuff,
        !           133:                  OF_CREATE | OF_WRITE)) == -1) {
        !           134:         MessageBox(ghwndMain, "Failed in OpenFile!", "Error", MB_OK);
        !           135:         ErrorOut("OpenFile");
        !           136:         goto ErrExit2;
        !           137:     }
        !           138: 
        !           139:     //
        !           140:     // But first, fill in the info for the BitmapFileHeader
        !           141:     //
        !           142:     bfh.bfType = 0x4D42;                            // 'BM'
        !           143:     bfh.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*
        !           144:         ((pbmi->bmiHeader.biBitCount == 24) ? 0 : (1<<pbmi->bmiHeader.biBitCount))+
        !           145:         pbmi->bmiHeader.biSizeImage;
        !           146:     bfh.bfReserved1 =
        !           147:     bfh.bfReserved2 = 0;
        !           148:     bfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+
        !           149:         sizeof(RGBQUAD)*((pbmi->bmiHeader.biBitCount == 24) ? 0 : (1<<pbmi->bmiHeader.biBitCount));
        !           150: 
        !           151:     //
        !           152:     // Write out the file header now
        !           153:     //
        !           154:     if (_lwrite(hFile, (LPSTR)&bfh, sizeof(BITMAPFILEHEADER)) == -1) {
        !           155:         MessageBox(ghwndMain, "Failed in WriteFile!", "Error", MB_OK);
        !           156:         bSuccess = FALSE;
        !           157:         goto ErrExit3;
        !           158:     }
        !           159: 
        !           160:     //
        !           161:     // Bitmap can't be selected into a DC when calling GetDIBits
        !           162:     // Assume that the hDC is the DC where the bitmap would have been selected
        !           163:     // if indeed it has been selected
        !           164:     //
        !           165:     if (hTmpBmp = CreateCompatibleBitmap(hDC, pbmi->bmiHeader.biWidth, pbmi->bmiHeader.biHeight)) {
        !           166:         hBmpOld = SelectObject(hDC, hTmpBmp);
        !           167:         if ((GetDIBits(hDC, hBmp, 0, pbmi->bmiHeader.biHeight, (LPSTR)pBits, pbmi, DIB_RGB_COLORS))==0){
        !           168:             MessageBox(ghwndMain, "Failed in GetDIBits!", "Error", MB_OK);
        !           169:             bSuccess = FALSE;
        !           170:             goto ErrExit4;
        !           171:         }
        !           172:     } else {
        !           173:         MessageBox(ghwndMain, "Failed in creating bitmap!", "Error", MB_OK);
        !           174:         bSuccess = FALSE;
        !           175:         goto ErrExit3;
        !           176:     }
        !           177: 
        !           178:     //
        !           179:     // Now write out the BitmapInfoHeader and color table, if any
        !           180:     //
        !           181:     if (_lwrite(hFile, (LPSTR)pbmi, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) *
        !           182:         ((pbmi->bmiHeader.biBitCount == 24) ? 0 : (1 << pbmi->bmiHeader.biBitCount))) == -1) {
        !           183:         MessageBox(ghwndMain, "Failed in WriteFile!", "Error", MB_OK);
        !           184:         bSuccess = FALSE;
        !           185:         goto ErrExit4;
        !           186:     }
        !           187: 
        !           188:     //
        !           189:     // write the bits also
        !           190:     //
        !           191:     if (_lwrite(hFile, (LPSTR)pBits, pbmi->bmiHeader.biSizeImage) == -1) {
        !           192:         MessageBox(ghwndMain, "Failed in WriteFile!", "Error", MB_OK);
        !           193:         bSuccess = FALSE;
        !           194:         goto ErrExit4;
        !           195:     }
        !           196: 
        !           197: ErrExit4:
        !           198:     SelectObject(hDC, hBmpOld);
        !           199:     DeleteObject(hTmpBmp);
        !           200: ErrExit3:
        !           201:     _lclose(hFile);
        !           202: ErrExit2:
        !           203:     GlobalFree(pbmi);
        !           204: ErrExit1:
        !           205:     GlobalFree(pBits);
        !           206:     return bSuccess;
        !           207: }
        !           208: 
        !           209: /************************************************************************
        !           210:  * void ErrorOut(char errstring[30])
        !           211:  *
        !           212:  * Purpose: Print out an meainful error code by means of
        !           213:  *       GetLastError and printf
        !           214:  *
        !           215:  * Inputs:  errstring - the action that failed, passed by the
        !           216:  *                   calling proc.
        !           217:  *
        !           218:  * Returns: none
        !           219:  *
        !           220:  * Calls:   GetLastError
        !           221:  *
        !           222:  * History:
        !           223:  * 09-13-91 Pete Grey   Created.
        !           224:  *
        !           225: \************************************************************************/
        !           226: 
        !           227: 
        !           228: void ErrorOut(char errstring[30])
        !           229: {
        !           230: DWORD Error;
        !           231: CHAR  str[80];
        !           232: 
        !           233: Error= GetLastError();
        !           234: wsprintf((LPSTR) str, "Error on %s = %d\n", errstring, Error);
        !           235: MessageBox(ghwndMain, (LPSTR)str, "Error", MB_OK);
        !           236: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.