• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Init()32 STDMETHODIMP CByteSwap2::Init() { return S_OK; }
33 
STDMETHODIMP_(UInt32)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 
Init()55 STDMETHODIMP CByteSwap4::Init() { return S_OK; }
56 
STDMETHODIMP_(UInt32)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 
REGISTER_FILTER_CREATE(CreateFilter2,CByteSwap2 ())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