00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include <barsc.h>
00033 #include <barsread.h>
00034 #include <bautils.h>
00035
00036 #include <imageconversion.h>
00037
00038 #include "ImageUtils.h"
00039 #include <101F4122_extra.rsg>
00040 #include "uids.h"
00041 #include "PNGCodec.h"
00042
00043
00044
00045
00046
00047
00048 CPngDecoder* CPngDecoder::NewL()
00049 {
00050 return new(ELeave) CPngDecoder;
00051 }
00052
00053 CPngDecoder::CPngDecoder()
00054 {
00055 }
00056
00057
00058 CPngDecoder::~CPngDecoder()
00059 {
00060 Cleanup();
00061 }
00062
00063
00064 void CPngDecoder::ImageType(TInt aFrameNumber, TUid& aImageType, TUid& aImageSubType) const
00065 {
00066 __ASSERT_ALWAYS(aFrameNumber == 0, Panic(KErrArgument));
00067 aImageType = KImageTypePNGUid;
00068 aImageSubType = KNullUid;
00069 }
00070
00071
00072 void CPngDecoder::ScanDataL()
00073 {
00074
00075 ReadFormatL();
00076 ASSERT(ImageReadCodec() == NULL);
00077
00078
00079 CPngReadCodec* imageReadCodec;
00080 imageReadCodec = new(ELeave) CPngReadCodec;
00081
00082 SetImageReadCodec(imageReadCodec);
00083 imageReadCodec->ConstructL();
00084
00085
00086 ReadFrameHeadersL();
00087 }
00088
00089
00090 void CPngDecoder::ReadFormatL()
00091 {
00092
00093 TPtrC8 bufferDes;
00094 ReadDataL(0, bufferDes, KPngFileSignatureLength);
00095
00096
00097 if (bufferDes.Length() < KPngFileSignatureLength)
00098 User::Leave(KErrUnderflow);
00099
00100 const TUint8* ptr = bufferDes.Ptr();
00101 if (Mem::Compare(ptr, KPngFileSignatureLength, KPngSignature, KPngFileSignatureLength)!=0)
00102 User::Leave(KErrCorrupt);
00103
00104
00105 SetStartPosition(KPngFileSignatureLength);
00106
00107
00108 SetDataLength(KMaxTInt);
00109 }
00110
00111
00112 CFrameInfoStrings* CPngDecoder::FrameInfoStringsL(RFs& aFs, TInt aFrameNumber)
00113 {
00114 const TUid KPngCodecDllUid = {KExPNGCodecDllUidValue};
00115
00116
00117 RResourceFile resourceFile;
00118 OpenExtraResourceFileLC(aFs,KPngCodecDllUid,resourceFile);
00119 HBufC8* resourceInfo = resourceFile.AllocReadLC(THEDECODERINFO);
00120 TResourceReader resourceReader;
00121 resourceReader.SetBuffer(resourceInfo);
00122
00123 TBuf<KCodecResourceStringMax> info;
00124 TBuf<KCodecResourceStringMax> templte;
00125
00126 const TFrameInfo& frameInfo = FrameInfo(aFrameNumber);
00127 CFrameInfoStrings* frameInfoStrings = CFrameInfoStrings::NewLC();
00128
00129
00130 info = resourceReader.ReadTPtrC();
00131 frameInfoStrings->SetDecoderL(info);
00132
00133 info = resourceReader.ReadTPtrC();
00134 frameInfoStrings->SetFormatL(info);
00135
00136 TInt width = frameInfo.iOverallSizeInPixels.iWidth;
00137 TInt height = frameInfo.iOverallSizeInPixels.iHeight;
00138 TInt depth = frameInfo.iBitsPerPixel;
00139 templte = resourceReader.ReadTPtrC();
00140 info.Format(templte, width, height);
00141 frameInfoStrings->SetDimensionsL(info);
00142
00143 CDesCArrayFlat* resourceArray = resourceReader.ReadDesCArrayL();
00144 CleanupStack::PushL(resourceArray);
00145 TUint formatIndex = (frameInfo.iFlags & TFrameInfo::EColor) ? 1 : 0;
00146 templte = (*resourceArray)[formatIndex];
00147 CleanupStack::PopAndDestroy(resourceArray);
00148 info.Format(templte, depth);
00149 frameInfoStrings->SetDepthL(info);
00150
00151 info = resourceReader.ReadTPtrC();
00152 if (frameInfo.iFlags & TFrameInfo::EAlphaChannel && frameInfo.iFlags & TFrameInfo::EColor)
00153 {
00154 frameInfoStrings->SetDetailsL(info);
00155 }
00156
00157 CleanupStack::Pop(frameInfoStrings);
00158 CleanupStack::PopAndDestroy(2);
00159 return frameInfoStrings;
00160 }
00161
00162
00163
00164
00165
00166
00167 CPngEncoder* CPngEncoder::NewL()
00168 {
00169 return new(ELeave) CPngEncoder;
00170 }
00171
00172 CPngEncoder::CPngEncoder()
00173 {
00174 }
00175
00176
00177 CPngEncoder::~CPngEncoder()
00178 {
00179 CImageEncoderPlugin::Cleanup();
00180 }
00181
00182
00183 void CPngEncoder::PrepareEncoderL(const CFrameImageData* aFrameImageData)
00184 {
00185
00186 TInt bpp = 24;
00187 TBool color = ETrue;
00188 TBool paletted = EFalse;
00189 TInt compressionLevel = TPngEncodeData::EDefaultCompression;
00190
00191
00192 const TInt count = (aFrameImageData) ? aFrameImageData->FrameDataCount() : 0;
00193 for (TInt i=0; i < count; i++)
00194 {
00195 const TFrameDataBlock* encoderData = aFrameImageData->GetFrameData(i);
00196 if (encoderData->DataType() == KPNGEncodeDataUid)
00197 {
00198 const TPngEncodeData* pngEncodeData = static_cast<const TPngEncodeData*>(encoderData);
00199 bpp = pngEncodeData->iBitsPerPixel;
00200 color = pngEncodeData->iColor;
00201 paletted = pngEncodeData->iPaletted;
00202 compressionLevel = pngEncodeData->iLevel;
00203 }
00204 }
00205
00206
00207 CPngWriteCodec* codec = new(ELeave) CPngWriteCodec(bpp, color, paletted, compressionLevel);
00208
00209 SetImageWriteCodec(codec);
00210 codec->ConstructL();
00211 }