#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) |
dkcRLE.h で定義されています。
|
|
|
|
|
RLEのシグネチャ(変更しても大丈夫だよ〜(多分))
|
|
|
|
|
|
|
|
|
|
|
|
参照先 dkcAllocate(). 00012 { 00013 DKC_RLE *p = (DKC_RLE *)dkcAllocate(sizeof(DKC_RLE)); 00014 return p; 00015 }
|
|
00017 { 00018 if(NULL==pp){ 00019 return edk_FAILED; 00020 } 00021 return dkcFree((void **)pp); 00022 }
|
|
|
|
|
|
参照先 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 }
|
|
参照先 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 }
|