#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のシグネチャ(変更しても大丈夫だよ〜(多分)).
|
|
|
参照元 dkcAllocRLE(), と dkcFreeRLE(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
参照先 DKC_RLE, と dkcAllocate().
00012 {
00013 DKC_RLE *p = (DKC_RLE *)dkcAllocate(sizeof(DKC_RLE));
00014 return p;
00015 }
|
|
|
参照先 DKC_RLE, dkcFree(), と NULL.
|
|
||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
参照先 BYTE, DKC_RLE_PACKBITS_HEADER, 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, DKC_RLE_PACKBITS_HEADER, 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 }
|
1.3.6