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

dkcRLE.c

#include "dkcRLE.h"

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

ソースコードを見る。

構成

struct  ABSResult

マクロ定義

#define DKUTIL_C_RLE_C
#define BYTE_MAX   256
#define packbit(a)   (BYTE)((a + 0x80) & 0xff)
#define int2byte(a)   (BYTE)(a & 0xff)

型定義

typedef BYTE Uchar

列挙型

enum  { rleABS_FINDRUN = -2, rleABS_FAILED = -1, rleABS_SUCCEEDED = 0 }

関数

DKC_RLE *WINAPI dkcAllocRLE ()
int WINAPI dkcFreeRLE (DKC_RLE **pp)
static BYTEsetPack (BYTE *dest, char count, BYTE data)
int WINAPI dkcRLEPackBitsEncode (DKC_RLE_PACKBITS_HEADER *p, BYTE *dest, size_t dsize, const BYTE *src, size_t ssize, BYTE a_count)
int WINAPI dkcRLEPackBitsDecode (DKC_RLE_PACKBITS_HEADER *p, BYTE *dest, size_t dsize, const BYTE *src, size_t ssize)


マクロ定義

#define BYTE_MAX   256
 

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

#define DKUTIL_C_RLE_C
 

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

#define int2byte  )     (BYTE)(a & 0xff)
 

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

参照元 dkcRLEPackBitsEncode().

#define packbit  )     (BYTE)((a + 0x80) & 0xff)
 

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

参照元 dkcRLEPackBitsEncode().


型定義

typedef BYTE Uchar
 

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


列挙型

anonymous enum
 

列挙型の値:
rleABS_FINDRUN  RLE圧縮出来そうなのが見つかった
rleABS_FAILED  失敗
rleABS_SUCCEEDED  成功

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

00027     {
00029     rleABS_FINDRUN = -2,
00031     rleABS_FAILED = -1,
00033     rleABS_SUCCEEDED = 0,
00034 };


関数

DKC_RLE* WINAPI dkcAllocRLE  ) 
 

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

参照先 dkcAllocate().

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

int WINAPI dkcFreeRLE DKC_RLE **  pp  ) 
 

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

参照先 dkcFree(), と NULL.

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

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

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

参照先 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 }

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

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

参照先 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 }

static BYTE* setPack BYTE dest,
char  count,
BYTE  data
[static]
 

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

00043                                                       {
00044     char *tc;
00045     tc = (char *)dest;
00046     *tc = count;
00047     dest++;
00048     *dest = data;
00049     dest++;
00050     return dest;
00051 }


dkutil_cに対してSat Sep 10 09:24:52 2005に生成されました。  doxygen 1.4.4