#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) |
|
|
|
|
|
RLEのシグネチャ(変更しても大丈夫だよ〜(多分)).
|
|
参照元 dkcAllocRLE(), dkcFreeRLE(), dkcRLEDecode(), と dkcRLEEncode(). |
|
参照元 getRLE(). |
|
参照元 dkcRLEDecode(), と dkcRLEEncode(). |
|
参照元 dkcRLEDecode(), と getABS(). |
|
|
|
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 } |
|
trash/dkcRLE.c の 251 行で定義されています。
00254 { 00255 00256 size_t i=0; 00257 BYTE t; 00258 //DKC_RLE_COMP co; 00259 DKC_RLE_NOCOMP nco; 00260 //今のオフセット 00261 size_t old_mem_offset = dkcMemoryStreamTell(pms); 00262 00263 if(ph->mSignature != sig){ 00264 return edk_SignatureException; 00265 } 00266 00267 for(;i<ssize;i++) 00268 { 00269 t = src[i]; 00270 if(t==ph->mABS){ 00271 memcpy(&nco,&src[i],sizeof(nco)); 00272 dkcMemoryStreamWrite(pms,&src[i],nco.length); 00273 } 00274 else if(t == ph->mEOF) 00275 { 00276 break; 00277 }else{//compressed 00278 if(t <= 1){ 00279 goto BACK; 00280 } 00281 memset(p->mTemp,src[i + 1],t); 00282 dkcMemoryStreamWrite(pms,&(p->mTemp),t); 00283 00284 //一つ分update 00285 i++; 00286 } 00287 }//end of for 00288 00289 return edk_SUCCEEDED; 00290 BACK: 00291 00292 dkcMemoryStreamSeek(pms,old_mem_offset,edkcMemoryStreamSeekSet); 00293 00294 return edk_FAILED; 00295 00296 00297 } |
|
|
|
参照先 BYTE, DKC_EXTERN, DKC_RLE_PACKBITS_HEADER, dkcmNOT_ASSERT, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, dkc_RLEPackBits_Header::mCount, と dkc_RLEPackBits_Header::mOriginSize.
00180 { 00181 const char *pt; 00182 int a_count = p->mCount; 00183 BYTE *po = dest,*sentinel = dest + dsize; 00184 size_t temp; 00185 size_t i = 0; 00186 int r = edk_FAILED; 00187 00188 //DKC_MEMORYSTREAM_ADAPTER ad,bd; 00189 00190 //dkcMemoryStreamAdapterInit(&ad,dest,dsize); 00191 00192 if(dsize < p->mOriginSize){ 00193 return edk_ArgumentException; 00194 } 00195 for(;;){ 00196 pt = (const char *)&src[i]; 00197 i++; 00198 if(*pt <= -a_count){ 00199 temp = (size_t)(-(*pt)); 00200 memset(po,src[i],temp); 00201 00202 po += temp; 00203 i++; 00204 }else{ 00205 //dkcmNOT_ASSERT(*pt == 0); 00206 dkcmNOT_ASSERT(*pt <= 0); 00207 temp = (size_t)(*pt); 00208 memcpy(po,&src[i],temp); 00209 i += temp; 00210 po += temp; 00211 } 00212 if(!(i < ssize)){ 00213 r = edk_SUCCEEDED; 00214 break; 00215 } 00216 if(po == sentinel){ 00217 break; 00218 } 00219 }//end of for 00220 return r; 00221 } |
|
参照先 BYTE, DKC_MEMORYSTREAM_ADAPTER, DKC_MSA_PUSH, DKC_RLE_PACKBITS_HEADER, dkcCheckOverflowULONG(), dkcMemoryStreamAdapterGetOffset(), dkcMemoryStreamAdapterInit(), dkcMemoryStreamAdapterPointer(), dkcMemoryStreamAdapterPopBack(), dkcMemoryStreamAdapterPushBackMacro, edk_ArgumentException, edk_FAILED, edk_SUCCEEDED, と dkc_MemoryStreamAdapter::mNowOffset.
00058 { 00059 int r = edk_FAILED; 00060 size_t i = 0; 00061 int count = 0; 00062 size_t ti = 0; 00063 size_t break_c = 0; 00064 DKC_MEMORYSTREAM_ADAPTER ad,bd; 00065 BYTE buff[128 + 2]; 00066 //size_t bc = 0; 00067 BYTE t; 00068 00069 dkcMemoryStreamAdapterInit(&ad,dest,dsize); 00070 dkcMemoryStreamAdapterInit(&bd,buff,sizeof(buff)); 00071 00072 00073 00074 # define DKC_MSA_PUSH(a,d,s) dkcMemoryStreamAdapterPushBack(a,d,s) 00075 memset(p,0,sizeof(*p)); 00076 if(dkcCheckOverflowULONG((ULONG)dest,dsize)){ 00077 return edk_FAILED; 00078 } 00079 if(dsize < ssize * 2){ 00080 return edk_ArgumentException; 00081 } 00082 if(CHAR_MAX < a_count || a_count <= 1){ 00083 return edk_ArgumentException; 00084 } 00085 00086 for(;;){ 00087 count = 1; 00088 00089 t = src[i]; 00090 ti = i; 00091 i++; 00092 for(;;){ 00093 00094 if(t != src[i]){ 00095 break; 00096 } 00097 00098 count++; 00099 if(count >= -CHAR_MIN){ 00100 break; 00101 } 00102 i++; 00103 if(!(i < ssize)){ 00104 r = edk_SUCCEEDED; 00105 break; 00106 } 00107 } 00108 00109 if((size_t)count >= a_count){ 00110 dkcMemoryStreamAdapterPushBackMacro(char,&ad,-count); 00111 dkcMemoryStreamAdapterPushBackMacro(BYTE,&ad,t); 00112 }else{ 00113 i = ti; 00114 count = 0; 00115 break_c = 1; 00116 if(i != 0){ 00117 t = src[i - 1]; 00118 }else{ 00119 t = (BYTE)(src[i] + 1); 00120 } 00121 00122 00123 for(;;){ 00124 if(t == src[i]){ 00125 if(1 == break_c){ 00126 ti = i - 1; 00127 } 00128 break_c++; 00129 if(break_c >= a_count){ 00130 00131 count -= i - ti; 00132 dkcMemoryStreamAdapterPopBack(&bd,i - ti); 00133 i = ti; 00134 break; 00135 } 00136 00137 }else{ 00138 break_c = 1; 00139 00140 } 00141 dkcMemoryStreamAdapterPushBackMacro(BYTE,&bd,src[i]); 00142 00143 count++; 00144 if(count >= CHAR_MAX){ 00145 break; 00146 } 00147 i++; 00148 if(!(i < ssize)){ 00149 r = edk_SUCCEEDED; 00150 break; 00151 } 00152 00153 t = src[i - 1]; 00154 } 00155 dkcMemoryStreamAdapterPushBackMacro(BYTE,&ad,count); 00156 00157 DKC_MSA_PUSH(&ad, 00158 dkcMemoryStreamAdapterPointer(&bd),dkcMemoryStreamAdapterGetOffset(&bd) 00159 ); 00160 } 00161 00162 bd.mNowOffset = 0; 00163 00164 if(!(i < ssize)){ 00165 r = edk_SUCCEEDED; 00166 break; 00167 } 00168 }//end of for 00169 00170 # undef DKC_MSA_PUSH 00171 p->mCompressedSize = dkcMemoryStreamAdapterGetOffset(&ad); 00172 p->mOriginSize = ssize; 00173 p->mCount = (int)a_count; 00174 return r; 00175 } |