1 // DeltaFilter.cpp
2
3 #include "StdAfx.h"
4
5 #include "../../../C/Delta.h"
6
7 #include "../../Common/MyCom.h"
8
9 #include "../ICoder.h"
10
11 #include "../Common/RegisterCodec.h"
12
13 namespace NCompress {
14 namespace NDelta {
15
16 struct CDelta
17 {
18 unsigned _delta;
19 Byte _state[DELTA_STATE_SIZE];
20
CDeltaNCompress::NDelta::CDelta21 CDelta(): _delta(1) {}
DeltaInitNCompress::NDelta::CDelta22 void DeltaInit() { Delta_Init(_state); }
23 };
24
25
26 #ifndef EXTRACT_ONLY
27
28 class CEncoder:
29 public ICompressFilter,
30 public ICompressSetCoderProperties,
31 public ICompressWriteCoderProperties,
32 CDelta,
33 public CMyUnknownImp
34 {
35 public:
36 MY_UNKNOWN_IMP3(ICompressFilter, ICompressSetCoderProperties, ICompressWriteCoderProperties)
37 INTERFACE_ICompressFilter(;)
38 STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps);
39 STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream);
40 };
41
Init()42 STDMETHODIMP CEncoder::Init()
43 {
44 DeltaInit();
45 return S_OK;
46 }
47
STDMETHODIMP_(UInt32)48 STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size)
49 {
50 Delta_Encode(_state, _delta, data, size);
51 return size;
52 }
53
SetCoderProperties(const PROPID * propIDs,const PROPVARIANT * props,UInt32 numProps)54 STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)
55 {
56 UInt32 delta = _delta;
57 for (UInt32 i = 0; i < numProps; i++)
58 {
59 const PROPVARIANT &prop = props[i];
60 PROPID propID = propIDs[i];
61 if (propID >= NCoderPropID::kReduceSize)
62 continue;
63 if (prop.vt != VT_UI4)
64 return E_INVALIDARG;
65 switch (propID)
66 {
67 case NCoderPropID::kDefaultProp:
68 delta = (UInt32)prop.ulVal;
69 if (delta < 1 || delta > 256)
70 return E_INVALIDARG;
71 break;
72 case NCoderPropID::kNumThreads: break;
73 case NCoderPropID::kLevel: break;
74 default: return E_INVALIDARG;
75 }
76 }
77 _delta = delta;
78 return S_OK;
79 }
80
WriteCoderProperties(ISequentialOutStream * outStream)81 STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)
82 {
83 Byte prop = (Byte)(_delta - 1);
84 return outStream->Write(&prop, 1, NULL);
85 }
86
87 #endif
88
89
90 class CDecoder:
91 public ICompressFilter,
92 public ICompressSetDecoderProperties2,
93 CDelta,
94 public CMyUnknownImp
95 {
96 public:
97 MY_UNKNOWN_IMP2(ICompressFilter, ICompressSetDecoderProperties2)
98 INTERFACE_ICompressFilter(;)
99 STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size);
100 };
101
Init()102 STDMETHODIMP CDecoder::Init()
103 {
104 DeltaInit();
105 return S_OK;
106 }
107
STDMETHODIMP_(UInt32)108 STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size)
109 {
110 Delta_Decode(_state, _delta, data, size);
111 return size;
112 }
113
SetDecoderProperties2(const Byte * props,UInt32 size)114 STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size)
115 {
116 if (size != 1)
117 return E_INVALIDARG;
118 _delta = (unsigned)props[0] + 1;
119 return S_OK;
120 }
121
122
123 REGISTER_FILTER_E(Delta,
124 CDecoder(),
125 CEncoder(),
126 3, "Delta")
127
128 }}
129