| 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 | } |