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