williamr@2: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: const TUint32 KRBMask = 0x00ff00ff; williamr@2: const TUint32 KAGMask = 0xff00ff00; williamr@2: const TUint32 KGMask = 0x0000ff00; williamr@2: williamr@2: //Algoriths for Premultiplied alpha screenmode/pixel format. williamr@2: williamr@2: inline TUint32 PMAPixelBlend(TUint32 aDestPixel, TUint32 aSrcPixel, TUint8 aMask) williamr@2: { williamr@2: if(aMask) williamr@2: { williamr@2: if(aMask == 0xff) // opaque, so unchanged williamr@2: { williamr@2: return aSrcPixel; williamr@2: } williamr@2: else williamr@2: { williamr@2: return PMABlend_noChecks(aDestPixel, aSrcPixel, aMask); williamr@2: } williamr@2: } williamr@2: else // completely transparent williamr@2: { williamr@2: return aDestPixel; williamr@2: } williamr@2: } williamr@2: williamr@2: inline TUint32 PMAPixelBlend(TUint32 aDestPixel, TUint32 aSrcPixel) williamr@2: { williamr@2: TUint8 mask = (TUint8)(aSrcPixel >> 24); williamr@2: return PMAPixelBlend(aDestPixel, aSrcPixel, mask); williamr@2: } williamr@2: williamr@2: inline TUint32 PMABlend_noChecks(TUint32 aDestPixel, TUint32 aSrcPixel, TUint8 aMaskingFactor) williamr@2: { williamr@2: TUint32 src_c = aSrcPixel & KRBMask; williamr@2: TUint32 dst_c = aDestPixel & KRBMask; williamr@2: const TUint32 mask = 0x0100 - aMaskingFactor; williamr@2: dst_c = (src_c + ((mask * dst_c)>>8)) & KRBMask; williamr@2: src_c = (aSrcPixel & KAGMask)>>8; williamr@2: TUint32 dst_ag = (aDestPixel & KAGMask)>>8; williamr@2: dst_c |= ((src_c + ((mask * dst_ag)>>8)) & KRBMask)<<8; williamr@2: return dst_c; williamr@2: } williamr@2: williamr@2: inline void PMABlend_noChecksInplace(TUint32& aDest_io, TUint32& aSrcPixel,TUint8& aMaskingFactor) williamr@2: { williamr@2: TUint32 src_c = aSrcPixel & KRBMask; williamr@2: TUint32 dst_ag = (aDest_io & KAGMask) >> 8; williamr@2: aDest_io = aDest_io & KRBMask; williamr@2: const TUint32 mask = 0x0100 - aMaskingFactor; williamr@2: aDest_io = (src_c + ((mask * aDest_io) >> 8)) & KRBMask; williamr@2: src_c = (aSrcPixel & KAGMask) >> 8; williamr@2: aDest_io |= ((src_c + ((mask * dst_ag) >> 8)) & KRBMask)<<8; williamr@2: } williamr@2: williamr@2: inline void PMAInplaceBlend(TUint32& aDest_io, TUint32& aSrc_in) williamr@2: { williamr@2: TUint8 mask = (TUint8)(aSrc_in >> 24); williamr@2: if(mask) williamr@2: { williamr@2: if(mask == 0xff) // opaque, so dst = src. williamr@2: { williamr@2: aDest_io = aSrc_in; williamr@2: } williamr@2: else williamr@2: { williamr@2: PMABlend_noChecksInplace(aDest_io, aSrc_in, mask); williamr@2: } williamr@2: } williamr@2: //else src completely transparent, so dst unchanged. williamr@2: } williamr@2: williamr@2: inline TUint32 NonPMA2PMAPixel(TUint32 aPixel) williamr@2: { williamr@2: TUint8 tA = (TUint8)(aPixel >> 24); williamr@2: if (tA==0) williamr@2: { williamr@2: return 0; williamr@2: } williamr@2: if (tA==0xff) williamr@2: { williamr@2: return aPixel; williamr@2: } williamr@2: williamr@2: // Use a bias value of 128 rather than 255, but also add 1/256 of the numerator williamr@2: // before dividing the sum by 256. williamr@2: williamr@2: TUint32 tap1=tA+1; williamr@2: TUint32 scaledRB = (aPixel & KRBMask) * tap1; williamr@2: TUint32 scaledG = (aPixel & KGMask ) * tap1; williamr@2: return (aPixel & 0xff000000) | ((scaledRB>>8) & KRBMask) | ((scaledG>>8)& KGMask); williamr@2: } williamr@2: williamr@2: inline TUint32 PMA2NonPMAPixel(TUint32 aPixel, const TUint16* aNormTable) williamr@2: { williamr@2: TUint8 alpha = (TUint8)(aPixel >> 24); williamr@2: if (alpha==0) williamr@2: { williamr@2: return 0; williamr@2: } williamr@2: if (alpha==0xff) williamr@2: { williamr@2: return aPixel; williamr@2: } williamr@2: TUint16 norm = aNormTable[alpha]; williamr@2: TUint32 norm_rb = (((aPixel & KRBMask) * norm) >> 8) & KRBMask; williamr@2: TUint32 norm_g = (((aPixel & KGMask ) * norm) >> 8) & KGMask; williamr@2: return ((aPixel & 0xff000000) | norm_rb | norm_g); williamr@2: } williamr@2: williamr@2: inline void Convert2PMA(TUint32& aInOutValue) williamr@2: { williamr@2: aInOutValue = NonPMA2PMAPixel(aInOutValue); williamr@2: } williamr@2: williamr@2: inline void Convert2NonPMA(TUint32& aInOutValue, const TUint16* aNormTable) williamr@2: { williamr@2: aInOutValue = PMA2NonPMAPixel(aInOutValue, aNormTable); williamr@2: }