1370b324cSopenharmony_ci// ByteSwap.cpp 2370b324cSopenharmony_ci 3370b324cSopenharmony_ci#include "StdAfx.h" 4370b324cSopenharmony_ci 5370b324cSopenharmony_ci#include "../../../C/SwapBytes.h" 6370b324cSopenharmony_ci 7370b324cSopenharmony_ci#include "../../Common/MyCom.h" 8370b324cSopenharmony_ci 9370b324cSopenharmony_ci#include "../ICoder.h" 10370b324cSopenharmony_ci 11370b324cSopenharmony_ci#include "../Common/RegisterCodec.h" 12370b324cSopenharmony_ci 13370b324cSopenharmony_cinamespace NCompress { 14370b324cSopenharmony_cinamespace NByteSwap { 15370b324cSopenharmony_ci 16370b324cSopenharmony_ciZ7_CLASS_IMP_COM_1(CByteSwap2, ICompressFilter) }; 17370b324cSopenharmony_ciZ7_CLASS_IMP_COM_1(CByteSwap4, ICompressFilter) }; 18370b324cSopenharmony_ci 19370b324cSopenharmony_ciZ7_COM7F_IMF(CByteSwap2::Init()) { return S_OK; } 20370b324cSopenharmony_ci 21370b324cSopenharmony_ciZ7_COM7F_IMF2(UInt32, CByteSwap2::Filter(Byte *data, UInt32 size)) 22370b324cSopenharmony_ci{ 23370b324cSopenharmony_ci const UInt32 kMask = 2 - 1; 24370b324cSopenharmony_ci size &= ~kMask; 25370b324cSopenharmony_ci /* 26370b324cSopenharmony_ci if ((unsigned)(ptrdiff_t)data & kMask) 27370b324cSopenharmony_ci { 28370b324cSopenharmony_ci if (size == 0) 29370b324cSopenharmony_ci return 0; 30370b324cSopenharmony_ci const Byte *end = data + (size_t)size; 31370b324cSopenharmony_ci do 32370b324cSopenharmony_ci { 33370b324cSopenharmony_ci const Byte b0 = data[0]; 34370b324cSopenharmony_ci data[0] = data[1]; 35370b324cSopenharmony_ci data[1] = b0; 36370b324cSopenharmony_ci data += kStep; 37370b324cSopenharmony_ci } 38370b324cSopenharmony_ci while (data != end); 39370b324cSopenharmony_ci } 40370b324cSopenharmony_ci else 41370b324cSopenharmony_ci */ 42370b324cSopenharmony_ci z7_SwapBytes2((UInt16 *)(void *)data, size >> 1); 43370b324cSopenharmony_ci return size; 44370b324cSopenharmony_ci} 45370b324cSopenharmony_ci 46370b324cSopenharmony_ci 47370b324cSopenharmony_ciZ7_COM7F_IMF(CByteSwap4::Init()) { return S_OK; } 48370b324cSopenharmony_ci 49370b324cSopenharmony_ciZ7_COM7F_IMF2(UInt32, CByteSwap4::Filter(Byte *data, UInt32 size)) 50370b324cSopenharmony_ci{ 51370b324cSopenharmony_ci const UInt32 kMask = 4 - 1; 52370b324cSopenharmony_ci size &= ~kMask; 53370b324cSopenharmony_ci /* 54370b324cSopenharmony_ci if ((unsigned)(ptrdiff_t)data & kMask) 55370b324cSopenharmony_ci { 56370b324cSopenharmony_ci if (size == 0) 57370b324cSopenharmony_ci return 0; 58370b324cSopenharmony_ci const Byte *end = data + (size_t)size; 59370b324cSopenharmony_ci do 60370b324cSopenharmony_ci { 61370b324cSopenharmony_ci const Byte b0 = data[0]; 62370b324cSopenharmony_ci const Byte b1 = data[1]; 63370b324cSopenharmony_ci data[0] = data[3]; 64370b324cSopenharmony_ci data[1] = data[2]; 65370b324cSopenharmony_ci data[2] = b1; 66370b324cSopenharmony_ci data[3] = b0; 67370b324cSopenharmony_ci data += kStep; 68370b324cSopenharmony_ci } 69370b324cSopenharmony_ci while (data != end); 70370b324cSopenharmony_ci } 71370b324cSopenharmony_ci else 72370b324cSopenharmony_ci */ 73370b324cSopenharmony_ci z7_SwapBytes4((UInt32 *)(void *)data, size >> 2); 74370b324cSopenharmony_ci return size; 75370b324cSopenharmony_ci} 76370b324cSopenharmony_ci 77370b324cSopenharmony_cistatic struct C_SwapBytesPrepare { C_SwapBytesPrepare() { z7_SwapBytesPrepare(); } } g_SwapBytesPrepare; 78370b324cSopenharmony_ci 79370b324cSopenharmony_ci 80370b324cSopenharmony_ciREGISTER_FILTER_CREATE(CreateFilter2, CByteSwap2()) 81370b324cSopenharmony_ciREGISTER_FILTER_CREATE(CreateFilter4, CByteSwap4()) 82370b324cSopenharmony_ci 83370b324cSopenharmony_ciREGISTER_CODECS_VAR 84370b324cSopenharmony_ci{ 85370b324cSopenharmony_ci REGISTER_FILTER_ITEM(CreateFilter2, CreateFilter2, 0x20302, "Swap2"), 86370b324cSopenharmony_ci REGISTER_FILTER_ITEM(CreateFilter4, CreateFilter4, 0x20304, "Swap4"), 87370b324cSopenharmony_ci}; 88370b324cSopenharmony_ci 89370b324cSopenharmony_ciREGISTER_CODECS(ByteSwap) 90370b324cSopenharmony_ci 91370b324cSopenharmony_ci}} 92