/* Delta.c -- Delta converter
2009-05-26 : Igor Pavlov : Public domain */

#include "Precomp.h"

#include "Delta.h"

void Delta_Init(Byte* state)
{
    unsigned i;
    for (i = 0; i < DELTA_STATE_SIZE; i++)
        state[i] = 0;
}

static void MyMemCpy(Byte* dest, const Byte* src, unsigned size)
{
    unsigned i;
    for (i = 0; i < size; i++)
        dest[i] = src[i];
}

void Delta_Encode(Byte* state, unsigned delta, Byte* data, SizeT size)
{
    Byte buf[DELTA_STATE_SIZE];
    unsigned j = 0;
    MyMemCpy(buf, state, delta);
    {
        SizeT i;
        for (i = 0; i < size;)
        {
            for (j = 0; j < delta && i < size; i++, j++)
            {
                Byte b = data[i];
                data[i] = (Byte)(b - buf[j]);
                buf[j] = b;
            }
        }
    }
    if (j == delta)
        j = 0;
    MyMemCpy(state, buf + j, delta - j);
    MyMemCpy(state + delta - j, buf, j);
}

void Delta_Decode(Byte* state, unsigned delta, Byte* data, SizeT size)
{
    Byte buf[DELTA_STATE_SIZE];
    unsigned j = 0;
    MyMemCpy(buf, state, delta);
    {
        SizeT i;
        for (i = 0; i < size;)
        {
            for (j = 0; j < delta && i < size; i++, j++)
            {
                buf[j] = data[i] = (Byte)(buf[j] + data[i]);
            }
        }
    }
    if (j == delta)
        j = 0;
    MyMemCpy(state, buf + j, delta - j);
    MyMemCpy(state + delta - j, buf, j);
}
