mmplugins/imagingplugins/codecs/JPEGCodec/mcustore.cpp
changeset 0 40261b775718
--- /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;
+	}
+