#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) |
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) |
|
|
|
|
|
|
|
|
|
|
|
00027 { 00029 rleABS_FINDRUN = -2, 00031 rleABS_FAILED = -1, 00033 rleABS_SUCCEEDED = 0, 00034 }; |
|
参照先 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 } |
|
参照先 BYTE.
00043 { 00044 char *tc; 00045 tc = (char *)dest; 00046 *tc = count; 00047 dest++; 00048 *dest = data; 00049 dest++; 00050 return dest; 00051 } |