/*---------------------------------------------------------------------------* Project: Horizon File: cx_Uncompression.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 25056 $ *---------------------------------------------------------------------------*/ #ifndef NN_CX_UNCOMPRESSION_H_ #define NN_CX_UNCOMPRESSION_H_ #include namespace nn { namespace cx { /*! @brief 圧縮タイプを表す列挙型です。 */ enum CompressionType { COMPRESSION_LZ = 0x10, //!< LZ77 圧縮を表します。 COMPRESSION_HUFFMAN = 0x20, //!< ハフマン圧縮を表します。 COMPRESSION_RL = 0x30, //!< ランレングス圧縮を表します。 COMPRESSION_LH = 0x40, //!< LH (LZ77+Huffman) 圧縮を表します。 COMPRESSION_LRC = 0x50, //!< LRC (LZ77+RangeCoder) 圧縮を表します。 COMPRESSION_DIFF = 0x80, //!< 差分フィルタ変換を表します。 COMPRESSION_TYPE_MASK = 0xF0, COMPRESSION_TYPE_EX_MASK = 0xFF }; //---------------------------------------------------------------- // 圧縮データヘッダー // struct CompressionHeader { u8 compType; // 圧縮タイプ u8 compParam; // 圧縮パラメータ u8 padding_[2]; u32 destSize; // 展開サイズ }; /*! @brief 圧縮データの先頭 4 バイトからヘッダ情報を取得します。 @param[in] data 圧縮データの先頭 4 バイトのデータへのポインタ */ CompressionHeader GetCompressionHeader( const void *data ); /*! @brief 圧縮データの先頭 1 バイトから圧縮タイプを取得します。 @param[in] srcp 圧縮データの先頭 1 バイトのデータへのポインタ @return 圧縮タイプを返します。 */ inline CompressionType GetCompressionType( const void *data ) { return (CompressionType)( *(u8*)data & 0xF0 ); } /*! @brief 展開後のデータサイズを取得します。 この関数は cx で扱う全ての圧縮形式のデータに対して使用できます。 @param[in] srcp 圧縮データの先頭 4 バイトのデータへのポインタ @return 展開後のデータサイズを返します。 */ u32 GetUncompressedSize( const void *srcp ); /*! @brief データヘッダから圧縮タイプを判別して、適当な展開処理を実行します。 すべての圧縮種類の展開処理がリンクされますので、 特定の圧縮フォーマット以外使用していない場合には 圧縮種別毎の関数を実行した方がよいかもしれません。 @param[in] srcp 圧縮データアドレス @param[out] destp 展開データアドレス */ void UncompressAny( const void* srcp, void* destp ); /*! @brief ランレングス圧縮データを展開します。 ランレングス圧縮データを展開し、8bit 単位で書き込みます。 圧縮データアドレスは 4Byte 境界に合わせる必要があります。 @param[in] srcp 圧縮データアドレス @param[out] destp 展開データアドレス */ void UncompressRL( const void *srcp, void *destp ); /*! @brief LZ77 圧縮データを展開します。 LZ77 圧縮データを展開し、8bit 単位で書き込みます。 圧縮データアドレスは 4Byte 境界に合わせる必要があります。 @param[in] srcp 圧縮データアドレス @param[out] destp 展開データアドレス */ void UncompressLZ( const void *srcp, void *destp ); /*! @brief ハフマン圧縮データを展開します。 ハフマン圧縮データを展開し、8bit 単位で書き込みます。 圧縮データアドレスは 4Byte 境界に合わせる必要があります。 展開データアドレスは 4Byte 境界に合わせ、さらに 4Byte の倍数分だけ 準備する必要があります。 @param[in] srcp 圧縮データアドレス @param[out] destp 展開データアドレス */ void UncompressHuffman( const void *srcp, void *destp ); const int UNCOMPRESS_LH_WORK_SIZE = (1 << 11) + (1 << 7); /*! @brief LZ-ハフマン複合圧縮データを展開します。 @param[in] srcp 圧縮データアドレス @param[out] destp 展開データアドレス @param[in] work 作業領域(nn::cx::UNCOMPRESS_LH_WORK_SIZE (= 2176) バイト必要です) */ void UncompressLH( const u8* srcp, u8* dstp, void* work ); const int UNCOMPRESS_LRC_WORK_SIZE = ((1 << 12) + (1 << 9)) * 8; /*! @brief LZ-RangeCoder 複合圧縮データを展開します。 @param[in] srcp 圧縮データアドレス @param[out] destp 展開データアドレス @param[in] work 作業領域(nn::cx::UNCOMPRESS_LRC_WORK_SIZE (= 36864) バイト必要です) */ void UncompressLRC( const u8* srcp, u8* dstp, void* work ); /*! @brief 差分フィルタ変換データを復元します。 差分フィルタ変換データを復元し、8bit 単位で書き込みます。 圧縮データアドレスは 4Byte 境界に合わせる必要があります。 @param[in] srcp 圧縮データアドレス @param[out] destp 展開データアドレス */ void UnfilterDiff( const void *srcp, void *destp ); } // namespace cx } // namespace nn /* NN_CX_UNCOMPRESSION_H_ */ #endif