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