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