diff -r 000000000000 -r 40261b775718 mmplugins/imagingplugins/imagedisplay/plugins/mng/PngLayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmplugins/imagingplugins/imagedisplay/plugins/mng/PngLayer.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,92 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** @file + @internalTechnology */ +#include +#include +#include "MngPlayer.h" +#include "MngRenderer.h" +#include "PNGCodec.h" + +#include "PngLayer.h" + +/*static*/ +CPngLayer* CPngLayer::NewL() + { + CPngLayer* self = new (ELeave) CPngLayer(); + CleanupStack::PushL(self); + self->iPngBuffer = CBufFlat::NewL(256); + CleanupStack::Pop(self); + return self; + } + +CPngLayer::~CPngLayer() + { + if (iPngCodec) + { + iPngCodec->Release(); + iPngCodec = NULL; + } + + delete iPngBuffer; + } + +void CPngLayer::AppendChunkL(const TMNGChunkHeader& aHeader,MInputStream& aInpStream) + { + TInt sz=iPngBuffer->Size(); + iPngBuffer->ResizeL(sz + TMNGChunkHeader::RequiredData() + aHeader.iLength + sizeof(TChunkCrc)); +// PNG decoder should check CRC for PNG streams... + TPtr8 buf( iPngBuffer->Ptr(sz) ); + aInpStream.ReadL(buf); + } + +void CPngLayer::ExecuteL(CMngPlayer& aPlayer, TMngExecuteResult& /*aResult*/) + { +#if defined(ENABLE_PNG_LAYER_PROFILE) + TUint32 begin=User::FastCounter(); +#endif // ENABLE_PNG_LAYER_PROFILE + + CMngRenderer* Renderer = aPlayer.Renderer(); + if (iPngBuffer->Size()!=iPngBuffer->Capacity() && iPngBuffer->Size()!=0) + { + iPngBuffer->Compress(); + } + + Renderer->OnNewImageL(); + if (Renderer->OutputEnabled()) + { + if (NULL==iPngCodec) + { + TBufPtr8 ptr; + ptr.Set(iPngBuffer->Ptr(0)); + aPlayer.DecoderFactory().CreatePngDecoderL(iPngCodec); + iPngCodec->InitL(Renderer->ImageProcessor(), Renderer->MaskProcessor(), aPlayer.GetDestinationBitmap(), ptr, aPlayer); + } + else + { + iPngCodec->ResetL(); + } + iPngCodec->DecodeL(); + } + +#if defined(ENABLE_PNG_LAYER_PROFILE) + TUint32 end=User::FastCounter(); + TInt freq=0; + HAL::Get(HAL::EFastCounterFrequency, freq); + RDebug::Print(_L("PNG layer took %d, freq=%d"), end-begin, freq); +#endif // ENABLE_PNG_LAYER_PROFILE + } +