1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     cx_Uncompression.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 27173 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_CX_UNCOMPRESSION_H_
17 #define NN_CX_UNCOMPRESSION_H_
18 
19 #include <nn/types.h>
20 
21 
22 namespace nn {
23 namespace cx {
24 
25 /*!
26     @brief      圧縮タイプを表す列挙型です。
27  */
28 enum CompressionType
29 {
30     COMPRESSION_LZ           = 0x10,     //!< LZ77 圧縮を表します。
31     COMPRESSION_HUFFMAN      = 0x20,     //!< ハフマン圧縮を表します。
32     COMPRESSION_RL           = 0x30,     //!< ランレングス圧縮を表します。
33     COMPRESSION_LH           = 0x40,     //!< LH (LZ77+Huffman) 圧縮を表します。
34     COMPRESSION_LRC          = 0x50,     //!< LRC (LZ77+RangeCoder) 圧縮を表します。
35     COMPRESSION_DIFF         = 0x80,     //!< 差分フィルタ変換を表します。
36 
37     COMPRESSION_TYPE_MASK    = 0xF0,
38     COMPRESSION_TYPE_EX_MASK = 0xFF
39 };
40 
41 
42 //----------------------------------------------------------------
43 // 圧縮データヘッダー
44 //
45 struct CompressionHeader
46 {
47     u8  compType;   // 圧縮タイプ
48     u8  compParam;  // 圧縮パラメータ
49     u8  padding_[2];
50     u32 destSize;   // 展開サイズ
51 };
52 
53 
54 /*!
55     @brief      圧縮データの先頭 4 バイトからヘッダ情報を取得します。
56     @param[in]  data        圧縮データの先頭 4 バイトのデータへのポインタ
57  */
58 CompressionHeader GetCompressionHeader( const void *data );
59 
60 /*!
61     @brief      圧縮データの先頭 1 バイトから圧縮タイプを取得します。
62     @param[in]  data        圧縮データの先頭 1 バイトのデータへのポインタ
63     @return     圧縮タイプを返します。
64  */
GetCompressionType(const void * data)65 inline CompressionType   GetCompressionType( const void *data )
66 {
67     return (CompressionType)( *(u8*)data & 0xF0 );
68 }
69 
70 
71 /*!
72     @brief      展開後のデータサイズを取得します。
73 
74                 この関数は cx で扱う全ての圧縮形式のデータに対して使用できます。
75 
76     @param[in]  srcp        圧縮データの先頭 4 バイトのデータへのポインタ
77     @return     展開後のデータサイズを返します。
78  */
79 u32 GetUncompressedSize( const void *srcp );
80 
81 /*!
82     @brief      データヘッダから圧縮タイプを判別して、適当な展開処理を実行します。
83 
84                 すべての圧縮種類の展開処理がリンクされますので、
85                 特定の圧縮フォーマット以外使用していない場合には
86                 圧縮種別毎の関数を実行した方がよいかもしれません。
87 
88     @param[in]  srcp        圧縮データアドレス
89     @param[out] destp       展開データアドレス
90  */
91 void UncompressAny( const void* srcp, void* destp );
92 
93 
94 /*!
95     @brief      ランレングス圧縮データを展開します。
96 
97                 ランレングス圧縮データを展開し、8bit 単位で書き込みます。
98                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
99 
100     @param[in]  srcp        圧縮データアドレス
101     @param[out] destp       展開データアドレス
102  */
103 void UncompressRL( const void *srcp, void *destp );
104 
105 
106 /*!
107     @brief      LZ77 圧縮データを展開します。
108 
109                 本 API は LZ 圧縮(旧互換)、LZ 拡張圧縮の両方に対応しています。
110 
111                 LZ77 圧縮データを展開し、8bit 単位で書き込みます。
112                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
113 
114     @param[in]  srcp        圧縮データアドレス
115     @param[out] destp       展開データアドレス
116  */
117 void UncompressLZ( const void *srcp, void *destp );
118 
119 
120 /*!
121     @brief      ハフマン圧縮データを展開します。
122 
123                 ハフマン圧縮データを展開し、8bit 単位で書き込みます。
124                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
125                 展開データアドレスは 4Byte 境界に合わせ、さらに 4Byte の倍数分だけ
126                 準備する必要があります。
127 
128     @param[in]  srcp        圧縮データアドレス
129     @param[out] destp       展開データアドレス
130  */
131 void UncompressHuffman( const void *srcp, void *destp );
132 
133 
134 const int       UNCOMPRESS_LH_WORK_SIZE     = (1 << 11) + (1 << 7);
135 
136 /*!
137     @brief      LZ-ハフマン複合圧縮データを展開します。
138     @param[in]  srcp        圧縮データアドレス
139     @param[out] destp       展開データアドレス
140     @param[in]  work        作業領域(nn::cx::UNCOMPRESS_LH_WORK_SIZE (= 2176) バイト必要です)
141  */
142 void UncompressLH( const u8* srcp, u8* destp, void* work );
143 
144 
145 const int       UNCOMPRESS_LRC_WORK_SIZE    = ((1 << 12) + (1 << 9)) * 8;
146 
147 /*!
148     @brief      LZ-RangeCoder 複合圧縮データを展開します。
149     @param[in]  srcp        圧縮データアドレス
150     @param[out] destp       展開データアドレス
151     @param[in]  work        作業領域(nn::cx::UNCOMPRESS_LRC_WORK_SIZE (= 36864) バイト必要です)
152  */
153 void UncompressLRC( const u8* srcp, u8* destp, void* work );
154 
155 
156 /*!
157     @brief      差分フィルタ変換データを復元します。
158 
159                 差分フィルタ変換データを復元し、8bit 単位で書き込みます。
160                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
161 
162     @param[in]  srcp        圧縮データアドレス
163     @param[out] destp       展開データアドレス
164  */
165 void UnfilterDiff( const void *srcp, void *destp );
166 
167 }   // namespace cx
168 }   // namespace nn
169 
170 /* NN_CX_UNCOMPRESSION_H_ */
171 #endif
172