bmploader.cpp
上传用户:liuping58
上传日期:2022-06-05
资源大小:105k
文件大小:4k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright 1993-2007 NVIDIA Corporation.  All rights reserved.
  3.  *
  4.  * NOTICE TO USER:
  5.  *
  6.  * This source code is subject to NVIDIA ownership rights under U.S. and
  7.  * international Copyright laws.  Users and possessors of this source code
  8.  * are hereby granted a nonexclusive, royalty-free license to use this code
  9.  * in individual and commercial software.
  10.  *
  11.  * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
  12.  * CODE FOR ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
  13.  * IMPLIED WARRANTY OF ANY KIND.  NVIDIA DISCLAIMS ALL WARRANTIES WITH
  14.  * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
  15.  * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
  16.  * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
  17.  * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  18.  * OF USE, DATA OR PROFITS,  WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  19.  * OR OTHER TORTIOUS ACTION,  ARISING OUT OF OR IN CONNECTION WITH THE USE
  20.  * OR PERFORMANCE OF THIS SOURCE CODE.
  21.  *
  22.  * U.S. Government End Users.   This source code is a "commercial item" as
  23.  * that term is defined at  48 C.F.R. 2.101 (OCT 1995), consisting  of
  24.  * "commercial computer  software"  and "commercial computer software
  25.  * documentation" as such terms are  used in 48 C.F.R. 12.212 (SEPT 1995)
  26.  * and is provided to the U.S. Government only as a commercial end item.
  27.  * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
  28.  * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
  29.  * source code with only those rights set forth herein.
  30.  *
  31.  * Any use of this source code in individual and commercial software must
  32.  * include, in the user documentation and internal comments to the code,
  33.  * the above Disclaimer and U.S. Government End Users Notice.
  34.  */
  35. #include <stdio.h>
  36. #include <stdlib.h>
  37. #ifdef _WIN32
  38. #   pragma warning( disable : 4996 ) // disable deprecated warning 
  39. #endif
  40. #pragma pack(1)
  41. typedef struct{
  42.     short type;
  43.     int size;
  44.     short reserved1;
  45.     short reserved2;
  46.     int offset;
  47. } BMPHeader;
  48. typedef struct{
  49.     int size;
  50.     int width;
  51.     int height;
  52.     short planes;
  53.     short bitsPerPixel;
  54.     unsigned compression;
  55.     unsigned imageSize;
  56.     int xPelsPerMeter;
  57.     int yPelsPerMeter;
  58.     int clrUsed;
  59.     int clrImportant;
  60. } BMPInfoHeader;
  61. //Isolated definition
  62. typedef struct{
  63.     unsigned char x, y, z, w;
  64. } uchar4;
  65. void LoadBMPFile(uchar4 **dst, int *width, int *height, const char *name){
  66.     BMPHeader hdr;
  67.     BMPInfoHeader infoHdr;
  68.     int x, y;
  69.     FILE *fd;
  70.     printf("Loading %s...n", name);
  71.     if(sizeof(uchar4) != 4){
  72.         printf("***Bad uchar4 size***n");
  73.         exit(0);
  74.     }
  75.     if( !(fd = fopen(name,"rb")) ){
  76.         printf("***BMP load error: file access denied***n");
  77.         exit(0);
  78.     }
  79.     fread(&hdr, sizeof(hdr), 1, fd);
  80.     if(hdr.type != 0x4D42){
  81.         printf("***BMP load error: bad file format***n");
  82.         exit(0);
  83.     }
  84.     fread(&infoHdr, sizeof(infoHdr), 1, fd);
  85.     if(infoHdr.bitsPerPixel != 24){
  86.         printf("***BMP load error: invalid color depth***n");
  87.         exit(0);
  88.     }
  89.     if(infoHdr.compression){
  90.         printf("***BMP load error: compressed image***n");
  91.         exit(0);
  92.     }
  93.     *width  = infoHdr.width;
  94.     *height = infoHdr.height;
  95.     *dst    = (uchar4 *)malloc(*width * *height * 4);
  96.     printf("BMP width: %un", infoHdr.width);
  97.     printf("BMP height: %un", infoHdr.height);
  98.     fseek(fd, hdr.offset - sizeof(hdr) - sizeof(infoHdr), SEEK_CUR);
  99.     for(y = 0; y < infoHdr.height; y++){
  100.         for(x = 0; x < infoHdr.width; x++){
  101.             (*dst)[(y * infoHdr.width + x)].z = fgetc(fd);
  102.             (*dst)[(y * infoHdr.width + x)].y = fgetc(fd);
  103.             (*dst)[(y * infoHdr.width + x)].x = fgetc(fd);
  104.         }
  105.         for(x = 0; x < (4 - (3 * infoHdr.width) % 4) % 4; x++)
  106.             fgetc(fd);
  107.     }
  108.     if(ferror(fd)){
  109.         printf("***Unknown BMP load error.***n");
  110.         free(*dst);
  111.         exit(0);
  112.     }else
  113.         printf("BMP file loaded successfully!n");
  114.     fclose(fd);
  115. }