home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * spr_diff.c *
- * *
- * Calculates various measeures of how different two sprites are. *
- * For use with sprites of the same size, but can have differing BPP. *
- * Aimed mainly as a test of how close an image is to the original *
- * after spr_fsi processing. *
- * *
- * Version 1.01 (13-Sep-1994) *
- * *
- * (C) 1993/4 DEEJ Technology PLC *
- * *
- ************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #include "io.h"
- #include "sprite.h"
-
-
- int main(int argc, char** argv)
- {
- FILE *inf1, *inf2;
- int x,y;
- int size;
- uint rgb;
- uint r1, g1, b1;
- uint r2, g2, b2;
- int rd, gd, bd;
- int rv, gv, bv;
- spr_info_str spr1, spr2;
-
- double total_lsq = 0;
- int total_intn = 0;
- int total_chrom = 0;
- int total_accum = 0;
- int total_red = 0;
- int total_green = 0;
- int total_blue = 0;
- double lsq_diff = 0;
- int intn_diff = 0;
- int chrom_diff = 0;
- int accum_diff = 0;
- int red_diff = 0;
- int green_diff = 0;
- int blue_diff = 0;
-
- /* cant use file_args() as using two input files */
-
- if(argc!=3)
- {
- fprintf(stderr,"Syntax: %s <sprite> <sprite>\n", argv[0]);
- return(1);
- }
-
- if((inf1 = fopen(argv[1],"r")) == 0)
- {
- fprintf(stderr,"Could not open sprite 1\n");
- return(2);
- }
- if((inf2 = fopen(argv[2],"r")) == 0)
- {
- fprintf(stderr,"Could not open sprite 2\n");
- return(3);
- }
-
- read_sprite(&spr1, inf1);
- read_sprite(&spr2, inf2);
-
- if(spr1.X != spr2.X && spr1.Y != spr2.Y)
- {
- fprintf(stderr,"Sprites have different sizes\n");
- return(40);
- }
-
- progress_start("Comparing sprites :");
-
- for(y=0; y<spr1.Y; y++)
- {
- for(x=0; x<spr1.X; x++)
- {
- rgb = spr1.read_pixel_rgb(&spr1, x, y);
- r1 = (rgb >> 8) &0xFF;
- g1 = (rgb >> 16) &0xFF;
- b1 = (rgb >> 24) &0xFF;
-
- rgb = spr2.read_pixel_rgb(&spr2, x, y);
- r2 = (rgb >> 8) &0xFF;
- g2 = (rgb >> 16) &0xFF;
- b2 = (rgb >> 24) &0xFF;
-
- rd = r1>r2 ? r1-r2 : r2-r1;
- gd = g1>g2 ? g1-g2 : g2-g1;
- bd = b1>b2 ? b1-b2 : b2-b1;
-
- rv = (r1+r2)/2;
- gv = (g1+g2)/2;
- bv = (b1+b2)/2;
-
- total_red += rv;
- red_diff += rd;
- total_green += gv;
- green_diff += gd;
- total_blue += bv;
- blue_diff += bd;
- accum_diff += (r1-r2)+(g1-g2)+(b1-b2);
- }
-
- progress(y, spr1.Y);
- }
-
- progress_finish();
-
- size = spr1.X * spr1.Y;
-
- lsq_diff = sqrt((double)red_diff*(double)red_diff +
- (double)green_diff*(double)green_diff +
- (double)blue_diff*(double)blue_diff) /
- sqrt((double)10.0);
- total_lsq = sqrt((double)total_red*(double)total_red +
- (double)total_green*(double)total_green +
- (double)total_blue*(double)total_blue) /
- sqrt((double)10.0);
-
- intn_diff = (red_diff*3 +
- green_diff*6 +
- blue_diff) / 10;
- total_intn = (total_red*3 +
- total_green*6 +
- total_blue) / 10;
-
- chrom_diff = (red_diff +
- green_diff +
- blue_diff) / 3;
- total_chrom = (total_red +
- total_green +
- total_blue) / 3;
-
- if(accum_diff < 0) accum_diff = -accum_diff;
- total_accum = red_diff + green_diff + blue_diff;
- if(total_accum == 0) total_accum = 1;
-
- printf("Least Squares difference : %-10.0f %6.2f%%\n",
- lsq_diff,
- lsq_diff*100.0/total_lsq);
- printf("Least Squares diff average : %-10.0f %6.2f%%\n",
- lsq_diff/(double)size,
- lsq_diff*100.0/((double)size*255.0));
- printf("Intensity difference : %-10d %6.2f%%\n",
- intn_diff,
- (double)intn_diff*100.0/(double)total_intn);
- printf("Intensity diff average : %-10d %6.2f%%\n",
- intn_diff/size,
- (double)intn_diff*100.0/((double)size*255.0));
- printf("Chrominance difference : %-10d %6.2f%%\n",
- chrom_diff,
- (double)chrom_diff*100.0/(double)total_chrom);
- printf("Chrominance diff average : %-10d %6.2f%%\n",
- chrom_diff/size,
- (double)chrom_diff*100.0/((double)size*255.0));
- printf("Red difference : %-10d %6.2f%%\n",
- red_diff,
- (double)red_diff*100.0/(double)total_red);
- printf("Green difference : %-10d %6.2f%%\n",
- green_diff,
- (double)green_diff*100.0/(double)total_green);
- printf("Blue difference : %-10d %6.2f%%\n",
- blue_diff,
- (double)blue_diff*100.0/(double)total_blue);
- printf("Accumulated difference : %-10d %6.2f%%\n",
- accum_diff,
- (double)accum_diff*100.0/(double)total_accum);
-
- fclose(inf1);
- fclose(inf2);
- }
-