diff -r 000000000000 -r 71ca22bcf22a mmserv/thumbnailengine/TneProcessorSrc/Yuv2rgb16.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/thumbnailengine/TneProcessorSrc/Yuv2rgb16.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,162 @@ +/* +* Copyright (c) 2006 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: Implementation of class CYuv2Rgb16. +* YUV to EColor64K colorspace converter concrete classes +* +*/ + + + + +#include "yuv2rgb16.h" + +// --------------------------------------------------------- +// CYuv2Rgb16::CYuv2Rgb16() +// Standard C++ constructor. +// --------------------------------------------------------- +// +CYuv2Rgb16::CYuv2Rgb16() +{ + iWidth = iHeight = 0; +} + +// --------------------------------------------------------- +// CYuv2Rgb16::~CYuv2Rgb16() +// Destructor +// --------------------------------------------------------- +// +CYuv2Rgb16::~CYuv2Rgb16() +{ +} + + +// --------------------------------------------------------- +// CYuv2Rgb16::ConstructL() +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------- +// +void CYuv2Rgb16::ConstructL(TUint aWidth, TUint aHeight, TUint /*aMaxWidth*/, TUint /*aMaxHeight*/) +{ + iWidth = aWidth; + iHeight = aHeight; +} + +// --------------------------------------------------------- +// CYuv2Rgb16::Convert() +// Converts a YUV frame to a EColor64K frame +// --------------------------------------------------------- +// +void CYuv2Rgb16::Convert(const TUint8 *aYBuf, const TUint8 *aUBuf, + const TUint8 *aVBuf, + TUint aBufWidth, TUint aBufHeight, + TUint8 *aTarget, TUint aTargetScanlineLength) +{ + + + TUint cols; + TUint rows = iHeight; + + __ASSERT_ALWAYS((aBufWidth >= iWidth) && (aBufHeight >= iHeight), + User::Invariant()); + + // Convert all rows, two at a time + while ( rows ) + { + // Convert all pixels in this row, two at a time + cols = iWidth; + + TUint8* target1 = aTarget; + TUint8* target2 = aTarget + aTargetScanlineLength; + const TUint8* YPtr1 = aYBuf; + const TUint8* YPtr2 = aYBuf + aBufWidth; + const TUint8* UPtr = aUBuf; + const TUint8* VPtr = aVBuf; + + TUint y, u, v; + TInt rDiff, gDiff, bDiff; + TInt r, g, b; + + while ( cols ) + { + y = *(YPtr1)++; + u = *(UPtr)++ - 128; + v = *(VPtr)++ - 128; + + rDiff = UvToRDiff(v, u); + gDiff = UvToGDiff(v, u); + bDiff = UvToBDiff(v, u); + + // Convert upper left pixel + r = (TInt)y + rDiff; + r = r<0 ? 0 : r>255 ? 0xF800 : (r<<8)&0xF800; + g = (TInt)y - gDiff; + g = g<0 ? 0 : g>255 ? 0x07E0 : (g<<3)&0x07E0; + b = (TInt)y + bDiff; + b = b<0 ? 0 : b>255 ? 0x001F : (b>>3)&0x001F; + + // Write the pixel in RGB format + *(TUint16*)target1 = (TUint16)(r | g | b); + target1 += 2; + + // Convert upper right pixel + y = *(YPtr1)++; + + r = (TInt)y + rDiff; + r = r<0 ? 0 : r>255 ? 0xF800 : (r<<8)&0xF800; + g = (TInt)y - gDiff; + g = g<0 ? 0 : g>255 ? 0x07E0 : (g<<3)&0x07E0; + b = (TInt)y + bDiff; + b = b<0 ? 0 : b>255 ? 0x001F : (b>>3)&0x001F; + + *(TUint16*)target1 = (TUint16)(r | g | b); + target1 += 2; + + // Convert lower left pixel + y = *(YPtr2)++; + + r = (TInt)y + rDiff; + r = r<0 ? 0 : r>255 ? 0xF800 : (r<<8)&0xF800; + g = (TInt)y - gDiff; + g = g<0 ? 0 : g>255 ? 0x07E0 : (g<<3)&0x07E0; + b = (TInt)y + bDiff; + b = b<0 ? 0 : b>255 ? 0x001F : (b>>3)&0x001F; + + *(TUint16*)target2 = (TUint16)(r | g | b); + target2 += 2; + + // Convert lower right pixel + y = *(YPtr2)++; + + r = (TInt)y + rDiff; + r = r<0 ? 0 : r>255 ? 0xF800 : (r<<8)&0xF800; + g = (TInt)y - gDiff; + g = g<0 ? 0 : g>255 ? 0x07E0 : (g<<3)&0x07E0; + b = (TInt)y + bDiff; + b = b<0 ? 0 : b>255 ? 0x001F : (b>>3)&0x001F; + + *(TUint16*)target2 = (TUint16)(r | g | b); + target2 += 2; + + // Next two pixels + cols -= 2; + } + + // Next rows + rows -= 2; + aYBuf += 2*aBufWidth; + aUBuf += aBufWidth/2; + aVBuf += aBufWidth/2; + aTarget += 2*aTargetScanlineLength; + } +}