home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / shapewin.zip / bmpload.c next >
C/C++ Source or Header  |  1998-09-22  |  3KB  |  129 lines

  1. /*
  2.  * bmpload.c - bitmap library, load bitmap from file
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9.  
  10. #define INCL_PM
  11. #include <Os2.h>
  12.  
  13. #include "bmpload.h"
  14.  
  15. BOOL    debugBmpLoadFile = FALSE ;
  16.  
  17. /*
  18.  * loadData, freeData - load/dispose bitmap data from file
  19.  */
  20.  
  21. static  PUCHAR  loadData(PUCHAR fname)
  22. {
  23.     struct stat st  ;
  24.     PUCHAR      p   ;
  25.     FILE        *fp ;
  26.     PUCHAR      fn = "loadData" ;
  27.  
  28.     /*
  29.      * query file size and prepare buffer
  30.      */
  31.  
  32.     if (stat(fname, &st) != 0) {
  33.         if (debugBmpLoadFile) {
  34.             fprintf(stderr, "%s - failed to stat %s\n", fn, fname) ;
  35.         }
  36.         return NULL ;
  37.     }
  38.  
  39.     if (debugBmpLoadFile) {
  40.         fprintf(stderr, "%s - %s %d bytes\n", fn, fname, st.st_size) ;
  41.     }
  42.  
  43.     if ((p = malloc(st.st_size)) == NULL) {
  44.         if (debugBmpLoadFile) {
  45.         fprintf(stderr, "%s - failed to alloc %d\n", fn, st.st_size) ;
  46.         }
  47.         return NULL ;
  48.     }
  49.  
  50.     /*
  51.      * open file and read into buffer
  52.      */
  53.  
  54.     if ((fp = fopen(fname, "rb")) == NULL) {
  55.         if (debugBmpLoadFile) {
  56.             fprintf(stderr, "%s - failed to open %s\n", fn, fname) ;
  57.         }
  58.         free(p) ;
  59.     return NULL ;
  60.     }
  61.     fread(p, 1, st.st_size, fp) ;
  62.     fclose(fp) ;
  63.  
  64.     /*
  65.      * check if file was really bitmap file
  66.      */
  67.  
  68.     if (p[0] != 'B' || p[1] != 'M') {
  69.         if (debugBmpLoadFile) {
  70.         fprintf(stderr, "%s - %s is not bitmap file\n", fname) ;
  71.         }
  72.     free(p) ;
  73.     return NULL ;
  74.     }
  75.     return p ;
  76. }
  77.  
  78. static  void    freeData(PUCHAR data)
  79. {
  80.     if (data) {
  81.         free(data) ;
  82.     }
  83. }
  84.  
  85. /*
  86.  * bitmapLoadFile - load bitmap from file
  87.  */
  88.  
  89. HBITMAP bitmapLoadFile(HAB hab, HPS hps, PUCHAR fname)
  90. {
  91.     PUCHAR  pbm ;
  92.     HBITMAP hbm ;
  93.     PBITMAPFILEHEADER2  pbfh ;
  94.     PUCHAR  fn = "bitmapLoadFile" ;
  95.  
  96.     /*
  97.      * load bitmap data from file
  98.      */
  99.  
  100.     if ((pbm = loadData(fname)) == NULL) {
  101.         if (debugBmpLoadFile) {
  102.             fprintf(stderr, "%s - failed to load %s\n", fn, fname) ;
  103.         }
  104.         return NULLHANDLE ;
  105.     }
  106.     pbfh = (PBITMAPFILEHEADER2) pbm ;
  107.  
  108.     /*
  109.      * create bitmap from loaded data
  110.      */
  111.  
  112.     hbm = GpiCreateBitmap(hps, &pbfh->bmp2, CBM_INIT,
  113.                 (pbm + pbfh->offBits), (PBITMAPINFO2) &pbfh->bmp2) ;
  114.  
  115.     if (hbm == NULLHANDLE) {
  116.         if (debugBmpLoadFile) {
  117.         fprintf(stderr, "%s - failed to create bitmap\n", fn)  ;
  118.         }
  119.         freeData(pbm) ;
  120.     return NULLHANDLE ;
  121.     }
  122.     
  123.     GpiSetBitmap(hps, hbm) ;
  124.     freeData(pbm) ;
  125.     
  126.     return hbm ;
  127. }
  128.  
  129.