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