sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "sgutils.h" sl@0: sl@0: sl@0: // Helper function used to transfer a scanline in 64K to the various formats of the destination. sl@0: LOCAL_C void TransferScanLine64K(TUint8* aDest, const TUint16* aSrc, TUidPixelFormat aPixelFormatDest, TInt aPixelLength) sl@0: { sl@0: switch (aPixelFormatDest) sl@0: { sl@0: case EUidPixelFormatRGB_565: sl@0: { sl@0: Mem::Copy(aDest, aSrc, aPixelLength << 1); sl@0: break; sl@0: } sl@0: case EUidPixelFormatARGB_8888_PRE: sl@0: { sl@0: TUint32* dest = reinterpret_cast(aDest); sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = TRgb::Color64K(*aSrc++).Color16MAP(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatARGB_8888: sl@0: { sl@0: TUint32* dest = reinterpret_cast(aDest); sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = TRgb::Color64K(*aSrc++).Color16MA(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatXRGB_8888: sl@0: { sl@0: TUint32* dest = reinterpret_cast(aDest); sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = (TRgb::Color64K(*aSrc++).Color16MU() | 0xff000000); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatRGB_888: sl@0: { sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: TInt col = TRgb::Color64K(*aSrc++).Color16M(); sl@0: *aDest++ = col; sl@0: *aDest++ = col >> 8; sl@0: *aDest++ = col >> 16; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatXRGB_4444: sl@0: { sl@0: TUint16* dest = reinterpret_cast(aDest); sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = TRgb::Color64K(*aSrc++).Color4K(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatP_8: sl@0: { sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest++ = TRgb::Color64K(*aSrc++).Color256(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_8: sl@0: { sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest++ = TRgb::Color64K(*aSrc++).Gray256(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_4: sl@0: { sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index+= 4) sl@0: { sl@0: TInt col = TRgb::Color64K(*aSrc++).Gray16(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatP_4: sl@0: { sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index+= 4) sl@0: { sl@0: TInt col = TRgb::Color64K(*aSrc++).Color16(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_2: sl@0: { sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index+= 2) sl@0: { sl@0: TInt col = TRgb::Color64K(*aSrc++).Gray4(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_1: sl@0: { sl@0: const TUint16* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index++) sl@0: { sl@0: TInt col = TRgb::Color64K(*aSrc++).Gray2(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: break; sl@0: } sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: // Helper function used to transfer a scanline in 16MAP to the various formats of the destination. sl@0: LOCAL_C void TransferScanLine16MAP(TUint8* aDest, const TUint32* aSrc, TUidPixelFormat aPixelFormatDest, TInt aPixelLength) sl@0: { sl@0: switch (aPixelFormatDest) sl@0: { sl@0: case EUidPixelFormatARGB_8888_PRE: sl@0: { sl@0: Mem::Copy(aDest, aSrc, aPixelLength << 2); sl@0: break; sl@0: } sl@0: case EUidPixelFormatARGB_8888: sl@0: { sl@0: TUint32* dest = reinterpret_cast(aDest); sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = TRgb::Color16MAP(*aSrc++).Color16MA(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatXRGB_8888: sl@0: { sl@0: TUint32* dest = reinterpret_cast(aDest); sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = (TRgb::Color16MAP(*aSrc++).Color16MU() | 0xff000000); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatRGB_888: sl@0: { sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: TInt col = TRgb::Color16MAP(*aSrc++).Color16M(); sl@0: *aDest++ = col; sl@0: *aDest++ = col >> 8; sl@0: *aDest++ = col >> 16; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatRGB_565: sl@0: { sl@0: TUint16* dest = reinterpret_cast(aDest); sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = TRgb::Color16MAP(*aSrc++).Color64K(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatXRGB_4444: sl@0: { sl@0: TUint16* dest = reinterpret_cast(aDest); sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *dest++ = TRgb::Color16MAP(*aSrc++).Color4K(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatP_8: sl@0: { sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest++ = TRgb::Color16MAP(*aSrc++).Color256(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_8: sl@0: { sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest++ = TRgb::Color16MAP(*aSrc++).Gray256(); sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_4: sl@0: { sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index+= 4) sl@0: { sl@0: TInt col = TRgb::Color16MAP(*aSrc++).Gray16(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatP_4: sl@0: { sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index+= 4) sl@0: { sl@0: TInt col = TRgb::Color16MAP(*aSrc++).Color16(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_2: sl@0: { sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index+= 2) sl@0: { sl@0: TInt col = TRgb::Color16MAP(*aSrc++).Gray4(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatL_1: sl@0: { sl@0: const TUint32* srcEnd = aSrc + aPixelLength; sl@0: while (aSrc < srcEnd) sl@0: { sl@0: *aDest = 0; sl@0: for (TInt index = 0; (index < 8) && (aSrc < srcEnd); index++) sl@0: { sl@0: TInt col = TRgb::Color16MAP(*aSrc++).Gray2(); sl@0: col <<= index; sl@0: *aDest |= col; sl@0: } sl@0: aDest++; sl@0: } sl@0: } sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: // Helper function used to copy a buffer in 64K to the various formats of the destination. sl@0: LOCAL_C TInt TransferPixels64K(TAny* aDataAddressDest, TInt aDataStrideDest, TUidPixelFormat aPixelFormatDest, sl@0: const TUint16* aDataAddressSrc, TInt aDataStrideSrc, const TRect& aRectSource) sl@0: { sl@0: TInt err = KErrNone; sl@0: const TInt width = aRectSource.Width(); sl@0: const TUint16* dataAddressSrc = PtrAdd(aDataAddressSrc + aRectSource.iTl.iX, aRectSource.iTl.iY * aDataStrideSrc); sl@0: const TUint16* dataAddressSrcEnd = PtrAdd(dataAddressSrc, aDataStrideSrc * aRectSource.Height()); sl@0: sl@0: switch (aPixelFormatDest) sl@0: { sl@0: case EUidPixelFormatRGB_565: sl@0: { sl@0: TUint8* dataAddressDest = static_cast(aDataAddressDest); sl@0: const TInt dataLength = width << 1; sl@0: while (dataAddressSrcEnd > dataAddressSrc) sl@0: { sl@0: Mem::Copy(dataAddressDest, dataAddressSrc, dataLength); sl@0: dataAddressSrc = PtrAdd(dataAddressSrc, aDataStrideSrc); sl@0: dataAddressDest += aDataStrideDest; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatARGB_8888_PRE: sl@0: case EUidPixelFormatARGB_8888: sl@0: case EUidPixelFormatXRGB_8888: sl@0: case EUidPixelFormatXRGB_4444: sl@0: case EUidPixelFormatL_1: sl@0: case EUidPixelFormatL_2: sl@0: case EUidPixelFormatL_4: sl@0: case EUidPixelFormatL_8: sl@0: case EUidPixelFormatP_4: sl@0: case EUidPixelFormatP_8: sl@0: case EUidPixelFormatRGB_888: sl@0: { sl@0: TUint8* dataAddressDest = static_cast(aDataAddressDest); sl@0: while (dataAddressSrcEnd > dataAddressSrc) sl@0: { sl@0: TransferScanLine64K(dataAddressDest, dataAddressSrc, aPixelFormatDest, width); sl@0: dataAddressSrc = PtrAdd(dataAddressSrc, aDataStrideSrc); sl@0: dataAddressDest += aDataStrideDest; sl@0: } sl@0: break; sl@0: } sl@0: default: sl@0: err = KErrNotSupported; sl@0: break; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: // Helper function used to copy a buffer in 16MAP to the various formats of the destination. sl@0: LOCAL_C TInt TransferPixels16MAP(TAny* aDataAddressDest, TInt aDataStrideDest, TUidPixelFormat aPixelFormatDest, sl@0: const TUint32* aDataAddressSrc, TInt aDataStrideSrc, const TRect& aRectSource) sl@0: { sl@0: TInt err = KErrNone; sl@0: const TInt width = aRectSource.Width(); sl@0: const TUint32* dataAddressSrc = PtrAdd(aDataAddressSrc + aRectSource.iTl.iX, aRectSource.iTl.iY * aDataStrideSrc); sl@0: const TUint32* dataAddressSrcEnd = PtrAdd(dataAddressSrc, aRectSource.Height() * aDataStrideSrc); sl@0: sl@0: switch (aPixelFormatDest) sl@0: { sl@0: case EUidPixelFormatARGB_8888_PRE: sl@0: { sl@0: TUint8* dataAddressDest = static_cast(aDataAddressDest); sl@0: const TInt dataLength = width << 2; sl@0: while (dataAddressSrcEnd > dataAddressSrc) sl@0: { sl@0: Mem::Copy(dataAddressDest, dataAddressSrc, dataLength); sl@0: dataAddressSrc = PtrAdd(dataAddressSrc, aDataStrideSrc); sl@0: dataAddressDest += aDataStrideDest; sl@0: } sl@0: break; sl@0: } sl@0: case EUidPixelFormatXRGB_8888: sl@0: case EUidPixelFormatARGB_8888: sl@0: case EUidPixelFormatRGB_565: sl@0: case EUidPixelFormatXRGB_4444: sl@0: case EUidPixelFormatL_1: sl@0: case EUidPixelFormatL_2: sl@0: case EUidPixelFormatL_4: sl@0: case EUidPixelFormatL_8: sl@0: case EUidPixelFormatP_4: sl@0: case EUidPixelFormatP_8: sl@0: case EUidPixelFormatRGB_888: sl@0: { sl@0: TUint8* dataAddressDest = static_cast (aDataAddressDest); sl@0: while (dataAddressSrcEnd > dataAddressSrc) sl@0: { sl@0: TransferScanLine16MAP(dataAddressDest, dataAddressSrc, aPixelFormatDest, width); sl@0: dataAddressSrc = PtrAdd(dataAddressSrc, aDataStrideSrc); sl@0: dataAddressDest += aDataStrideDest; sl@0: } sl@0: break; sl@0: } sl@0: default: sl@0: err = KErrNotSupported; sl@0: break; sl@0: } sl@0: return err; sl@0: } sl@0: sl@0: sl@0: /** sl@0: @publishedPartner sl@0: @prototype sl@0: @deprecated sl@0: sl@0: Convert from display mode to pixel format. sl@0: sl@0: @param aDisplayMode Display mode to convert. sl@0: sl@0: @return Pixel format corresponding to aDisplayMode, or EUidPixelFormatUnknown if aDisplayMode does not match any existing pixel format. sl@0: */ sl@0: EXPORT_C TUidPixelFormat SgUtils::DisplayModeToPixelFormat(TDisplayMode aDisplayMode) sl@0: { sl@0: switch (aDisplayMode) sl@0: { sl@0: case EGray2: sl@0: return EUidPixelFormatL_1; sl@0: case EGray4: sl@0: return EUidPixelFormatL_2; sl@0: case EGray16: sl@0: return EUidPixelFormatL_4; sl@0: case EGray256: sl@0: return EUidPixelFormatL_8; sl@0: case EColor16: sl@0: return EUidPixelFormatP_4; sl@0: case EColor256: sl@0: return EUidPixelFormatP_8; sl@0: case EColor4K: sl@0: return EUidPixelFormatXRGB_4444; sl@0: case EColor64K: sl@0: return EUidPixelFormatRGB_565; sl@0: case EColor16M: sl@0: return EUidPixelFormatRGB_888; sl@0: case EColor16MU: sl@0: return EUidPixelFormatXRGB_8888; sl@0: case ERgb: sl@0: case EColor16MA: sl@0: return EUidPixelFormatARGB_8888; sl@0: case EColor16MAP: sl@0: return EUidPixelFormatARGB_8888_PRE; sl@0: default: sl@0: break; sl@0: } sl@0: return EUidPixelFormatUnknown; sl@0: } sl@0: sl@0: sl@0: /** sl@0: @publishedPartner sl@0: @prototype sl@0: @deprecated sl@0: sl@0: Convert from pixel format to display mode. sl@0: sl@0: @param aPixelFormat Pixel format to convert. sl@0: sl@0: @return Display mode corresponding to aPixelFormat, or ENone if aPixelFormat does not match any existing display mode. sl@0: */ sl@0: EXPORT_C TDisplayMode SgUtils::PixelFormatToDisplayMode(TUidPixelFormat aPixelFormat) sl@0: { sl@0: switch (aPixelFormat) sl@0: { sl@0: case EUidPixelFormatL_1: sl@0: return EGray2; sl@0: case EUidPixelFormatL_2: sl@0: return EGray4; sl@0: case EUidPixelFormatL_4: sl@0: return EGray16; sl@0: case EUidPixelFormatL_8: sl@0: return EGray256; sl@0: case EUidPixelFormatP_4: sl@0: return EColor16; sl@0: case EUidPixelFormatP_8: sl@0: return EColor256; sl@0: case EUidPixelFormatXRGB_4444: sl@0: return EColor4K; sl@0: case EUidPixelFormatRGB_565: sl@0: return EColor64K; sl@0: case EUidPixelFormatRGB_888: sl@0: return EColor16M; sl@0: case EUidPixelFormatXRGB_8888: sl@0: return EColor16MU; sl@0: case EUidPixelFormatARGB_8888: sl@0: return EColor16MA; sl@0: case EUidPixelFormatARGB_8888_PRE: sl@0: return EColor16MAP; sl@0: default: sl@0: break; sl@0: } sl@0: return ENone; sl@0: } sl@0: sl@0: sl@0: /** sl@0: @publishedPartner sl@0: @prototype sl@0: @deprecated sl@0: sl@0: Calculates the minimum number of bytes between rows of data in a bi-dimensional pixel buffer. sl@0: The returned value is not guaranteed to be aligned onto any boundary. sl@0: sl@0: @param aWidth Width in pixels of the buffer. sl@0: @param aPixelFormat Pixel format of the buffer. sl@0: @return The minimum number of bytes between rows of data in a buffer with the given width and pixel format, sl@0: or KErrNotSupported if aPixelFormat is not recognized. sl@0: */ sl@0: EXPORT_C TInt SgUtils::MinDataStride(TInt aWidth, TUidPixelFormat aPixelFormat) sl@0: { sl@0: switch (aPixelFormat) sl@0: { sl@0: case EUidPixelFormatXRGB_8888: sl@0: case EUidPixelFormatBGRX_8888: sl@0: case EUidPixelFormatXBGR_8888: sl@0: case EUidPixelFormatBGRA_8888: sl@0: case EUidPixelFormatARGB_8888: sl@0: case EUidPixelFormatABGR_8888: sl@0: case EUidPixelFormatARGB_8888_PRE: sl@0: case EUidPixelFormatABGR_8888_PRE: sl@0: case EUidPixelFormatBGRA_8888_PRE: sl@0: case EUidPixelFormatARGB_2101010: sl@0: case EUidPixelFormatABGR_2101010: sl@0: return aWidth << 2; sl@0: case EUidPixelFormatBGR_888: sl@0: case EUidPixelFormatRGB_888: sl@0: return aWidth * 3; sl@0: case EUidPixelFormatRGB_565: sl@0: case EUidPixelFormatBGR_565: sl@0: case EUidPixelFormatARGB_1555: sl@0: case EUidPixelFormatXRGB_1555: sl@0: case EUidPixelFormatARGB_4444: sl@0: case EUidPixelFormatARGB_8332: sl@0: case EUidPixelFormatBGRX_5551: sl@0: case EUidPixelFormatBGRA_5551: sl@0: case EUidPixelFormatBGRA_4444: sl@0: case EUidPixelFormatBGRX_4444: sl@0: case EUidPixelFormatAP_88: sl@0: case EUidPixelFormatXRGB_4444: sl@0: case EUidPixelFormatXBGR_4444: sl@0: return aWidth << 1; sl@0: case EUidPixelFormatRGB_332: sl@0: case EUidPixelFormatA_8: sl@0: case EUidPixelFormatBGR_332: sl@0: case EUidPixelFormatP_8: sl@0: case EUidPixelFormatL_8: sl@0: return aWidth; sl@0: case EUidPixelFormatP_4: sl@0: case EUidPixelFormatL_4: sl@0: return (aWidth + 1) >> 1; sl@0: case EUidPixelFormatP_2: sl@0: case EUidPixelFormatL_2: sl@0: return (aWidth + 3) >> 2; sl@0: case EUidPixelFormatP_1: sl@0: case EUidPixelFormatL_1: sl@0: return (aWidth + 7) >> 3; sl@0: default: sl@0: return KErrNotSupported; sl@0: } sl@0: } sl@0: sl@0: sl@0: /** sl@0: @publishedPartner sl@0: @prototype sl@0: @deprecated sl@0: sl@0: Transfer data from one bi-dimensional pixel buffer to another bi-dimensional pixel buffer with a different pixel format. sl@0: The pixel format conversion may involve some data loss. This function currently supports the following pixel formats. sl@0: - For the source: EUidPixelFormatRGB_565, EUidPixelFormatARGB_8888_PRE. sl@0: - For the destination: EUidPixelFormatARGB_8888_PRE, EUidPixelFormatARGB_8888, EUidPixelFormatXRGB_8888, EUidPixelFormatRGB_888, sl@0: EUidPixelFormatRGB_565, EUidPixelFormatXRGB_4444, EUidPixelFormatP_8, EUidPixelFormatL_8, EUidPixelFormatL_4, EUidPixelFormatP_4, sl@0: EUidPixelFormatL_2, EUidPixelFormatL_1. sl@0: sl@0: @param aDataAddressDest The base address of the destination pixel buffer. sl@0: @param aDataStrideDest The number of bytes between rows of data in the destination pixel buffer. sl@0: @param aPixelFormatDest Pixel format of the destination buffer. sl@0: @param aDataAddressSrc The base address of the source pixel buffer. sl@0: @param aDataStrideSrc The number of bytes between rows of data in the source pixel buffer. sl@0: @param aPixelFormatSrc Pixel format of the source buffer. sl@0: @param aRectSource Rectangle of the source pixel buffer which will be transferred to the destination pixel buffer. sl@0: sl@0: @return KErrNone if successful. sl@0: @return KErrArgument If arguments do not lie within expected range. sl@0: @return KErrNotSupported If source or destination format is not supported. sl@0: */ sl@0: EXPORT_C TInt SgUtils::TransferPixels(TAny* aDataAddressDest, TInt aDataStrideDest, TUidPixelFormat aPixelFormatDest, sl@0: const TAny* aDataAddressSrc, TInt aDataStrideSrc, TUidPixelFormat aPixelFormatSrc, sl@0: const TRect& aRectSource) sl@0: { sl@0: if (aRectSource.IsEmpty() || !aDataAddressDest || !aDataAddressSrc || (aDataStrideDest <= 0) || (aDataStrideSrc <= 0) sl@0: || (SgUtils::MinDataStride(aRectSource.iBr.iX, aPixelFormatSrc) > aDataStrideSrc) sl@0: || (SgUtils::MinDataStride(aRectSource.Width(), aPixelFormatDest) > aDataStrideDest)) sl@0: { sl@0: return KErrArgument; sl@0: } sl@0: sl@0: TInt err = KErrNotSupported; sl@0: switch (aPixelFormatSrc) sl@0: { sl@0: case EUidPixelFormatRGB_565: sl@0: { sl@0: err = TransferPixels64K(aDataAddressDest, aDataStrideDest, aPixelFormatDest, sl@0: static_cast(aDataAddressSrc), aDataStrideSrc, aRectSource); sl@0: break; sl@0: } sl@0: case EUidPixelFormatARGB_8888_PRE: sl@0: { sl@0: err = TransferPixels16MAP(aDataAddressDest, aDataStrideDest, aPixelFormatDest, sl@0: static_cast(aDataAddressSrc), aDataStrideSrc, aRectSource); sl@0: break; sl@0: } sl@0: default: sl@0: break; sl@0: } sl@0: return err; sl@0: }