diff options
Diffstat (limited to 'conversion/test/test_png.cc')
-rw-r--r-- | conversion/test/test_png.cc | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/conversion/test/test_png.cc b/conversion/test/test_png.cc new file mode 100644 index 0000000..bc481fc --- /dev/null +++ b/conversion/test/test_png.cc @@ -0,0 +1,237 @@ +#include <stdlib.h> +#include <stdio.h> +#include <iostream> +#include <string.h> +#include <math.h> + + +#include "conversion/convertor.hh" +#include "conversion/png.hh" + +#ifdef EARLY_TEMPLATE +#define __EXECUTABLE__ +#include "raslib/template_inst.hh" +#endif + +static int init_identity(int offset) +{ + return offset; +} + +static int init_square(int offset) +{ + return offset * offset; +} + +static int SinTabOK = 0; +static int SinusTable[512]; + +static int init_sine(int offset) +{ + if (SinTabOK == 0) + { + int i; + + for (i=0; i<512; i++) + { + SinusTable[i] = (int)(255*sin(M_PI * offset / 512.0)); + } + SinTabOK = 1; + } + return SinusTable[offset & 511]; +} + +int test_picture(int width, int height, int bpp, int (*init)(int)) +{ + char *data; + r_Minterval interv(2); + int datasize; + int baseType; + int bytespp; + int i; + + switch (bpp) + { + case 1: baseType = r_Convertor::ctype_bool; bytespp = 1; break; + case 8: baseType = r_Convertor::ctype_char; bytespp = 1; break; + case 24: baseType = r_Convertor::ctype_rgb; bytespp = 3; break; + default: + cerr << "Unknown bpp value " << bpp << endl; + return -1; + } + + interv << r_Sinterval((r_Range)0, (r_Range)width-1) + << r_Sinterval((r_Range)0, (r_Range)height-1); + + datasize = (width * bytespp * height); + data = new char[datasize]; + + cout << "Test: bpp = " << bpp << ", domain = " << interv << ", size = " << datasize << endl; + + if (bpp > 1) + { + for (i=0; i<datasize; i++) data[i] = (char)init(i); + } + else + { + int j, count; + + for (i=0; i<datasize; i+=8) + { + count = datasize - i; if (count > 8) count = 8; + for (j=0; j<count; j++) data[i+j] = ((init(i>>3) & (1<<j)) == 0) ? 0 : 1; + //for (j=0; j<count; j++) cout << (char)(data[i+j] + '0'); cout << endl; + } + } + + r_Conv_PNG *png = NULL; + char *dest = NULL; + + try + { + r_convDesc desc; + int destsize; + int status = -1; + + png = new r_Conv_PNG(data, interv, baseType); + desc = png->convertTo(); + destsize = desc.destInterv[0].high() - desc.destInterv[0].low() + 1; + cout << "\tConverted to PNG, domain " << desc.destInterv << endl; + dest = desc.dest; + r_Minterval destInterv(desc.destInterv); + delete desc.destType; + delete png; + png = new r_Conv_PNG(dest, destInterv, r_Convertor::ctype_char); + desc = png->convertFrom(); + cout << "\tConverted from PNG, domain " << desc.destInterv << endl; + + if (interv == desc.destInterv) + status = memcmp(data, desc.dest, datasize); + + delete png; + delete [] data; + free(dest); + free(desc.dest); + delete desc.destType; + + if (status != 0) + { + cout << "\t!!! Data not identical !!!" << endl; + } + + return 0; + } + catch (r_Error &err) + { + cerr << "Error: " << err.what() << endl; + + delete [] data; + if (dest != NULL) free(dest); + if (png != NULL) delete png; + + return -1; + } +} + +int main(int argc, char *argv[]) +{ + int i; + char pngfile[256] = ""; + + i = 1; + while (i < argc) + { + if (strcmp(argv[i], "-file") == 0) + { + strcpy(pngfile, argv[++i]); + } + i++; + } + + if (pngfile[0] == '\0') + { + // No PNG-file given, standard test-suite + test_picture(400, 300, 1, init_identity); + test_picture(400, 300, 8, init_identity); + test_picture(400, 300, 24, init_identity); + test_picture(701, 333, 1, init_square); + test_picture(701, 333, 8, init_square); + test_picture(701, 333, 24, init_square); + test_picture(3007, 3999, 1, init_sine); + test_picture(3007, 3999, 8, init_sine); + test_picture(3007, 3999, 24, init_sine); + } + else + { + // Work on this file + FILE *fp; + size_t fsize; + char *data; + r_convDesc desc; + r_Conv_PNG *png; + r_Type *baseType; + + if ((fp = fopen(pngfile, "rb")) == NULL) + { + cerr << "Unable to open input file" << endl; + return -1; + } + fseek(fp, 0, SEEK_END); fsize = ftell(fp); fseek(fp, 0, SEEK_SET); + + data = new char[fsize]; + fread(data, 1, fsize, fp); + fclose(fp); + + png = NULL; baseType = NULL; + try + { + r_Minterval interv(1); + interv << r_Sinterval((r_Range)0, (r_Range)fsize-1); + + png = new r_Conv_PNG(data, interv, r_Convertor::ctype_char); + cout << "Converting file <" << pngfile << "> to MDD..." << endl; + desc = png->convertFrom(); + + cout << "Resulting domain " << desc.destInterv << ", "; + desc.destType->print_status(); + cout << endl; + + interv = r_Minterval(desc.destInterv); + + delete [] data; + data = desc.dest; + baseType = desc.destType; + delete png; + + fsize = (interv[0].high() - interv[0].low() + 1) * (interv[1].high() - interv[1].low() + 1); + + png = new r_Conv_PNG(data, interv, baseType); + cout << "Converting MDD back to PNG..." << endl; + desc = png->convertTo(); + + cout << "Resulting domain " << desc.destInterv << ", "; + desc.destType->print_status(); + cout << endl; + + fp = fopen("result.png", "wb"); + fwrite(desc.dest, 1, (desc.destInterv[0].high() - desc.destInterv[0].low() + 1), fp); + fclose(fp); + + delete baseType; + + free(data); + free(desc.dest); + delete desc.destType; + delete png; + } + catch (r_Error &err) + { + cerr << "Conversion failed: " << err.what() << endl; + if (baseType != NULL) delete baseType; + if (data != NULL) delete [] data; + if (png != NULL) delete png; + } + } + + return 0; +} |