Home | History | Annotate | Download | only in Compress
      1 // ByteSwap.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "../../Common/MyCom.h"
      6 
      7 #include "../ICoder.h"
      8 
      9 #include "../Common/RegisterCodec.h"
     10 
     11 namespace NCompress {
     12 namespace NByteSwap {
     13 
     14 class CByteSwap2:
     15   public ICompressFilter,
     16   public CMyUnknownImp
     17 {
     18 public:
     19   MY_UNKNOWN_IMP1(ICompressFilter);
     20   INTERFACE_ICompressFilter(;)
     21 };
     22 
     23 class CByteSwap4:
     24   public ICompressFilter,
     25   public CMyUnknownImp
     26 {
     27 public:
     28   MY_UNKNOWN_IMP1(ICompressFilter);
     29   INTERFACE_ICompressFilter(;)
     30 };
     31 
     32 STDMETHODIMP CByteSwap2::Init() { return S_OK; }
     33 
     34 STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size)
     35 {
     36   const UInt32 kStep = 2;
     37   if (size < kStep)
     38     return 0;
     39   size &= ~(kStep - 1);
     40 
     41   const Byte *end = data + (size_t)size;
     42 
     43   do
     44   {
     45     Byte b0 = data[0];
     46     data[0] = data[1];
     47     data[1] = b0;
     48     data += kStep;
     49   }
     50   while (data != end);
     51 
     52   return size;
     53 }
     54 
     55 STDMETHODIMP CByteSwap4::Init() { return S_OK; }
     56 
     57 STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size)
     58 {
     59   const UInt32 kStep = 4;
     60   if (size < kStep)
     61     return 0;
     62   size &= ~(kStep - 1);
     63 
     64   const Byte *end = data + (size_t)size;
     65 
     66   do
     67   {
     68     Byte b0 = data[0];
     69     Byte b1 = data[1];
     70     data[0] = data[3];
     71     data[1] = data[2];
     72     data[2] = b1;
     73     data[3] = b0;
     74     data += kStep;
     75   }
     76   while (data != end);
     77 
     78   return size;
     79 }
     80 
     81 REGISTER_FILTER_CREATE(CreateFilter2, CByteSwap2())
     82 REGISTER_FILTER_CREATE(CreateFilter4, CByteSwap4())
     83 
     84 REGISTER_CODECS_VAR
     85 {
     86   REGISTER_FILTER_ITEM(CreateFilter2, CreateFilter2, 0x20302, "Swap2"),
     87   REGISTER_FILTER_ITEM(CreateFilter4, CreateFilter4, 0x20304, "Swap4")
     88 };
     89 
     90 REGISTER_CODECS(ByteSwap)
     91 
     92 }}
     93