view pwplib/lossy.c @ 64:c272f66c5eb8

Add pwplib_end() to public header.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 06 Aug 2011 10:41:08 +0300
parents acb5694e93d9
children
line wrap: on
line source

/*
 *  PWPlib: Lossy filtering
 *
 *  Need to improve this stuff to give visible results.
 *
 */

#ifdef BELLWHISTLED

#include "config.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "pwplib.h"

void conv_losestuff_old(u8*d,int lgtnew,int flags) /* flags&1 == fillgaps */
{
   static int lgt=0;
   static u8 *prev=NULL;

   if(lgt!=lgtnew)
   {
      if(prev!=NULL)
         free(prev);

      lgt=lgtnew;

      if(lgt)prev=malloc(lgt*sizeof(u8)*2);

      {int i=0;
       for(;i<lgt;i++)
       {
          prev[i*2+0]=d[i];
          prev[i*2+1]=4;
       }
      }
   }

   {u8*s=prev,*dd=d;
    int i=lgt-1;
    for(;i>0;i--)
    {
       if(*s!=*d)
       {
          int cnt=0;
          int smallgap=0;

          while((*s!=*d) || (smallgap>0))
          {
             if(*s==*d)
             {
                smallgap--;
             }
              else
             {
                smallgap=2;
             }

             cnt++;
             s+=2;
             d++;
             i--;
             if(i<=0)break;
          }
          
          /*fprintf(stderr,"%d\n",cnt);*/

          switch((int)cnt)
          {
             case(0):
             case(1):
                if(s[-1]<2)
                   d[-1]=s[-2];
                break;

             case(2):
                if(s[-1]+s[-3]<4)
                {
                   d[-1]=s[-2];
                   d[-2]=s[-4];
                }
                break;
             case(3):
                if(s[-1]+s[-3]+s[-5]<5)
                {
                   d[-1]=s[-2];
                   d[-2]=s[-4];
                   d[-3]=s[-6];
                }

             default:
                if(flags&1)
                {int j=(cnt-2);
                 u8*dd=d-cnt,*ss=s-cnt*2;

                for(;j;j--)
                {
                   if(dd[-1]==ss[-2] && dd[-3]==ss[-6] &&
                      dd[-2]!=ss[-4] && ss[-3]<(ss[-1]+ss[-5]+1))
                      dd[-2]=ss[-4];
                      ss[-3]++;
                   dd++;
                   ss+=2;
                }
                }break;
          }
       }
        else
       {
          if(s[1]<8)s[1]++;
          s+=2;
          d++;
       }
    }
   
   {int i=lgt;s=prev;
    for(;i>0;i--)
    {
       if(*s!=*dd) s[1]=0;
       s[0]=*dd++;
       s+=2;
    }
   }
   }
}

void conv_losestuff(u8*d,int lgtnew,int flags)
{
   static int lgt=0;
   static u8 *prev=NULL;

   /* +0:    currently viewed stuff
      +lgt:  previous frame
      +2lgt: new frame
      +3lgt: dynamic level 0..7  -- later
   */

   if(lgt!=lgtnew)
   {
      if(prev!=NULL)
         free(prev);

      lgt=lgtnew;

      if(lgt)prev=malloc(lgt*sizeof(u8)*4);

      memcpy(prev+0*lgt,d,lgt);
      memcpy(prev+2*lgt,d,lgt);
   }

   memcpy(prev+1*lgt,prev+2*lgt,lgt);
   memcpy(prev+2*lgt,d,lgt);

   /* */

   {int i=0,justwrote=-1;
    for(;i<lgt;i++)
    {
       u8*a=&prev[i],*b=&prev[i+lgt],*c=&prev[i+lgt*2];
       
       if(*a!=*b)
       {
          if(justwrote==*b)
          {
             *a=*b;
          }
           else
          {
             if(justwrote>=0 && i) a[-1]=*c;
             *a=*c;
          }
          justwrote=*d=*a;
       }
       else justwrote=-1;
       d++;
    }
   }
}

#endif