メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcRLE.h

Run Length Encode 圧縮アルゴリズム. [詳細]

#include "dkcOSIndependent.h"
#include "dkcMemoryStream.h"

dkcRLE.hのインクルード依存関係図

Include dependency graph

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

Included by dependency graph

ソースコードを見る。

構成

struct  dkc_RLE
struct  dkc_RLE_Header
struct  dkc_RLE_Comp
struct  dkc_RLE_NoComp
struct  dkc_RLEPackBits_Header

マクロ定義

#define dkcdRLE_EOF_ID   0x01
#define dkcdRLE_NOCOMPRESS_ID   0x00
#define dkcdRLE_SIGNATURE   'RLE\0'
 RLEのシグネチャ(変更しても大丈夫だよ〜(多分)).


型定義

typedef dkc_RLE DKC_RLE
typedef dkc_RLE_Header DKC_RLE_HEADER
typedef dkc_RLE_Comp DKC_RLE_COMP
typedef dkc_RLE_NoComp DKC_RLE_NOCOMP
typedef dkc_RLEPackBits_Header DKC_RLE_PACKBITS_HEADER

関数

DKC_EXTERN DKC_RLE *WINAPI dkcAllocRLE ()
DKC_EXTERN int WINAPI dkcFreeRLE (DKC_RLE **)
DKC_EXTERN int WINAPI dkcRLEEncode (DKC_RLE *ptr, DKC_MEMORYSTREAM *pms, DKC_RLE_HEADER *ph, BYTE *dest, size_t dsize, const BYTE *src, USHORT ssize, size_t CloseProcessSize, ULONG sig, BYTE aEOF_ID, BYTE aABS_ID)
DKC_EXTERN int WINAPI dkcRLEDecode (DKC_RLE *p, DKC_MEMORYSTREAM *pms, const DKC_RLE_HEADER *ph, const BYTE *src, USHORT ssize, ULONG sig)
DKC_EXTERN int WINAPI dkcRLEPackBitsEncode (DKC_RLE_PACKBITS_HEADER *p, BYTE *dest, size_t dsize, const BYTE *src, size_t ssize, BYTE count)
DKC_EXTERN int WINAPI dkcRLEPackBitsDecode (DKC_RLE_PACKBITS_HEADER *p, BYTE *dest, size_t dsize, const BYTE *src, size_t ssize)


説明

Run Length Encode 圧縮アルゴリズム.

作者:
d金魚

dkcRLE.h で定義されています。


マクロ定義

#define dkcdRLE_EOF_ID   0x01
 

dkcRLE.h38 行で定義されています。

#define dkcdRLE_NOCOMPRESS_ID   0x00
 

dkcRLE.h40 行で定義されています。

#define dkcdRLE_SIGNATURE   'RLE\0'
 

RLEのシグネチャ(変更しても大丈夫だよ〜(多分)).

dkcRLE.h42 行で定義されています。


型定義

typedef struct dkc_RLE DKC_RLE
 

参照元 dkcAllocRLE(), と dkcFreeRLE().

typedef struct dkc_RLE_Comp DKC_RLE_COMP
 

typedef struct dkc_RLE_Header DKC_RLE_HEADER
 

typedef struct dkc_RLE_NoComp DKC_RLE_NOCOMP
 

typedef struct dkc_RLEPackBits_Header DKC_RLE_PACKBITS_HEADER
 

参照元 dkcRLEPackBitsDecode(), と dkcRLEPackBitsEncode().


関数

DKC_EXTERN DKC_RLE* WINAPI dkcAllocRLE  ) 
 

dkcRLE.c12 行で定義されています。

参照先 DKC_RLE, と dkcAllocate().

00012                              {
00013     DKC_RLE *p = (DKC_RLE *)dkcAllocate(sizeof(DKC_RLE));
00014     return p;
00015 }

DKC_EXTERN int WINAPI dkcFreeRLE DKC_RLE **   ) 
 

dkcRLE.c17 行で定義されています。

参照先 DKC_RLE, dkcFree(), と NULL.

00017                                    {
00018     if(NULL==pp){
00019         return edk_FAILED;
00020     }
00021     return dkcFree((void **)pp);
00022 }

DKC_EXTERN int WINAPI dkcRLEDecode DKC_RLE p,
DKC_MEMORYSTREAM pms,
const DKC_RLE_HEADER ph,
const BYTE src,
USHORT  ssize,
ULONG  sig
 

引数:
ptr[in][out] dkcAllocRLE()で取得したポインタ
pms[in][out] dkcAllocMemoryStream()で取得したMemory Stream Objectへのポインタ
ph[out] DKC_RLE_HEADERへのポインタ
src[in] バッファへのポインタ
ssize[in] srcのサイズ
sig[in] RLEだと証明するシグネチャ
戻り値:
edk_Resultのどれかが返る。圧縮する価値の無い場合はedk_NoValueToProcessが返る。

DKC_EXTERN int WINAPI dkcRLEEncode DKC_RLE ptr,
DKC_MEMORYSTREAM pms,
DKC_RLE_HEADER ph,
BYTE dest,
size_t  dsize,
const BYTE src,
USHORT  ssize,
size_t  CloseProcessSize,
ULONG  sig,
BYTE  aEOF_ID,
BYTE  aABS_ID
 

引数:
ptr[in][out] dkcAllocRLE()で取得したポインタ
ph[out] DKC_RLE_HEADERへのポインタ
dest[out] デコードされたデータの書き出しバッファへのポインタ
dsize[in] destのサイズ (srcの2倍用意してください。)
src[in] バッファへのポインタ
ssize[in] srcのサイズ
sig[in] dkcRLEEncode()の時、指定したシグネチャID
CloseProcessSize[in] 処理を打ち切りにするサイズ
aEOF_ID[in] RLEのEOFを示す値≠指定する事を奨励する
aABS_ID[in] RLEの非圧縮を示す値 dkcdRLE_NOCOMPRESS_IDを指定する事を奨励する
戻り値:
戻り値はedk_SUCCEEDEDで成功。 どちらの条件でも処理を打ち切りにするサイズを超えたらedk_NoValueToProcessが返る。 それ以外はその戻り値によって各自判断。
覚え書き:
DKC_RLE_HEADERのメンバのmOriginSizeよりdsizeが小さいとこの関数は失敗します。 チョットしたネタ: dkcRLEEncodeって命名なんか変じゃない? Run Length Encode Encode ... ?? まぁ、仕様って事で・・・

DKC_EXTERN int WINAPI dkcRLEPackBitsDecode DKC_RLE_PACKBITS_HEADER p,
BYTE dest,
size_t  dsize,
const BYTE src,
size_t  ssize
 

dkcRLE.c142 行で定義されています。

参照先 BYTE, DKC_RLE_PACKBITS_HEADER, dkcCheckOverflowULONG(), dkc_RLEPackBits_Header::mCompressedSize, dkc_RLEPackBits_Header::mCount, と dkc_RLEPackBits_Header::mOriginSize.

00145 {
00146     BYTE *in = (BYTE *)src;
00147     const BYTE *sin = src + ssize;
00148     BYTE *out = dest;
00149     int i;
00150 
00151 #ifdef DEBUG
00152     if(dkcCheckOverflowULONG( (ULONG) dest,dsize)){ //こんなに厳密になる必要は無いかもしれないけどね・・・
00153         return edk_FAILED;
00154     }
00155 #endif
00156     if(dsize < p->mOriginSize){
00157         return edk_ArgumentException;
00158     }
00159     if(ssize < p->mCompressedSize){
00160         return edk_ArgumentException;
00161     }
00162     if(CHAR_MAX < p->mCount || p->mCount <= 2){
00163         return  edk_ArgumentException;
00164     }
00165     for(;;){
00166         BYTE t = *in++;
00167         int st;
00168         if(t & 0x80){//pack bits
00169             st = t - 0x80;
00170             for(i=0;i<st;i++){
00171                 *out++ = *in;
00172             }
00173             in++;
00174         }else{//No compression
00175             st = t;
00176             for(i=0;i<st;i++){
00177                 *out++ = *in++;
00178             }
00179         }
00180         if(in >= sin){
00181             break;
00182         }
00183     }
00184     return edk_SUCCEEDED;
00185 }

DKC_EXTERN int WINAPI dkcRLEPackBitsEncode DKC_RLE_PACKBITS_HEADER p,
BYTE dest,
size_t  dsize,
const BYTE src,
size_t  ssize,
BYTE  count
 

dkcRLE.c63 行で定義されています。

参照先 BYTE, DKC_RLE_PACKBITS_HEADER, dkcCheckOverflowULONG(), int2byte, dkc_RLEPackBits_Header::mCompressedSize, dkc_RLEPackBits_Header::mCount, dkc_RLEPackBits_Header::mOriginSize, と packbit.

00067 {
00068     BYTE *t = (BYTE *)src;
00069     BYTE *st = t + ssize;
00070     BYTE *out = dest;
00071     int i;
00072     
00073     if(dkcCheckOverflowULONG( (ULONG) dest,dsize)){
00074         return edk_FAILED;
00075     }
00076     if(dsize < ssize * 2){
00077         return edk_ArgumentException;
00078     }
00079     if(CHAR_MAX < a_count || a_count <= 2){
00080         return edk_ArgumentException;
00081     }
00082     for(;;){
00083         unsigned int tt = *t;
00084         BYTE *inp = t;
00085         int n = 1;
00086         t++;//1個め
00087         
00088         for(;t < st && n < CHAR_MAX;t++){
00089             if( *t != tt){
00090                 break;
00091             }
00092             n ++;
00093         }
00094         if(n >= a_count){
00095             *out++ = packbit(n) ;
00096 
00097             *out++ = (BYTE)(tt & 0xff);
00098 
00099 
00100         }else{
00101             
00102             int c = 1;//次のRUN長を調べるためのカウンタ
00103             BYTE *se = inp;
00104             t = inp;
00105             
00106             for(i = 0;se < st && i<CHAR_MAX;i++){
00107                 if(c >= a_count){
00108                     break;
00109                 }
00110                 if(t[i] == t[i + 1]){
00111                     c++;
00112                 }else{
00113                     c = 1;
00114                 }
00115 
00116                 se++;
00117             }
00118             
00119 
00120             if(c >= a_count){
00121                 se -= (c - 1);
00122                 i -= (c - 1);
00123             }
00124             *out++ = int2byte(i);
00125             for(;t < se;){
00126                 *out++ = *t++;
00127             }
00128             
00129 
00130         }
00131         if(t >= st){
00132             break;
00133         }
00134     }
00135     p->mCompressedSize = out - dest;
00136     p->mOriginSize = ssize;
00137     p->mCount = a_count;
00138     return edk_SUCCEEDED;
00139 }


dkutil_cに対してTue Feb 22 02:02:47 2005に生成されました。 doxygen 1.3.6