1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     cx_Compression.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_COMPRESSION_H_
17 #define NN_CX_COMPRESSION_H_
18 
19 #include <nn/types.h>
20 
21 namespace nn {
22 namespace cx {
23 
24 const int   LZ_COMPRESS_WORK_SIZE   = (4096 + 256 + 256) * sizeof(s16);
25 
26 u32 CompressLZImpl(const u8 *srcp, u32 size, u8 *dstp, void *work, bool exFormat);
27 
28 /*!
29     @brief      LZ77 圧縮を行います。
30     @param[in]  srcp        圧縮元データへのポインタ
31     @param[in]  size        圧縮元データサイズ
32     @param[out] dstp        圧縮先データへのポインタ(圧縮元データよりも大きいサイズのバッファが必要です)
33     @param[in]  work        圧縮用一時バッファ(nn::cx::LZ_COMPRESS_WORK_SIZE バイトの領域が必要です)
34     @return     圧縮後のデータサイズを返します。
35                 圧縮後のデータが圧縮前よりも大きくなる場合には圧縮を中断し 0 を返します。
36  */
CompressLZ(const u8 * srcp,u32 size,u8 * dstp,void * work)37 inline u32 CompressLZ(const u8 *srcp, u32 size, u8 *dstp, void *work)
38 {
39     return CompressLZImpl( srcp, size, dstp, work, false );
40 }
CompressLZEx(const u8 * srcp,u32 size,u8 * dstp,void * work)41 inline u32 CompressLZEx(const u8 *srcp, u32 size, u8 *dstp, void* work)
42 {
43     return CompressLZImpl( srcp, size, dstp, work, true );
44 }
45 
46 /*!
47     @brief      ランレングス圧縮を行います。
48     @param[in]  srcp        圧縮元データへのポインタ
49     @param[in]  size        圧縮元データサイズ
50     @param[out] dstp        圧縮先データへのポインタ(圧縮元データよりも大きいサイズのバッファが必要です)
51     @return     圧縮後のデータサイズを返します。
52                 圧縮後のデータが圧縮前よりも大きくなる場合には圧縮を中断し 0 を返します。
53  */
54 u32 CompressRL( const u8 *srcp, u32 size, u8 *dstp );
55 
56 const int   HUFFMAN_COMPRESS_WORK_SIZE  = 12288 + 512 + 1536;
57 
58 /*!
59     @brief      ハフマン圧縮を行います。
60     @param[in]  srcp        圧縮元データへのポインタ
61     @param[in]  size        圧縮元データサイズ
62     @param[out] dstp        圧縮先データへのポインタ(圧縮元データよりも大きいサイズのバッファが必要です)
63     @param[in]  huffBitSize 符号化ビット数
64     @param[in]  work        圧縮用一時バッファ(nn::cx::HUFFMAN_COMPRESS_WORK_SIZE バイトの領域が必要です)
65     @return     圧縮後のデータサイズを返します。
66                 圧縮後のデータが圧縮前よりも大きくなる場合には圧縮を中断し 0 を返します。
67  */
68 u32 CompressHuffman( const u8 *srcp, u32 size, u8 *dstp, u8 huffBitSize, void *work );
69 
70 }   // namespace cx
71 }   // namespace nn
72 
73 /* NN_CX_COMPRESSION_H_ */
74 #endif
75