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