home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / bmviewer.zip / PixelBuffer.c < prev    next >
Text File  |  2000-06-26  |  4KB  |  127 lines

  1. #pragma strings(readonly)
  2.  
  3. #define INCL_DOSFILEMGR
  4. #define INCL_DOSERRORS
  5. #define INCL_GPIBITMAPS
  6.  
  7. #include <os2.h>
  8.  
  9.  
  10. #include <malloc.h>
  11. #include <memory.h>
  12.  
  13. #include "PixelBuffer.h"
  14.  
  15.  
  16.  
  17. PPIXELBUFFER _Optlink LoadPixelBuffer(PSZ pszFile)
  18. {
  19.    APIRET rc = NO_ERROR;
  20.    const ULONG fsOpenFlags = OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS;
  21.    const ULONG fsOpenMode = OPEN_SHARE_DENYWRITE | OPEN_ACCESS_READONLY;
  22.    PVOID pAlloc = NULL;
  23.    PPIXELBUFFER pb = NULL;
  24.    HFILE hFile = NULLHANDLE;
  25.    ULONG ulAction = 0;
  26.  
  27.    /*
  28.     * Open bitmap file
  29.     */
  30.    if((rc = DosOpen(pszFile, &hFile, &ulAction, 0UL, FILE_NORMAL, fsOpenFlags, fsOpenMode, NULL)) == NO_ERROR)
  31.    {
  32.       FILESTATUS3 fstatus = { 0 };
  33.  
  34.       /*
  35.        * Query bitmap file size
  36.        */
  37.       if((rc = DosQueryFileInfo(hFile, FIL_STANDARD, &fstatus, sizeof(fstatus))) == NO_ERROR)
  38.       {
  39.          PBYTE pBitmapFile = NULL;
  40.  
  41.          /*
  42.           * Allocate buffer to hold file data
  43.           */
  44.          if((pBitmapFile = malloc(fstatus.cbFile)) != NULL)
  45.          {
  46.             ULONG cbRead = 0;
  47.  
  48.             /*
  49.              * Read bitmap file
  50.              */
  51.             if((rc = DosRead(hFile, pBitmapFile, fstatus.cbFile, &cbRead)) == NO_ERROR)
  52.             {
  53.                BITMAPFILEHEADER2 *pbfh2 = NULL;
  54.                BITMAPINFOHEADER2 *pbmp2 = NULL;
  55.  
  56.                pbfh2 = (BITMAPFILEHEADER2*)pBitmapFile;
  57.  
  58.                /*
  59.                 * Parse bitmap type from file header
  60.                 */
  61.                switch(pbfh2->usType)
  62.                {
  63.                   case BFT_BITMAPARRAY:
  64.                      pbfh2 = &(((BITMAPARRAYFILEHEADER2*)pBitmapFile)->bfh2);
  65.                      pbmp2 = &pbfh2->bmp2;
  66.                      break;
  67.  
  68.                   case BFT_BMAP:
  69.                      pbmp2 = &pbfh2->bmp2;
  70.                      break;
  71.  
  72.                   default:
  73.                      case BFT_ICON:
  74.                      case BFT_POINTER:
  75.                      case BFT_COLORICON:
  76.                      case BFT_COLORPOINTER:
  77.                      break;
  78.                }
  79.                if(pbmp2)
  80.                {
  81.                   PBYTE pBitmap = NULL;
  82.  
  83.                   pb = malloc(sizeof(PIXELBUFFER));
  84.                   if(pb)
  85.                   {
  86.                      memset(pb, 0, sizeof(PIXELBUFFER));
  87.  
  88.                      pb->bmi2.cbFix = 16;
  89.                      pb->cx = pb->bmi2.cx = pbmp2->cx;
  90.                      pb->cy = pb->bmi2.cy = pbmp2->cy;
  91.                      pb->cBitCount = pbmp2->cBitCount;
  92.                      pb->bmi2.cPlanes = pbmp2->cPlanes;
  93.                      pb->bmi2.cBitCount = pbmp2->cBitCount;
  94.  
  95.                      pb->clip.xLeft = pb->clip.yBottom = 0;
  96.                      pb->clip.xRight = pb->cx;
  97.                      pb->clip.yTop = pb->cy;
  98.  
  99.                      /*
  100.                       * Allocate bufffer to hold bitmap
  101.                       */
  102.                      pb->cbBitmap = (((pb->bmi2.cBitCount * pb->bmi2.cx) + 31) / 32) * 4 * pb->bmi2.cy * pb->bmi2.cPlanes;
  103.                      if((pb->data = malloc(pb->cbBitmap)) != NULL)
  104.                      {
  105.                         memcpy(pb->data, pBitmapFile + pbfh2->offBits, pb->cbBitmap);
  106.                      }
  107.                      pb->cbLine = (((pb->bmi2.cBitCount * pb->bmi2.cx) + 31) / 32) * 4 * pb->bmi2.cPlanes;
  108.                   }
  109.                }
  110.             }
  111.             free(pBitmapFile);
  112.             _heapmin();
  113.          }
  114.       }
  115.       DosClose(hFile);
  116.    }
  117.  
  118.    return pb;
  119. }
  120.  
  121. void _Optlink FreePixelBuffer(PPIXELBUFFER pb)
  122. {
  123.    free(pb->data);
  124.    free(pb);
  125.    _heapmin();
  126. }
  127.