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