imaging/imagingplugins/imagedisplay/plugins/mng/PngLayer.cpp
author hgs
Fri, 22 Oct 2010 10:31:17 +0530
changeset 6 d5507cf6801c
parent 0 5752a19fdefe
permissions -rw-r--r--
201037_01

// 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 <e32base.h>
#include <hal.h>
#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
	}