V10/cmd/view2d/Tri/pack.c

/*
  ...dump vector in two-digit base-64 compressed format...
*/

#include <stdio.h>
#include "../view2d.h"
#define INF 1e25

pack(n,f)
  int n;
  float f[];
{
  float *t;
  float fmin = INF, fmax = -INF;
  float floor = -INF;
  for(t=f+n; t!=f; t--){
    if( *t<fmin) fmin= *t;
    if( *t>fmax) fmax= *t;
    }
  printf("%d %e %e\n",n,fmin,fmax);
  v2pack(n,f,fmin,fmax,floor);
}

/* write compressed values */
v2pack(n,data,fmin,fmax,floor)
  int n;
  float *data;
  float fmin, fmax;  /* data range before compression */
  float floor;  /* value to flag out of bounds */
{
  int code, hi, lo, i;
  float frange, slope, t;
  frange = fmax - fmin;
  if(frange==0.) frange=1.;
  slope = 4095 / frange;
  for(i=1; i<=n; i++, data++){
    t = *data;
    if( t <= floor ){
      putchar('~');
      putchar('~');
    }else{
      code = slope*(t-fmin);
         if(code>4095){ code=4095; }else if(code<0){ code = 0; }
      lo = code%64;
      hi = code/64;
      putchar(hi+33);
      putchar(lo+33);
    }
    if(i%38==0) putchar('\n');
  }
  if(n%38!=0) putchar('\n');
}