blob: 35b77ba75cdbe8e9988755fae0b974cc09350b97 [file] [log] [blame]
// 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")
}}