diff -r 000000000000 -r 40261b775718 mmplugins/imagingplugins/codecs/JPEGCodec/imgpositionprocessor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmplugins/imagingplugins/codecs/JPEGCodec/imgpositionprocessor.cpp Tue Feb 02 01:56:55 2010 +0200 @@ -0,0 +1,277 @@ +// 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: +// + +/** + @file + @internalComponent +*/ +#include + +#include "imgpositionprocessor.h" + +TPositionProcessor::TPositionProcessor() + { + iImgCornerCoord[0] = KJpgTLCoord; + iImgCornerCoord[1] = KJpgTRCoord; + iImgCornerCoord[2] = KJpgBLCoord; + iImgCornerCoord[3] = KJpgBRCoord; + + iIsEOF = EFalse; + iSwapDimensions = EFalse; + } + +/** + Set the dimensions for image rectangle and MCUs +*/ +void TPositionProcessor::SetDimensions(const TRect& aPixelFrame, const TSize& aPixelBlock) + { + iPixelFrame = aPixelFrame; + iPixelBlock = aPixelBlock; + + iIsEOF = EFalse; + iSwapDimensions = EFalse; + } + +/** + Sets the end of image flag. +*/ +void TPositionProcessor::SetEndOfImage(TBool aEndOfImage) + { + iIsEOF = aEndOfImage; + } + +/** + Transform image corner coordinates in case of rotation. This is a 90 degrees clockwise rotation. + This can be called multiple times to achieve 180, 270 or 360 degree rotation. +*/ +void TPositionProcessor::RotateCoordinates() + { + TUint8 tempVal = iImgCornerCoord[0]; + + iImgCornerCoord[0] = iImgCornerCoord[1]; + iImgCornerCoord[1] = iImgCornerCoord[3]; + iImgCornerCoord[3] = iImgCornerCoord[2]; + iImgCornerCoord[2] = tempVal; + + if(iSwapDimensions == EFalse) + { + iSwapDimensions = ETrue; + } + else + { + iSwapDimensions = EFalse; + } + } + +/** + Transform image corner coordinates in case of horizontal flip +*/ +void TPositionProcessor::HorFlipCoordinates() + { + TUint8 tempVal = iImgCornerCoord[0]; + + iImgCornerCoord[0] = iImgCornerCoord[2]; + iImgCornerCoord[2] = tempVal; + tempVal = iImgCornerCoord[1]; + iImgCornerCoord[1] = iImgCornerCoord[3]; + iImgCornerCoord[3] = tempVal; + } + +/** + Transform image corner coordinates in case of vertical flip +*/ +void TPositionProcessor::VerFlipCoordinates() + { + TUint8 tempVal = iImgCornerCoord[0]; + + iImgCornerCoord[0] = iImgCornerCoord[1]; + iImgCornerCoord[1] = tempVal; + tempVal = iImgCornerCoord[2]; + iImgCornerCoord[2] = iImgCornerCoord[3]; + iImgCornerCoord[3] = tempVal; + } + +/** + Moves to the first position of MCU in case of MCU transformation and pixel coordinate in case of data unit cooefficient transformation +*/ +void TPositionProcessor::MoveFirst() + { + TUint32* transformType = reinterpret_cast(iImgCornerCoord); + + switch (*transformType) + { + case ENormalEncode: + iCurrentPosition = iPixelFrame.iTl; + break; + case EEncodeRotate90: + iCurrentPosition.SetXY(iPixelFrame.iTl.iX, iPixelFrame.iBr.iY - iPixelBlock.iHeight); + break; + case EEncodeHorizontalFlip: + iCurrentPosition.SetXY(iPixelFrame.iTl.iX, iPixelFrame.iBr.iY - iPixelBlock.iHeight); + break; + case EEncodeVerticalFlip: + iCurrentPosition.SetXY(iPixelFrame.iBr.iX - iPixelBlock.iWidth, iPixelFrame.iTl.iY); + break; + case EEncodeRotate180: + iCurrentPosition.SetXY(iPixelFrame.iBr.iX - iPixelBlock.iWidth, iPixelFrame.iBr.iY - iPixelBlock.iHeight); + break; + case EEncodeRotate270: + iCurrentPosition.SetXY(iPixelFrame.iBr.iX - iPixelBlock.iWidth, iPixelFrame.iTl.iY); + break; + case EEncodeHorizontalFlipRotate90: + iCurrentPosition.SetXY(iPixelFrame.iBr.iX - iPixelBlock.iWidth, iPixelFrame.iBr.iY - iPixelBlock.iHeight); + break; + case EEncodeVerticalFlipRotate90: + iCurrentPosition = iPixelFrame.iTl; + break; + default: + ASSERT(EFalse); + } + } + +/** + Moves to the next position of MCU in case of MCU transformation and pixel coordinate in case of data unit cooefficient transformation +*/ +void TPositionProcessor::MoveNext() + { + TUint32* transformType = reinterpret_cast(iImgCornerCoord); + switch (*transformType) + { + case ENormalEncode: + { + iCurrentPosition.iX += iPixelBlock.iWidth; + if (iCurrentPosition.iX >= iPixelFrame.iBr.iX) + { + if (iCurrentPosition.iY + iPixelBlock.iHeight>= iPixelFrame.iBr.iY) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iX = iPixelFrame.iTl.iX; + iCurrentPosition.iY += iPixelBlock.iHeight; + } + } + break; + case EEncodeRotate90: + { + iCurrentPosition.iY -= iPixelBlock.iHeight; + if (iCurrentPosition.iY < iPixelFrame.iTl.iY) + { + if (iCurrentPosition.iX + iPixelBlock.iWidth >= iPixelFrame.iBr.iX) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iY = iPixelFrame.iBr.iY - iPixelBlock.iHeight; + iCurrentPosition.iX += iPixelBlock.iWidth; + } + } + break; + case EEncodeHorizontalFlip: + { + iCurrentPosition.iX += iPixelBlock.iWidth; + + if (iCurrentPosition.iX >= iPixelFrame.iBr.iX) + { + if (iCurrentPosition.iY <= iPixelFrame.iTl.iY) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iX = iPixelFrame.iTl.iX; + iCurrentPosition.iY -= iPixelBlock.iHeight; + } + } + break; + case EEncodeVerticalFlip: + { + iCurrentPosition.iX -= iPixelBlock.iWidth; + if (iCurrentPosition.iX < iPixelFrame.iTl.iX) + { + if (iCurrentPosition.iY + iPixelBlock.iHeight>= iPixelFrame.iBr.iY) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iX = iPixelFrame.iBr.iX - iPixelBlock.iWidth; + iCurrentPosition.iY += iPixelBlock.iHeight; + } + } + break; + case EEncodeRotate180: + { + iCurrentPosition.iX -= iPixelBlock.iWidth; + if (iCurrentPosition.iX < iPixelFrame.iTl.iX) + { + if (iCurrentPosition.iY - iPixelBlock.iHeight < iPixelFrame.iTl.iY) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iX = iPixelFrame.iBr.iX - iPixelBlock.iWidth; + iCurrentPosition.iY -= iPixelBlock.iHeight; + } + } + break; + case EEncodeRotate270: + { + iCurrentPosition.iY += iPixelBlock.iHeight; + if (iCurrentPosition.iY + iPixelBlock.iHeight > iPixelFrame.iBr.iY ) + { + if (iCurrentPosition.iX <= iPixelFrame.iTl.iX) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iY = iPixelFrame.iTl.iY; + iCurrentPosition.iX -= iPixelBlock.iWidth; + } + } + break; + case EEncodeHorizontalFlipRotate90: + { + iCurrentPosition.iY -= iPixelBlock.iHeight; + if (iCurrentPosition.iY < iPixelFrame.iTl.iY) + { + if (iCurrentPosition.iX - iPixelBlock.iWidth < iPixelFrame.iTl.iX) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iY = iPixelFrame.iBr.iY - iPixelBlock.iHeight; + iCurrentPosition.iX -= iPixelBlock.iWidth; + } + } + break; + case EEncodeVerticalFlipRotate90: + { + iCurrentPosition.iY += iPixelBlock.iHeight; + if (iCurrentPosition.iY + iPixelBlock.iHeight > iPixelFrame.iBr.iY) + { + if (iCurrentPosition.iX + iPixelBlock.iWidth >= iPixelFrame.iBr.iX) + { + iIsEOF = ETrue; + return; + } + iCurrentPosition.iY = iPixelFrame.iTl.iY; + iCurrentPosition.iX += iPixelBlock.iWidth; + } + } + break; + default: + ASSERT(EFalse); + } + } +