1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync/* Delta.c -- Delta converter 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync2009-05-26 : Igor Pavlov : Public domain */ 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "Delta.h" 5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 6baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid Delta_Init(Byte *state) 7baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync unsigned i; 9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (i = 0; i < DELTA_STATE_SIZE; i++) 10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync state[i] = 0; 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 13baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic void MyMemCpy(Byte *dest, const Byte *src, unsigned size) 14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync unsigned i; 16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (i = 0; i < size; i++) 17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync dest[i] = src[i]; 18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 20baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size) 21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte buf[DELTA_STATE_SIZE]; 23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync unsigned j = 0; 24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MyMemCpy(buf, state, delta); 25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync SizeT i; 27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (i = 0; i < size;) 28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (j = 0; j < delta && i < size; i++, j++) 30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte b = data[i]; 32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync data[i] = (Byte)(b - buf[j]); 33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync buf[j] = b; 34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (j == delta) 38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync j = 0; 39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MyMemCpy(state, buf + j, delta - j); 40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MyMemCpy(state + delta - j, buf, j); 41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 43baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size) 44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync Byte buf[DELTA_STATE_SIZE]; 46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync unsigned j = 0; 47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MyMemCpy(buf, state, delta); 48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync SizeT i; 50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (i = 0; i < size;) 51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (j = 0; j < delta && i < size; i++, j++) 53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync buf[j] = data[i] = (Byte)(buf[j] + data[i]); 55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (j == delta) 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync j = 0; 60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MyMemCpy(state, buf + j, delta - j); 61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync MyMemCpy(state + delta - j, buf, j); 62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 63