1 /* Delta.c -- Delta converter
2 2021-02-09 : Igor Pavlov : Public domain */
8 void Delta_Init(Byte *state)
11 for (i = 0; i < DELTA_STATE_SIZE; i++)
16 void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size)
18 Byte temp[DELTA_STATE_SIZE];
36 *data++ = (Byte)(b - temp[i]);
55 Byte *p = data + size - delta;
63 const Byte *lim = data + delta;
64 ptrdiff_t dif = -(ptrdiff_t)delta;
66 if (((ptrdiff_t)size + dif) & 1)
68 --p; *p = (Byte)(*p - p[dif]);
73 --p; *p = (Byte)(*p - p[dif]);
74 --p; *p = (Byte)(*p - p[dif]);
81 --p; *p = (Byte)(*p - temp[--dif]);
89 void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size)
103 *data = (Byte)(*data + state[i++]);
104 while (++data != lim);
106 for (; delta != i; state++, delta--)
114 #define I(n) Byte B(n) = state[n];
115 #define U(n) { B(n) = (Byte)((B(n)) + *data++); data[-1] = (B(n)); }
116 #define F(n) if (data != lim) { U(n) }
121 if ((lim - data) & 1) { U(0) }
122 while (data != lim) { U(0) U(0) }
128 lim -= 1; while (data < lim) { U(0) U(1) }
135 lim -= 2; while (data < lim) { U(0) U(1) U(2) }
142 lim -= 3; while (data < lim) { U(0) U(1) U(2) U(3) }
143 lim += 3; F(0) F(1) F(2)
151 *data = (Byte)(*data + state[i++]);
157 ptrdiff_t dif = -(ptrdiff_t)delta;
159 *data = (Byte)(*data + data[dif]);
160 while (++data != lim);
168 while (++data != lim);