Ineluki80

Mona_Lisa.awk Progforum 2013 Contest

Mar 25th, 2013
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Awk 3.81 KB | None | 0 0
  1. #!/usr/bin/awk -f
  2.  
  3. BEGIN {
  4.   print "Start Input" | "cat >&2"  
  5.   x = 0;
  6.   y = 1;
  7.   p = 0;
  8.   printf "/X+X--/!!!!!!!!//$"
  9. }
  10.  
  11. function abs(x) {
  12.   return ( x < 0) ? -x : x;
  13. }
  14.  
  15. function reduceRGB(   i) {
  16.   rgb[1] = and( rgb[1], 0xE0 ); #11100000
  17.   rgb[2] = and( rgb[2], 0xE0 ); #11100000
  18.   if ( rgb[3] > 127 ) { rgb[3] = 127; }
  19.   rgb[3] = and( rgb[3], 0xE0 ); #11100000
  20.   return lshift(rgb[1],1) + rshift(rgb[2],2) + rshift(rgb[3],5);
  21.   #R 11100000 |
  22.   #G    111000|00
  23.   #B       111|00000
  24.   #C 111111111| <- 9 bit Farbinfo
  25. }
  26.  
  27. function getColor(color) {
  28.   rgb[1] = rshift(and(color, 0x1C0),1);
  29.   rgb[2] = lshift(and(color, 0x038),2);
  30.   rgb[3] = lshift(and(color, 0x007),5);
  31. }
  32.  
  33. /WH/ {
  34.   w=$2; h=$3;
  35. }
  36.  
  37. !/WH/ {
  38.   for ( i=1; i<=NF; ++i ) {
  39.     rgb[p%3 + 1] = $i;
  40.     if ( (++p)%3 == 0 ) {      
  41.       ++x;
  42.       if ( x % 10 == 0 ) {
  43.         printf("%c[2K Y: %7.3f %%   X: %7.3f %%\r", 27, 100.0*(y-1)/h, 100.0*(x-1)/w) | "cat >&2";
  44.       }
  45.       if ( x > w ) {
  46.         ++y; x = 1
  47.       }
  48. #      ++histogramm[1,rgb[1]+1]; ++histogramm[2,rgb[2]+1]; ++histogramm[3,rgb[3]+1];
  49.       data[x,y] = reduceRGB();
  50.       colorExists[data[x,y]+1]=1;
  51.     }
  52.   }
  53. }
  54.  
  55. function setDir(dest) {
  56.   if ( dir == dest ) return;
  57.   if ( (dest - dir == 1) || (dir == 4 && dest == 1) ) {
  58.     printf("+");
  59.   } else
  60.   if ( (dest - dir == -1) || (dir == 1 && dest == 4) ) {
  61.     printf("-");
  62.   } else
  63.   if ( abs(dest - dir) == 2 ) {
  64.     printf("++");
  65.   } else {
  66.     return;
  67.   }
  68.   dir = dest;
  69. }
  70.  
  71. function moveTo(x,y      ,i,dX,dY) {
  72.   dX = x - penX;
  73.   dY = y - penY;
  74.   if      ( dY > 0 ) { setDir(4); }
  75.   else if ( dY < 0 ) { setDir(2); dY = -dY; }
  76.   if ( dY < 8 ) {
  77.     for ( i=1; i<=dY; ++i ) {
  78.       printf("X");
  79.     }
  80.   } else {
  81.     undo="";
  82.     while ( dY != 0 ) {
  83.       if ( and(dY,1) ) {
  84.         printf("X");
  85.       }
  86.       dY = rshift(dY,1);
  87.       if (dY) {
  88.         printf("*");
  89.         undo = undo "/";
  90.       }
  91.     }
  92.     printf("%s",undo);
  93.   }
  94.  
  95.   if      ( dX > 0 ) { setDir(1); }
  96.   else if ( dX < 0 ) { setDir(3); dX = -dX; }
  97.   if ( dX < 8 ) {
  98.     for ( i=1; i<=dX; ++i ) {
  99.       printf("X");
  100.     }
  101.   } else {
  102.     undo="";
  103.     while ( dX != 0 ) {
  104.       if ( and(dX,1) ) {
  105.         printf("X");
  106.       }
  107.       dX = rshift(dX,1);
  108.       if (dX) {
  109.         printf("*");
  110.         undo = undo "/";
  111.       }
  112.     }
  113.     printf("%s",undo);
  114.   }
  115.  
  116.   penX = x;
  117.   penY = y;
  118.   #setDir((y%2==0)?3:1);
  119.   #setDir(1);
  120. }
  121.  
  122. END {
  123.   printf("%c[2K\r", 27) | "cat >&2";
  124.   print "Start Output ", w, h | "cat >&2";
  125.  
  126. #  print "R", "G", "B" > "histogramm"
  127. #  for ( i = 1; i<=256; ++i ) {
  128. #    if (!histogramm[1,i]) histogramm[1,i]=0;
  129. #    if (!histogramm[2,i]) histogramm[2,i]=0;
  130. #    if (!histogramm[3,i]) histogramm[3,i]=0;
  131. #    print histogramm[1,i], histogramm[2,i], histogramm[3,i] > "histogramm"
  132. #  }
  133.  
  134.   print "";
  135.   for ( c = 1; c <= 512; ++c ) {
  136.     if ( colorExists[c] ) {
  137.       getColor(c-1);
  138.       printf("#%02x%02x%02x[", rgb[1], rgb[2], rgb[3]);
  139.       penX = 1;
  140.       penY = 1;
  141.       dir = 1;      
  142.       for ( y=1; y<=h; ++y) {
  143.          
  144.         for ( x=(y%2==0)?w:1; (y%2==0)?x>=1:x<=w; (y%2==0)?--x:++x) {
  145.           if ( x % 30 == 0 ) {
  146.             printf("%c[2K C: %7.3f %%   Y: %7.3f %%   X: %7.3f %%\r", 27, 100.0*(c-1)/512, 100.0*(y-1)/h, 100.0*((y%2==0)?w-x:x-1)/w) | "cat >&2";
  147.           }
  148.           # For each pixel
  149.           if ( data[x,y] == c-1 ) {
  150.             if ( penX != x || penY != y ) {
  151.               moveTo(x,y);
  152.             }
  153.             printf("F");
  154.                  if ( dir == 1 ) { ++penX; }
  155.             else if ( dir == 2 ) { --penY; }
  156.             else if ( dir == 3 ) { --penX; }
  157.             else if ( dir == 4 ) { ++penY; }
  158.           }          
  159.         }
  160.       }      
  161.       print "]";
  162.     }
  163.   }
  164.   print "";
  165.   printf("%c[2KAll done.\n", 27) | "cat >&2";
  166. }
Advertisement
Add Comment
Please, Sign In to add comment