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

# 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 BYTE * | setPack (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.c の 56 行で定義されています。

#define DKUTIL_C_RLE_C

| dkcRLE.c の 7 行で定義されています。

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

| dkcRLE.c の 61 行で定義されています。 参照元 dkcRLEPackBitsEncode().

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

| dkcRLE.c の 59 行で定義されています。 参照元 dkcRLEPackBitsEncode().

## 型定義

typedef BYTE Uchar

| dkcRLE.c の 55 行で定義されています。

## 列挙型

anonymous enum

  | 列挙型の値:
  rleABS_FINDRUN | RLE圧縮出来そうなのが見つかった
  rleABS_FAILED | 失敗
  rleABS_SUCCEEDED | 成功
dkcRLE.c の 27 行で定義されています。
    00027     {
    00029     rleABS_FINDRUN = -2,
    00031     rleABS_FAILED = -1,
    00033     rleABS_SUCCEEDED = 0,
    00034 };

## 関数

DKC_RLE* WINAPI dkcAllocRLE | ( |  | ) |

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

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

| dkcRLE.c の 17 行で定義されています。 参照先 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.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 }

int WINAPI dkcRLEPackBitsEncode | ( | DKC_RLE_PACKBITS_HEADER * | p,
|  | BYTE * | dest,
|  | size_t | dsize,
|  | const BYTE * | src,
|  | size_t | ssize,
|  | BYTE | a_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 }

static BYTE* setPack | ( | BYTE * | dest,
|  | char | count,
|  | BYTE | data
| ) | `[static]`

| dkcRLE.c の 43 行で定義されています。
    00043                                                       {
    00044     char *tc;
    00045     tc = (char *)dest;
    00046     *tc = count;
    00047     dest++;
    00048     *dest = data;
    00049     dest++;
    00050     return dest;
    00051 }