1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
#include "loader.hpp"
#include "image.hpp"
#include "palette.hpp"
#include "mdlread.hpp"
#include "ppmread.hpp"
#include "xwdread.hpp"
#include "glread.hpp"
#include "pcxread.hpp"
#include "lbmread.hpp"
#include "targa.hpp"
int tell_color_size(char *filename)
{
if (bmp_bits(filename)==24) return 24;
if (PCX_file_type(filename)==PCX_24) return 24;
clear_errors();
return 8;
}
image24 *load_any24(char *filename)
{
if (bmp_bits(filename)==24)
return read_bmp24(filename);
else if (PCX_file_type(filename)==PCX_24)
return read_PCX24(filename);
else return NULL;
}
// if total_read returned<0 then, this function returns a error message number
short load_any(char *filename, image **&images, palette *&pal, short &total_read, palette *ref_pal)
{
pal=NULL; images=NULL; total_read=0;
switch (tell_file_type(filename))
{
case LOADER_not_supported : break;
case LOADER_mdl :
total_read=mdl_total_images(filename);
if (!current_error())
images=read_mdl(filename,pal,1,total_read,total_read);
break;
case LOADER_xwd :
images=(image **)jmalloc(sizeof(image *),"loader::xwd image * array");
total_read=1;
images[0]=readxwd(filename,pal);
break;
case LOADER_ppm :
images=(image **)jmalloc(sizeof(image *),"loader::ppm image * array");
total_read=1;
pal=new palette;
images[0]=read_ppm(filename,pal,PPM_REG);
break;
case LOADER_pic :
images=(image **)jmalloc(sizeof(image *),"loader::pic image * array");
total_read=1;
pal=NULL;
images[0]=read_pic(filename,pal);
break;
case LOADER_bmp8 :
images=(image **)jmalloc(sizeof(image *),"loader::bmp image * array");
total_read=1;
pal=NULL;
images[0]=read_bmp(pal,filename);
break;
case LOADER_pcx8 :
images=(image **)jmalloc(sizeof(image *),"loader::pcx image * array");
total_read=1;
pal=NULL;
images[0]=read_PCX(filename,pal);
break;
case LOADER_lbm :
images=(image **)jmalloc(sizeof(image *),"loader::pcx image * array");
total_read=1;
pal=NULL;
images[0]=read_lbm(filename,pal);
break;
case LOADER_targa :
{
if (ref_pal)
{
images=(image **)jmalloc(sizeof(image *),"loader::targa image * array");
total_read=1;
images[0]=load_targa(filename,ref_pal);
pal=ref_pal->copy();
}
} break;
default :
set_error(imNOT_SUPPORTED);
}
if (current_error())
{
short i;
i=current_error();
set_error(0);
return i;
}
return 0;
}
graphics_type tell_file_type(char *filename)
{
FILE *fp;
unsigned char header[10];
fp=fopen(filename,"rb");
if (!fp)
return LOADER_not_supported;
else if (fread(header,1,12,fp)!=12)
{
fclose(fp);
return LOADER_not_supported;
}
fclose(fp);
if (header[0]=='J' && header[1]=='C'
&& header[2]=='2' && header[3]=='0')
return LOADER_mdl;
else if (header[4]==0 && header[5]==0 && header[6]==0 &&
header[7]==7)
return LOADER_xwd;
else if (header[0]=='P' && header[1]=='6')
return LOADER_ppm;
else if (header[10]==8 && header[11]==0xff)
return LOADER_pic;
else if (header[0]=='F' && header[1]=='O' && header[2]=='R' && header[3]=='M')
return LOADER_lbm;
else if (header[0]=='B' && header[1]=='M')
{
switch (tell_color_size(filename))
{
case 24 : return LOADER_bmp24; break;
case 8 : return LOADER_bmp8; break;
default : return LOADER_not_supported; break;
}
} else if (header[0]==10)
{
switch (tell_color_size(filename))
{
case 24 : return LOADER_pcx24; break;
case 8 : return LOADER_pcx8; break;
default : return LOADER_not_supported; break;
}
} else if (header[0]==0 && header[1]==0 && header[2]==10 && header[3]==0 && header[4]==0)
{
return LOADER_targa;
}
return LOADER_not_supported;
}
|