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