// DeltaFilter.cpp #include "StdAfx.h" #include "../../../C/Delta.h" #include "../../Common/MyCom.h" #include "../ICoder.h" #include "../Common/RegisterCodec.h" namespace NCompress { namespace NDelta { struct CDelta { unsigned _delta; Byte _state[DELTA_STATE_SIZE]; CDelta(): _delta(1) {} void DeltaInit() { Delta_Init(_state); } }; #ifndef Z7_EXTRACT_ONLY class CEncoder Z7_final: public ICompressFilter, public ICompressSetCoderProperties, public ICompressWriteCoderProperties, public CMyUnknownImp, CDelta { Z7_IFACES_IMP_UNK_3( ICompressFilter, ICompressSetCoderProperties, ICompressWriteCoderProperties) }; Z7_COM7F_IMF(CEncoder::Init()) { DeltaInit(); return S_OK; } Z7_COM7F_IMF2(UInt32, CEncoder::Filter(Byte *data, UInt32 size)) { Delta_Encode(_state, _delta, data, size); return size; } Z7_COM7F_IMF(CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)) { UInt32 delta = _delta; for (UInt32 i = 0; i < numProps; i++) { const PROPVARIANT &prop = props[i]; const PROPID propID = propIDs[i]; if (propID >= NCoderPropID::kReduceSize) continue; if (prop.vt != VT_UI4) return E_INVALIDARG; switch (propID) { case NCoderPropID::kDefaultProp: delta = (UInt32)prop.ulVal; if (delta < 1 || delta > 256) return E_INVALIDARG; break; case NCoderPropID::kNumThreads: break; case NCoderPropID::kLevel: break; default: return E_INVALIDARG; } } _delta = delta; return S_OK; } Z7_COM7F_IMF(CEncoder::WriteCoderProperties(ISequentialOutStream *outStream)) { const Byte prop = (Byte)(_delta - 1); return outStream->Write(&prop, 1, NULL); } #endif class CDecoder Z7_final: public ICompressFilter, public ICompressSetDecoderProperties2, public CMyUnknownImp, CDelta { Z7_IFACES_IMP_UNK_2( ICompressFilter, ICompressSetDecoderProperties2) }; Z7_COM7F_IMF(CDecoder::Init()) { DeltaInit(); return S_OK; } Z7_COM7F_IMF2(UInt32, CDecoder::Filter(Byte *data, UInt32 size)) { Delta_Decode(_state, _delta, data, size); return size; } Z7_COM7F_IMF(CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size)) { if (size != 1) return E_INVALIDARG; _delta = (unsigned)props[0] + 1; return S_OK; } REGISTER_FILTER_E(Delta, CDecoder(), CEncoder(), 3, "Delta") }}