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

# dkcRLE.h

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

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

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

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

ソースコードを見る。

## 構成
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.h の 38 行で定義されています。

#define dkcdRLE_NOCOMPRESS_ID 0x00

| dkcRLE.h の 40 行で定義されています。

#define dkcdRLE_SIGNATURE 'RLE\0'

| RLEのシグネチャ（変更しても大丈夫だよ～（多分)) dkcRLE.h の 42 行で定義されています。

## 型定義

typedef struct dkc_RLE DKC_RLE

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

## 関数

DKC_EXTERN DKC_RLE* WINAPI dkcAllocRLE | ( |  | ) |

| dkcRLE.c の 12 行で定義されています。 参照先 dkcAllocate().
    00012                              {
    00013     DKC_RLE *p = (DKC_RLE *)dkcAllocate(sizeof(DKC_RLE));
    00014     return p;
    00015 }

DKC_EXTERN int WINAPI dkcFreeRLE | ( | DKC_RLE ** |  | ) |

| dkcRLE.c の 17 行で定義されています。 参照先 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を示す値≠w定する事を奨励する
  | 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.c の 142 行で定義されています。 参照先 BYTE, 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.c の 63 行で定義されています。 参照先 BYTE, 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 }