public static UnsafeBuffer Decode(VoidPtr addr, uint length, WiiColorComponentType componentType) { int bytesPerVal = 0; ColorCodecConverter dec; switch (componentType) { case WiiColorComponentType.RGB565: dec = Color_wRGB565_RGBA; bytesPerVal = 2; break; case WiiColorComponentType.RGB8: dec = Color_RGB_RGBA; bytesPerVal = 3; break; case WiiColorComponentType.RGBA4: dec = Color_wRGBA4_RGBA; bytesPerVal = 3; break; case WiiColorComponentType.RGBA6: dec = Color_wRGBA6_RGBA; bytesPerVal = 2; break; case WiiColorComponentType.RGBA8: dec = Color_RGBA_RGBA; bytesPerVal = 4; break; case WiiColorComponentType.RGBX8: dec = Color_RGBX_RGBA; bytesPerVal = 4; break; default: return(null); } int count = (int)(length / bytesPerVal); UnsafeBuffer buffer = new UnsafeBuffer(count * 4); byte * pIn = (byte *)addr; byte * pOut = (byte *)buffer.Address; while (count-- > 0) { dec(ref pIn, ref pOut); } return(buffer); }
private void Evaluate() { //Colors will almost always need remapping _remapData = new Remapper(); _remapData.Remap(new MemoryList <RGBAPixel>(_pData, _srcCount), null); //Don't bother sorting int[] imp = _remapData._impTable; int impLen = imp.Length; _dstCount = impLen; //Do we have alpha? int i = 0; while (i < _dstCount && _pData[imp[i]].A == 255) { i++; } _hasAlpha = i < _srcCount; //Determine format if (_hasAlpha) { _outType = WiiColorComponentType.RGBA8; } else { _outType = WiiColorComponentType.RGB8; } switch (_outType) { case WiiColorComponentType.RGB565: case WiiColorComponentType.RGBA4: _dstStride = 2; break; case WiiColorComponentType.RGB8: case WiiColorComponentType.RGBA6: _dstStride = 3; break; case WiiColorComponentType.RGBA8: case WiiColorComponentType.RGBX8: _dstStride = 4; break; } _dataLen = _dstStride * _dstCount; GetEncoder(); }
private void Evaluate() { //Colors will almost always need remapping _remapData = new Remapper(); _remapData.Remap<RGBAPixel>(new MemoryList<RGBAPixel>(_pData, _srcCount), null); //Don't bother sorting int[] imp = _remapData._impTable; int impLen = imp.Length; _dstCount = impLen; //Do we have alpha? int i = 0; while ((i < _dstCount) && (_pData[imp[i]].A == 255)) i++; _hasAlpha = i < _srcCount; //Determine format if (_hasAlpha) _outType = WiiColorComponentType.RGBA8; else _outType = WiiColorComponentType.RGB8; switch (_outType) { case WiiColorComponentType.RGB565: case WiiColorComponentType.RGBA4: _dstStride = 2; break; case WiiColorComponentType.RGB8: case WiiColorComponentType.RGBA6: _dstStride = 3; break; case WiiColorComponentType.RGBA8: case WiiColorComponentType.RGBX8: _dstStride = 4; break; } _dataLen = _dstStride * _dstCount; GetEncoder(); }