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