diff -r 000000000000 -r 40261b775718 mmplugins/imagingplugins/codecs/JPEGCodec/mcustore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmplugins/imagingplugins/codecs/JPEGCodec/mcustore.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,198 @@ +// Copyright (c) 2007-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: +// mcucliprect.cpp +// +// + +#include "JPEGCodec.h" +#include "fwextconstants.h" + +// +// +// +CMCUStore::CMCUStore(TJpgFrameInfo& aFrameInfo) + : iFrameInfo(aFrameInfo) + { + Reset(); + } + +// +// +// +CMCUStore::~CMCUStore() + { + } + +// +// +// +CMCUStore* CMCUStore::NewL(TJpgFrameInfo& aFrameInfo) + { + return new(ELeave) CMCUStore(aFrameInfo); + } + + +// +// Resets the store to a normal, unclipped decode. +// +void CMCUStore::Reset() + { + iClipped = EFalse; + iPrepared = EFalse; + iOperation = EDecodeNormal; + iReads = 0; + iMCUsPerBuffer = 0; + } + +// +// Sets the orientation. +// +void CMCUStore::SetOperation(const TTransformOptions aOperation) + { + iPrepared = EFalse; + iOperation = aOperation; + + if (!iClipped) + { + // Rendering the full image. + iCurrentMCU = 0; + iLastMCU = iFrameInfo.TotalMCUCount(); + } + } + + +// +// Sets the index of the MCU that contains the pixels of the top-left corner +// of the clipping rect, and the number of MCUs in the (bounded) clipping rect. +// +void CMCUStore::SetClippingRect(const TInt aFirstMCU, const TInt aTotalMCUs) + { + iPrepared = EFalse; + iClipped = ETrue; + iCurrentMCU = aFirstMCU; + iMaxReads = aTotalMCUs; + } + + +// +// Tells the store how many MCUs the buffer can contain. +// +void CMCUStore::SetMCUsPerBuffer(const TInt aMCUsPerBuffer) + { + ASSERT(aMCUsPerBuffer > 0); + + iMCUsPerBuffer = aMCUsPerBuffer; + } + +// +// This function sets up the order the MCUs are returned +// according to the current operation and presence of the +// clipping rect. +// +void CMCUStore::Prepare() + { + ASSERT(iMCUsPerBuffer > 0); + + switch (iOperation) + { + case EDecodeNormal: + case EDecodeHorizontalFlip: + case EDecodeVerticalFlip: + case EDecodeRotate180: + if (iClipped) + { + iMCUIncrement = 1; + iNextRowOffset = iFrameInfo.iMCUBlocksPerLine - iMCUsPerBuffer + 1; + } + else + { + iMCUIncrement = 1; + iNextRowOffset = 1; + } + break; + + case EDecodeRotate90: + case EDecodeRotate270: + case EDecodeHorizontalFlipRotate90: + case EDecodeVerticalFlipRotate90: + if (iClipped) + { + iMCUIncrement = iFrameInfo.iMCUBlocksPerLine; + iNextRowOffset = 1 - (iFrameInfo.iMCUBlocksPerLine * (iMCUsPerBuffer - 1)); + } + else + { + iMCUIncrement = iFrameInfo.iMCUBlocksPerLine; + iNextRowOffset = 1 - (iFrameInfo.iMCUBlocksPerLine * (iMCUsPerBuffer - 1)); + } + break; + + default: + ASSERT(EFalse); + } + + iPrepared = ETrue; + iReads = 0; + iMaxReads = (iClipped ? iMaxReads : iFrameInfo.TotalMCUCount()); + } + +// +// This should be called by the owning codec as soon as the buffer +// has been sent to the ImageProcessor. +// +void CMCUStore::NextLine() + { + if (!iPrepared) + { + Prepare(); + } + + if (iReads >= iMaxReads) + { + iCurrentMCU = KErrCompletion; + } + else + { + iCurrentMCU -= iMCUIncrement; + iCurrentMCU += iNextRowOffset; + } + } + +// +// Returns the next MCU to be rendered depending on the render mode. +// Returns KErrCompletion if there are no more MCUs required. +// +TInt CMCUStore::GetNextMCU() + { + if (!iPrepared) + { + Prepare(); + } + + if (iCurrentMCU == KErrCompletion) + { + return iCurrentMCU; + } + + TInt retMCU = iCurrentMCU; + iCurrentMCU += iMCUIncrement; + if (iReads++ > iMaxReads) + { + iCurrentMCU = KErrCompletion; + } + + ASSERT(retMCU == KErrCompletion || retMCU >= 0); + return retMCU; + } +