65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /* Delta.c -- Delta converter
 | ||
|  | 2009-05-26 : Igor Pavlov : Public domain */ | ||
|  | 
 | ||
|  | #include "Precomp.h"
 | ||
|  | 
 | ||
|  | #include "Delta.h"
 | ||
|  | 
 | ||
|  | void Delta_Init(Byte *state) | ||
|  | { | ||
|  |   unsigned i; | ||
|  |   for (i = 0; i < DELTA_STATE_SIZE; i++) | ||
|  |     state[i] = 0; | ||
|  | } | ||
|  | 
 | ||
|  | static void MyMemCpy(Byte *dest, const Byte *src, unsigned size) | ||
|  | { | ||
|  |   unsigned i; | ||
|  |   for (i = 0; i < size; i++) | ||
|  |     dest[i] = src[i]; | ||
|  | } | ||
|  | 
 | ||
|  | void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size) | ||
|  | { | ||
|  |   Byte buf[DELTA_STATE_SIZE]; | ||
|  |   unsigned j = 0; | ||
|  |   MyMemCpy(buf, state, delta); | ||
|  |   { | ||
|  |     SizeT i; | ||
|  |     for (i = 0; i < size;) | ||
|  |     { | ||
|  |       for (j = 0; j < delta && i < size; i++, j++) | ||
|  |       { | ||
|  |         Byte b = data[i]; | ||
|  |         data[i] = (Byte)(b - buf[j]); | ||
|  |         buf[j] = b; | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   if (j == delta) | ||
|  |     j = 0; | ||
|  |   MyMemCpy(state, buf + j, delta - j); | ||
|  |   MyMemCpy(state + delta - j, buf, j); | ||
|  | } | ||
|  | 
 | ||
|  | void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size) | ||
|  | { | ||
|  |   Byte buf[DELTA_STATE_SIZE]; | ||
|  |   unsigned j = 0; | ||
|  |   MyMemCpy(buf, state, delta); | ||
|  |   { | ||
|  |     SizeT i; | ||
|  |     for (i = 0; i < size;) | ||
|  |     { | ||
|  |       for (j = 0; j < delta && i < size; i++, j++) | ||
|  |       { | ||
|  |         buf[j] = data[i] = (Byte)(buf[j] + data[i]); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  |   if (j == delta) | ||
|  |     j = 0; | ||
|  |   MyMemCpy(state, buf + j, delta - j); | ||
|  |   MyMemCpy(state + delta - j, buf, j); | ||
|  | } |