Panda3D
|
00001 /* Filename: bmp.h 00002 * Created by: 00003 * 00004 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 00005 * 00006 * PANDA 3D SOFTWARE 00007 * Copyright (c) Carnegie Mellon University. All rights reserved. 00008 * 00009 * All use of this software is subject to the terms of the revised BSD 00010 * license. You should have received a copy of this license along 00011 * with this source code in a file named "LICENSE." 00012 * 00013 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 00014 00015 #ifndef _BMP_H_ 00016 #define _BMP_H_ 00017 00018 #include "pandabase.h" 00019 #include "pnmimage_base.h" 00020 00021 /* prototypes */ 00022 static unsigned long BMPlenfileheader(int classv); 00023 static unsigned long BMPleninfoheader(int classv); 00024 static unsigned long BMPlenrgbtable(int classv, unsigned long bitcount); 00025 static unsigned long BMPlenline(int classv, unsigned long bitcount, unsigned long x); 00026 static unsigned long BMPlenbits(int classv, unsigned long bitcount, unsigned long x, unsigned long y); 00027 static unsigned long BMPlenfile(int classv, unsigned long bitcount, unsigned long x, unsigned long y); 00028 static unsigned long BMPoffbits(int classv, unsigned long bitcount); 00029 /* 00030 * Classves of BMP files 00031 */ 00032 00033 #define C_WIN 1 00034 #define C_OS2 2 00035 00036 static char er_internal[] = "%s: internal error!"; 00037 00038 static unsigned long 00039 BMPlenfileheader(int classv) 00040 { 00041 switch (classv) 00042 { 00043 case C_WIN: 00044 return 14; 00045 case C_OS2: 00046 return 14; 00047 default: 00048 pm_error(er_internal, "BMPlenfileheader"); 00049 return 0; 00050 } 00051 } 00052 00053 static unsigned long 00054 BMPleninfoheader(int classv) 00055 { 00056 switch (classv) 00057 { 00058 case C_WIN: 00059 return 40; 00060 case C_OS2: 00061 return 12; 00062 default: 00063 pm_error(er_internal, "BMPleninfoheader"); 00064 return 0; 00065 } 00066 } 00067 00068 static unsigned long 00069 BMPlenrgbtable(int classv, unsigned long bitcount) 00070 { 00071 unsigned long lenrgb; 00072 00073 if (bitcount > 8) { 00074 return 0; 00075 } 00076 00077 if (bitcount < 1) 00078 { 00079 pm_error(er_internal, "BMPlenrgbtable"); 00080 return 0; 00081 } 00082 switch (classv) 00083 { 00084 case C_WIN: 00085 lenrgb = 4; 00086 break; 00087 case C_OS2: 00088 lenrgb = 3; 00089 break; 00090 default: 00091 pm_error(er_internal, "BMPlenrgbtable"); 00092 return 0; 00093 } 00094 00095 return (1 << bitcount) * lenrgb; 00096 } 00097 00098 /* 00099 * length, in bytes, of a line of the image 00100 * 00101 * Evidently each row is padded on the right as needed to make it a 00102 * multiple of 4 bytes long. This appears to be true of both 00103 * OS/2 and Windows BMP files. 00104 */ 00105 static unsigned long 00106 BMPlenline(int classv, unsigned long bitcount, unsigned long x) 00107 { 00108 unsigned long bitsperline; 00109 00110 switch (classv) 00111 { 00112 case C_WIN: 00113 break; 00114 case C_OS2: 00115 break; 00116 default: 00117 pm_error(er_internal, "BMPlenline"); 00118 return 0; 00119 } 00120 00121 bitsperline = x * bitcount; 00122 00123 /* 00124 * if bitsperline is not a multiple of 32, then round 00125 * bitsperline up to the next multiple of 32. 00126 */ 00127 if ((bitsperline % 32) != 0) 00128 { 00129 bitsperline += (32 - (bitsperline % 32)); 00130 } 00131 00132 if ((bitsperline % 32) != 0) 00133 { 00134 pm_error(er_internal, "BMPlenline"); 00135 return 0; 00136 } 00137 00138 /* number of bytes per line == bitsperline/8 */ 00139 return bitsperline >> 3; 00140 } 00141 00142 /* return the number of bytes used to store the image bits */ 00143 static unsigned long 00144 BMPlenbits( 00145 int classv, 00146 unsigned long bitcount, 00147 unsigned long x, 00148 unsigned long y) 00149 { 00150 return y * BMPlenline(classv, bitcount, x); 00151 } 00152 00153 /* return the offset to the BMP image bits */ 00154 static unsigned long 00155 BMPoffbits( 00156 int classv, 00157 unsigned long bitcount) 00158 { 00159 return BMPlenfileheader(classv) 00160 + BMPleninfoheader(classv) 00161 + BMPlenrgbtable(classv, bitcount); 00162 } 00163 00164 /* return the size of the BMP file in bytes */ 00165 static unsigned long 00166 BMPlenfile( 00167 int classv, 00168 unsigned long bitcount, 00169 unsigned long x, 00170 unsigned long y) 00171 { 00172 return BMPoffbits(classv, bitcount) 00173 + BMPlenbits(classv, bitcount, x, y); 00174 } 00175 00176 #endif /* _BMP_H_ */ 00177