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: 25056 $
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] srcp 圧縮データの先頭 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 LZ77 圧縮データを展開し、8bit 単位で書き込みます。
110 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
111
112 @param[in] srcp 圧縮データアドレス
113 @param[out] destp 展開データアドレス
114 */
115 void UncompressLZ( const void *srcp, void *destp );
116
117
118 /*!
119 @brief ハフマン圧縮データを展開します。
120
121 ハフマン圧縮データを展開し、8bit 単位で書き込みます。
122 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
123 展開データアドレスは 4Byte 境界に合わせ、さらに 4Byte の倍数分だけ
124 準備する必要があります。
125
126 @param[in] srcp 圧縮データアドレス
127 @param[out] destp 展開データアドレス
128 */
129 void UncompressHuffman( const void *srcp, void *destp );
130
131
132 const int UNCOMPRESS_LH_WORK_SIZE = (1 << 11) + (1 << 7);
133
134 /*!
135 @brief LZ-ハフマン複合圧縮データを展開します。
136 @param[in] srcp 圧縮データアドレス
137 @param[out] destp 展開データアドレス
138 @param[in] work 作業領域(nn::cx::UNCOMPRESS_LH_WORK_SIZE (= 2176) バイト必要です)
139 */
140 void UncompressLH( const u8* srcp, u8* dstp, void* work );
141
142
143 const int UNCOMPRESS_LRC_WORK_SIZE = ((1 << 12) + (1 << 9)) * 8;
144
145 /*!
146 @brief LZ-RangeCoder 複合圧縮データを展開します。
147 @param[in] srcp 圧縮データアドレス
148 @param[out] destp 展開データアドレス
149 @param[in] work 作業領域(nn::cx::UNCOMPRESS_LRC_WORK_SIZE (= 36864) バイト必要です)
150 */
151 void UncompressLRC( const u8* srcp, u8* dstp, void* work );
152
153
154 /*!
155 @brief 差分フィルタ変換データを復元します。
156
157 差分フィルタ変換データを復元し、8bit 単位で書き込みます。
158 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
159
160 @param[in] srcp 圧縮データアドレス
161 @param[out] destp 展開データアドレス
162 */
163 void UnfilterDiff( const void *srcp, void *destp );
164
165 } // namespace cx
166 } // namespace nn
167
168 /* NN_CX_UNCOMPRESSION_H_ */
169 #endif
170