home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 2 / RISC_DISC_2.iso / pd_share / program / sprtools / c / spr_diff < prev    next >
Encoding:
Text File  |  1994-09-13  |  6.6 KB  |  180 lines

  1. /************************************************************************
  2.  *                                                                      *
  3.  * spr_diff.c                                                           *
  4.  *                                                                      *
  5.  * Calculates various measeures of how different two sprites are.       *
  6.  * For use with sprites of the same size, but can have differing BPP.   *
  7.  * Aimed mainly as a test of how close an image is to the original      *
  8.  * after spr_fsi processing.                                            *
  9.  *                                                                      *
  10.  * Version 1.01 (13-Sep-1994)                                           *
  11.  *                                                                      *
  12.  * (C) 1993/4 DEEJ Technology PLC                                       *
  13.  *                                                                      *
  14.  ************************************************************************/
  15.  
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <math.h>
  20. #include "io.h"
  21. #include "sprite.h"
  22.  
  23.  
  24. int main(int argc, char** argv)
  25. {
  26.         FILE *inf1, *inf2;
  27.         int          x,y;
  28.         int          size;
  29.         uint         rgb;
  30.         uint         r1, g1, b1;
  31.         uint         r2, g2, b2;
  32.         int          rd, gd, bd;
  33.         int          rv, gv, bv;
  34.         spr_info_str spr1, spr2;
  35.  
  36.         double       total_lsq    = 0;
  37.         int          total_intn   = 0;
  38.         int          total_chrom  = 0;
  39.         int          total_accum  = 0;
  40.         int          total_red    = 0;
  41.         int          total_green  = 0;
  42.         int          total_blue   = 0;
  43.         double       lsq_diff     = 0;
  44.         int          intn_diff    = 0;
  45.         int          chrom_diff   = 0;
  46.         int          accum_diff   = 0;
  47.         int          red_diff     = 0;
  48.         int          green_diff   = 0;
  49.         int          blue_diff    = 0;
  50.  
  51.         /* cant use file_args() as using two input files */
  52.  
  53.         if(argc!=3)
  54.         {
  55.                 fprintf(stderr,"Syntax: %s <sprite> <sprite>\n", argv[0]);
  56.                 return(1);
  57.         }
  58.  
  59.         if((inf1 = fopen(argv[1],"r")) == 0)
  60.         {
  61.                 fprintf(stderr,"Could not open sprite 1\n");
  62.                 return(2);
  63.         }
  64.         if((inf2 = fopen(argv[2],"r")) == 0)
  65.         {
  66.                 fprintf(stderr,"Could not open sprite 2\n");
  67.                 return(3);
  68.         }
  69.  
  70.         read_sprite(&spr1, inf1);
  71.         read_sprite(&spr2, inf2);
  72.  
  73.         if(spr1.X != spr2.X  &&  spr1.Y != spr2.Y)
  74.         {
  75.                 fprintf(stderr,"Sprites have different sizes\n");
  76.                 return(40);
  77.         }
  78.  
  79.         progress_start("Comparing sprites          :");
  80.  
  81.         for(y=0; y<spr1.Y; y++)
  82.         {
  83.                 for(x=0; x<spr1.X; x++)
  84.                 {
  85.                         rgb = spr1.read_pixel_rgb(&spr1, x, y);
  86.                         r1  = (rgb >>  8) &0xFF;
  87.                         g1  = (rgb >> 16) &0xFF;
  88.                         b1  = (rgb >> 24) &0xFF;
  89.  
  90.                         rgb = spr2.read_pixel_rgb(&spr2, x, y);
  91.                         r2  = (rgb >>  8) &0xFF;
  92.                         g2  = (rgb >> 16) &0xFF;
  93.                         b2  = (rgb >> 24) &0xFF;
  94.  
  95.                         rd  = r1>r2 ? r1-r2 : r2-r1;
  96.                         gd  = g1>g2 ? g1-g2 : g2-g1;
  97.                         bd  = b1>b2 ? b1-b2 : b2-b1;
  98.  
  99.                         rv  = (r1+r2)/2;
  100.                         gv  = (g1+g2)/2;
  101.                         bv  = (b1+b2)/2;
  102.  
  103.                         total_red   += rv;
  104.                         red_diff    += rd;
  105.                         total_green += gv;
  106.                         green_diff  += gd;
  107.                         total_blue  += bv;
  108.                         blue_diff   += bd;
  109.                         accum_diff  += (r1-r2)+(g1-g2)+(b1-b2);
  110.                 }
  111.  
  112.                 progress(y, spr1.Y);
  113.         }
  114.  
  115.         progress_finish();
  116.  
  117.         size        = spr1.X * spr1.Y;
  118.  
  119.         lsq_diff    = sqrt((double)red_diff*(double)red_diff       +
  120.                            (double)green_diff*(double)green_diff   +
  121.                            (double)blue_diff*(double)blue_diff)    /
  122.                       sqrt((double)10.0);
  123.         total_lsq   = sqrt((double)total_red*(double)total_red     +
  124.                            (double)total_green*(double)total_green +
  125.                            (double)total_blue*(double)total_blue)  /
  126.                       sqrt((double)10.0);
  127.  
  128.         intn_diff   = (red_diff*3    +
  129.                        green_diff*6  +
  130.                        blue_diff)    / 10;
  131.         total_intn  = (total_red*3   +
  132.                        total_green*6 +
  133.                        total_blue)   / 10;
  134.  
  135.         chrom_diff  = (red_diff    +
  136.                        green_diff  +
  137.                        blue_diff)  / 3;
  138.         total_chrom = (total_red   +
  139.                        total_green +
  140.                        total_blue) / 3;
  141.  
  142.     if(accum_diff < 0) accum_diff = -accum_diff;
  143.     total_accum = red_diff + green_diff + blue_diff;
  144.     if(total_accum == 0) total_accum = 1;
  145.  
  146.         printf("Least Squares difference   : %-10.0f %6.2f%%\n",
  147.                 lsq_diff,
  148.                 lsq_diff*100.0/total_lsq);
  149.         printf("Least Squares diff average : %-10.0f %6.2f%%\n",
  150.                 lsq_diff/(double)size,
  151.                 lsq_diff*100.0/((double)size*255.0));
  152.         printf("Intensity difference       : %-10d %6.2f%%\n",
  153.                 intn_diff,
  154.                 (double)intn_diff*100.0/(double)total_intn);
  155.         printf("Intensity diff average     : %-10d %6.2f%%\n",
  156.                 intn_diff/size,
  157.                 (double)intn_diff*100.0/((double)size*255.0));
  158.         printf("Chrominance difference     : %-10d %6.2f%%\n",
  159.                 chrom_diff,
  160.                 (double)chrom_diff*100.0/(double)total_chrom);
  161.         printf("Chrominance diff average   : %-10d %6.2f%%\n",
  162.                 chrom_diff/size,
  163.                 (double)chrom_diff*100.0/((double)size*255.0));
  164.         printf("Red difference             : %-10d %6.2f%%\n",
  165.                 red_diff,
  166.                 (double)red_diff*100.0/(double)total_red);
  167.         printf("Green difference           : %-10d %6.2f%%\n",
  168.                 green_diff,
  169.                 (double)green_diff*100.0/(double)total_green);
  170.         printf("Blue difference            : %-10d %6.2f%%\n",
  171.                 blue_diff,
  172.                 (double)blue_diff*100.0/(double)total_blue);
  173.         printf("Accumulated difference     : %-10d %6.2f%%\n",
  174.                 accum_diff,
  175.                 (double)accum_diff*100.0/(double)total_accum);
  176.  
  177.         fclose(inf1);
  178.         fclose(inf2);
  179. }
  180.