00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef INCL_PLPICDEC
00012 #define INCL_PLPICDEC
00013
00014 #ifndef INCL_PLBITMAP
00015 #include "plbitmap.h"
00016 #endif
00017
00018 #ifndef INCL_PLDATASRC
00019 #include "pldatasrc.h"
00020 #endif
00021
00026 class PLPicDecoder : public PLObject
00027 {
00028
00029
00030 public:
00033 PLPicDecoder
00034 ();
00035
00037 virtual ~PLPicDecoder
00038 ();
00039
00046 virtual void MakeBmpFromFile
00047 ( const char * pszFName,
00048 PLBmp * pBmp,
00049 int BPPWanted = 0,
00050 PLIProgressNotification * pProgNot = NULL
00051 );
00052
00053 #ifdef _WINDOWS
00067 virtual void MakeBmpFromResource
00068 ( HINSTANCE hInstResource, int ResourceID,
00069 PLBmp * pBmp,
00070 int BPPWanted = 0,
00071 const char* ResType = NULL,
00072 HMODULE hResModule = 0
00073 );
00074 #endif
00075
00083 virtual void PLPicDecoder::MakeBmpFromMemory
00084 ( unsigned char * ucMemSrc,
00085 int MemSrcSize,
00086 PLBmp * pBmp,
00087 int BPPWanted = 0,
00088 PLIProgressNotification * pProgNot = NULL
00089 );
00090
00096 virtual void MakeBmp
00097 ( PLDataSource * pDataSrc,
00098 PLBmp * pBmp,
00099 int BPPWanted = 0
00100 );
00101
00102 void OpenFile
00103 ( const char * pszFName,
00104 PLIProgressNotification * pProgNot = NULL
00105 );
00106
00107 virtual void Close
00108 ();
00109
00123 static void SetTraceConfig
00124 ( int Level,
00125 char * pszFName
00126 );
00127
00128
00129
00130
00131 static void raiseError
00132 ( int Code,
00133 char * pszErr
00134 );
00135
00137 static void Trace
00138 ( int TraceLevel,
00139 const char * pszMessage
00140 );
00141
00142 protected:
00150 virtual void DoDecode
00151 ( PLBmp * pBmp,
00152 PLDataSource * pDataSrc
00153 );
00154
00155 PLBYTE * unpackPictRow
00156 ( PLBYTE * pLineBuf,
00157 PLDataSource * pDataSrc,
00158 int Width,
00159 int rowBytes,
00160 int SrcBytes
00161 );
00162
00163 PLBYTE ReadByte
00164 ( PLDataSource * pDataSrc
00165 );
00166
00167
00168
00169 PLWORD ReadIWord
00170 ( PLDataSource * pDataSrc
00171 );
00172
00173 PLWORD ReadMWord
00174 ( PLDataSource * pDataSrc
00175 );
00176
00177 PLLONG ReadILong
00178 ( PLDataSource * pDataSrc
00179 );
00180
00181 PLLONG ReadMLong
00182 ( PLDataSource * pDataSrc
00183 );
00184
00185 PLDataSource * m_pDataSrc;
00186
00187 private:
00189
00190
00191 static int m_TraceLevel;
00192
00193
00194
00195 static char * m_pszTraceFName;
00196
00197 };
00198
00199
00200 inline PLBYTE PLPicDecoder::ReadByte
00201 ( PLDataSource * pDataSrc
00202 )
00203 {
00204
00205 return *(pDataSrc->ReadNBytes (1));
00206 }
00207
00208
00209 inline PLWORD PLPicDecoder::ReadIWord
00210 ( PLDataSource * pDataSrc
00211 )
00212 {
00213 PLBYTE * pData = pDataSrc->Read2Bytes ();
00214
00215 return pData[0] + (pData[1]<<8);
00216 }
00217
00218
00219 inline PLWORD PLPicDecoder::ReadMWord
00220 ( PLDataSource * pDataSrc
00221 )
00222 {
00223 PLBYTE * pData = pDataSrc->Read2Bytes ();
00224 return pData[1] + (pData[0]<<8);
00225 }
00226
00227
00228 inline PLLONG PLPicDecoder::ReadILong
00229 ( PLDataSource * pDataSrc
00230 )
00231 {
00232 PLBYTE * pData = pDataSrc->Read4Bytes ();
00233 return pData[0] + (pData[1]<<8) + (pData[2]<<16) + (pData[3]<<24);
00234 }
00235
00236 inline PLLONG PLPicDecoder::ReadMLong
00237 ( PLDataSource * pDataSrc
00238 )
00239 {
00240 PLBYTE * pData = pDataSrc->Read4Bytes ();
00241 return pData[3] + (pData[2]<<8) + (pData[1]<<16) + (pData[0]<<24);
00242 }
00243
00244 #endif
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291