|
inlib
1.2.0
|
Typedefs | |
| typedef unsigned char *(* | file_reader )(std::ostream &, const std::string &, unsigned int &, unsigned int &, unsigned int &) |
| typedef unsigned char *(* | reader )(FILE *, unsigned int &, unsigned int &) |
| typedef bool(* | writer )(FILE *, unsigned char *, unsigned int, unsigned int) |
Functions | |
| unsigned char * | concatenate (unsigned char **a_buffers, unsigned int a_w, unsigned int a_h, unsigned int a_bpp, unsigned int a_cols, unsigned int a_rows, unsigned int a_bw, unsigned int a_bh, unsigned char a_bc, unsigned int &a_rw, unsigned int &a_rh) |
| unsigned char * | concatenate (std::ostream &a_out, const std::vector< std::string > &a_files, unsigned int a_cols, unsigned int a_rows, unsigned int a_bw, unsigned int a_bh, unsigned char a_bc, file_reader a_file_reader, unsigned int &a_w, unsigned int &a_h, unsigned int &a_bpp) |
| bool | convert (std::ostream &a_out, const std::string &a_sin, reader a_reader, const std::string &a_sout, writer a_writer) |
| typedef unsigned char*(* inlib::image::file_reader)(std::ostream &, const std::string &, unsigned int &, unsigned int &, unsigned int &) |
| typedef unsigned char*(* inlib::image::reader)(FILE *, unsigned int &, unsigned int &) |
| typedef bool(* inlib::image::writer)(FILE *, unsigned char *, unsigned int, unsigned int) |
| unsigned char* inlib::image::concatenate | ( | unsigned char ** | a_buffers, |
| unsigned int | a_w, | ||
| unsigned int | a_h, | ||
| unsigned int | a_bpp, | ||
| unsigned int | a_cols, | ||
| unsigned int | a_rows, | ||
| unsigned int | a_bw, | ||
| unsigned int | a_bh, | ||
| unsigned char | a_bc, | ||
| unsigned int & | a_rw, | ||
| unsigned int & | a_rh | ||
| ) | [inline] |
Definition at line 17 of file image.
{
// assume a_buffers has a_cols*a_rows entries.
// a_buffers[0] is bottom-left
// a_row=0 is bottom.
unsigned wbw = a_w + 2*a_bw;
unsigned hbh = a_h + 2*a_bh;
a_rw = wbw * a_cols;
a_rh = hbh * a_rows;
//printf("debug : %d %d\n",a_rw,a_rh);
// on big concatenated image the below may fail :
unsigned char* rb = new unsigned char[a_rh*a_rw*a_bpp];
if(!rb) {a_rw = 0;a_rh = 0;return 0;}
unsigned int wbw3 = wbw*a_bpp;
unsigned int aw3 = a_w*a_bpp;
//copy tiles :
unsigned int index = 0;
for(unsigned int j=0;j<a_rows;j++) {
for(unsigned int i=0;i<a_cols;i++) {
unsigned char* tile = a_buffers[index];
for(unsigned int r=0;r<hbh;r++) {
unsigned char* pos = rb + (j*hbh+r)*a_rw*a_bpp + i*wbw*a_bpp;
::memset(pos,a_bc,wbw3);
}
for(unsigned int r=0;r<a_h;r++) {
unsigned char* pos = rb + (j*hbh+r+a_bh)*a_rw*a_bpp +
(i*wbw+a_bw)*a_bpp;
unsigned char* ptile = tile+r*aw3;
for(unsigned int c=0;c<aw3;c++) *pos++ = *ptile++;
}
index++;
}
}
return rb;
}
| unsigned char* inlib::image::concatenate | ( | std::ostream & | a_out, |
| const std::vector< std::string > & | a_files, | ||
| unsigned int | a_cols, | ||
| unsigned int | a_rows, | ||
| unsigned int | a_bw, | ||
| unsigned int | a_bh, | ||
| unsigned char | a_bc, | ||
| file_reader | a_file_reader, | ||
| unsigned int & | a_w, | ||
| unsigned int & | a_h, | ||
| unsigned int & | a_bpp | ||
| ) | [inline] |
Definition at line 193 of file image.
{
// a_files[0] is cols=0, rows=0
// a_files[1] is cols=1, rows=0
// a_files[2] is cols=2, rows=0
// ...
// and row=0 is bottom of big image.
unsigned int number = a_cols*a_rows;
if(number!=a_files.size()) {
a_out << "inlib::image::concatenate :"
<< " bad number of files. " << number << " expected."
<< std::endl;
a_bpp = a_w = a_h = 0;
return 0;
}
if(a_files.empty()) {
a_out << "inlib::image::concatenate :"
<< " list of files is empty."
<< std::endl;
a_bpp = a_w = a_h = 0;
return 0;
}
unsigned int w1 = 0;
unsigned int h1 = 0;
unsigned int bpp1 = 0;
typedef unsigned char* buffer_t;
buffer_t* bs = new buffer_t[number];
{for(unsigned int i=0;i<number;i++) {bs[i] = 0;}}
bool read_failed = false;
unsigned int index = 0;
for(unsigned int j=0;j<a_rows;j++) {
for(unsigned int i=0;i<a_cols;i++) {
const std::string& file = a_files[index];
unsigned int w,h,bpp;
unsigned char* b = a_file_reader(a_out,file,w,h,bpp);
if(!b) {
a_out << "inlib::image::concatenate :"
<< " can't read " << file << " expected."
<< std::endl;
read_failed = true;
break;
}
if(!index) {
w1 = w;
h1 = h;
bpp1 = bpp;
} else {
if(w!=w1) {
a_out << "inlib::image::concatenate :"
<< " file " << file
<< " does not have same width image as the first file one."
<< " (" << w << "," << w1 << ")."
<< std::endl;
delete [] b;
read_failed = true;
break;
}
if(h!=h1) {
a_out << "inlib::image::concatenate :"
<< " file " << file
<< " does not have same height image as the first file one."
<< " (" << h << "," << h1 << ")."
<< std::endl;
delete [] b;
read_failed = true;
break;
}
if(bpp!=bpp1) {
a_out << "inlib::image::concatenate :"
<< " file " << file
<< " does not have same bytes per pixel as the first file one."
<< " (" << h << "," << h1 << ")."
<< std::endl;
delete [] b;
read_failed = true;
break;
}
}
bs[index] = b;
index++;
}
if(read_failed) break;
}
if(read_failed) {
{for(unsigned int i=0;i<number;i++) {delete [] bs[i];}}
a_bpp = a_w = a_h = 0;
return 0;
}
unsigned int wa,ha;
unsigned char* ba =
inlib::image::concatenate(bs,w1,h1,bpp1,
a_cols,a_rows,a_bw,a_bh,a_bc,wa,ha);
if(!ba) {
a_out << "inlib::image::concatenate :"
<< " failed to concatenate all buffers."
<< std::endl;
{for(unsigned int i=0;i<number;i++) {delete [] bs[i];}}
a_bpp = a_w = a_h = 0;
return 0;
}
{for(unsigned int i=0;i<number;i++) {delete [] bs[i];}}
a_w = wa;
a_h = ha;
a_bpp = bpp1;
return ba;
}
| bool inlib::image::convert | ( | std::ostream & | a_out, |
| const std::string & | a_sin, | ||
| reader | a_reader, | ||
| const std::string & | a_sout, | ||
| writer | a_writer | ||
| ) | [inline] |
Definition at line 322 of file image.
{
FILE* fin = ::fopen(a_sin.c_str(),"rb");
if(!fin) {
a_out << "inlib::image::convert :"
<< " can't open " << a_sin
<< std::endl;
return false;
}
unsigned int w,h;
unsigned char* b = a_reader(fin,w,h);
if(!b) {
a_out << "inlib::image::convert :"
<< " can't read " << a_sin
<< std::endl;
::fclose(fin);
return false;
}
::fclose(fin);
FILE* fout = ::fopen(a_sout.c_str(),"wb");
if(!fout) {
a_out << "inlib::image::convert :"
<< " can't open " << a_sout
<< std::endl;
delete [] b;
return false;
}
if(!a_writer(fout,b,w,h)) {
a_out << "inlib::image::convert :"
<< " can't write " << a_sout
<< std::endl;
::fclose(fout);
delete [] b;
return false;
}
::fclose(fout);
delete [] b;
return true;
}
1.7.5.1