home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 2002 January / STC_CD_01_2002.iso / APP / TRAIL_PG / GEMJING / GEMJ136.LZH / Develop / 16TO8.C next >
Text File  |  2000-05-25  |  1KB  |  68 lines

  1. /* Parameter:
  2. *     start : Anfangsadresse des Samples (vorher)
  3. *     end   : Endadresse des Samples (vorher)
  4. *     unsign: Samplewerte sind unsigned (TRUE) oder signed (FALSE)
  5. *
  6. * Rückgabe:
  7. *     neue Endadresse (Anfangsadresse bleibt gleich)
  8. * Code by Dirk Haun (dirk@haun-online.de)
  9. */
  10.  
  11. unsigned char *to_eight(unsigned char *start,unsigned char *end,int unsign)
  12. {
  13.  int i, imn, imx, ic, *ip;
  14.  unsigned int u, umn, umx, *up;
  15.  long l, lmx;
  16.  
  17.  if(unsign)
  18.  {
  19.   up=(unsigned int*)start;
  20.   umn=65535U;
  21.   umx=0;
  22.   while((unsigned char*)up<end)
  23.   {
  24.    u=*up++;
  25.    if(u<umn) umn=u;
  26.    else if(u>umx) umx=u;
  27.   }
  28.   lmx=umx; lmx-=umn;
  29.   up=(unsigned int*)start;
  30.   while((unsigned char*)up<end)
  31.   {
  32.    u=*up++;
  33.    l=u; l-=umn;
  34.    l*=255L;
  35.    l/=lmx;
  36.    l&=0x00ff;
  37.    *start++=(unsigned char)l;
  38.   }
  39.   end=start;
  40.  }
  41.  else
  42.  {
  43.   ip=(int*)start;
  44.   imn=32767;
  45.   imx=-32767;
  46.   while((unsigned char*)ip<end)
  47.   {
  48.    i=*ip++;
  49.    if(i<imn) imn=i;
  50.    else if(i>imx) imx=i;
  51.   }
  52.   ic=-imn;
  53.   lmx=imx; lmx+=ic;
  54.   ip=(int*)start;
  55.   while((unsigned char*)ip<end)
  56.   {
  57.    i=*ip++;
  58.    l=i+ic;
  59.    l*=255L;
  60.    l/=lmx;
  61.    if(imn<0) l-=128;
  62.    l&=0x00ff;
  63.    *start++=(unsigned char)l;
  64.   }
  65.   end=start;
  66.  }
  67.  return(end);
  68. }