#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 }
|
1.3.6