--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/screendriver/inc/BMDRAW.H Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1467 @@
+// Copyright (c) 1997-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:
+//
+
+#ifndef __BMDRAW_H__
+#define __BMDRAW_H__
+
+#include <gdi.h>
+#include <bitdraw.h>
+#include "BitDrawScaling.h"
+#include "BitDrawOrigin.h"
+#include "BmAlphaBlend.h"
+#include "BitDrawOrientation.h"
+
+#ifdef __ARMCC__
+ #define FORCEINLINE __forceinline
+#else
+ #define FORCEINLINE inline
+#endif
+
+/**
+Outline colour index used to get percentage of outline colour to be used to get
+the final colour from lookup table
+@internalComponent
+*/
+const TInt KOutlineColorIndex = 0;
+
+/**
+Shadow colour index used to get percentage of shadow colour to be used to get
+the final colour from lookup table
+@internalComponent
+*/
+const TInt KShadowColorIndex = 1;
+
+/**
+Fill colour index used to get percentage of fill colour to be used to get
+the final colour from lookup table
+@internalComponent
+*/
+const TInt KFillColorIndex = 2;
+
+/**
+Background colour index used to get percentage of background colour to be used to get
+the final colour from lookup table
+@internalComponent
+*/
+const TInt KBackgroundColorIndex = 3;
+
+/**
+Lookup table used for outline and shadow fonts.
+@internalComponent
+*/
+GLREF_D const TInt FourColorBlendLookup[256][4];
+
+TRgb AlphaBlend(TRgb aPrimary, TRgb aSecondary, TInt aAlphaValue);
+
+ //Scaling settings. MScalingSettings interface operates with them.
+struct TScalingSettings
+ {
+ inline TScalingSettings() :
+ iFactorX(1),
+ iFactorY(1),
+ iDivisorX(1),
+ iDivisorY(1)
+ {
+ }
+ TInt iFactorX;
+ TInt iFactorY;
+ TInt iDivisorX;
+ TInt iDivisorY;
+ };
+
+ // Drawing device origin. MDrawDeviceOrigin interface operates with it.
+typedef TPoint TOrigin;
+
+//This class is used as a template argument by CDrawEightBppBitmapCommon::SetPixels()
+//and CDrawSixteenBppBitmapCommon::SetPixels()
+//Each of its methods (EvalInc() and EvalDec()) has two arguments -
+//aAddr and aValue, and it is used to set *aAddr with aValue and to increment/decrement
+//respectively aAddr.
+template <class TPixelType> class TPixelSet
+ {
+public:
+ inline void EvalInc(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr++ = aValue;
+ }
+ inline void EvalDec(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr-- = aValue;
+ }
+ };
+
+//This class is used as a template argument by CDrawEightBppBitmapCommon::XORPixels().
+//and CDrawSixteenBppBitmapCommon::XORPixels()
+//Each of its methods (EvalInc() and EvalDec()) has two arguments -
+//aAddr and aValue, and it is used to XOR *aAddr with aValue and to increment/decrement
+//respectively aAddr.
+template <class TPixelType> class TPixelXor
+ {
+public:
+ inline void EvalInc(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr++ ^= aValue;
+ }
+ inline void EvalDec(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr-- ^= aValue;
+ }
+ };
+
+//This class is used as a template argument by CDrawEightBppBitmapCommon::ANDPixels().
+//and CDrawSixteenBppBitmapCommon::ANDPixels()
+//Each of its methods (EvalInc() and EvalDec()) has two arguments -
+//aAddr and aValue, and it is used to AND *aAddr with aValue and to increment/decrement
+//respectively aAddr.
+template <class TPixelType> class TPixelAnd
+ {
+public:
+ inline void EvalInc(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr++ &= aValue;
+ }
+ inline void EvalDec(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr-- &= aValue;
+ }
+ };
+
+//This class is used as a template argument by CDrawEightBppBitmapCommon::ORPixels().
+//and CDrawSixteenBppBitmapCommon::ORPixels()
+//Each of its methods (EvalInc() and EvalDec()) has two arguments -
+//aAddr and aValue, and it is used to OR *aAddr with aValue and to increment/decrement
+//respectively aAddr.
+template <class TPixelType> class TPixelOr
+ {
+public:
+ inline void EvalInc(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr++ |= aValue;
+ }
+ inline void EvalDec(TPixelType*& aAddr, TPixelType aValue) const
+ {
+ *aAddr-- |= aValue;
+ }
+ };
+
+//This template function should be used every time when a rectangle has to be drawn instead of
+//a single pixel in EColor256/EColor64K scaled device.
+//aPixelPtr - points to the pixel memory address, which contains top-left corner of the rectangle.
+//aValue - the pixel value - EColor256.
+//aPixelPtrRowLimit - the right end address of the scalline.
+//aBitsStart - beginning address of the pixel memory.
+//aBitsEnd - end address of the pixel memory.
+//aLongWidth - aligned scanline width in pixels.
+//aFx - X-axis scaling factor.
+//aFy - Y-axis scaling factor.
+//aOrientation - device's orientation.
+//aOp - the operation, which must be applied to every pixel from the rectangle - template parameter.
+template <class TPixelOp, class TPixelType>
+inline void FillScaledRect(TPixelType* aPixelPtr,
+ const TPixelType aValue,
+ const TPixelType* aPixelPtrRowLimit,
+ const TPixelType* aBitsStart,
+ const TPixelType* aBitsEnd,
+ const TInt aLongWidth,
+ TInt aFx,
+ TInt aFy,
+ const CFbsDrawDevice::TOrientation aOrientation,
+ const TPixelOp& aOp)
+ {
+ if(aOrientation == CFbsDrawDevice::EOrientationNormal)
+ {
+ //for example: if aFx = 3 and aFy = 2 then
+ //the following pixel values have to be evaluated:
+ // (aPixelPtr), (aPixelPtr + 1), (aPixelPtr + 2)
+ // (aPixelPtr + aLongWidth), (aPixelPtr + 1 + aLongWidth), (aPixelPtr + 2 + aLongWidth)
+ const TPixelType* nextStop = aPixelPtr + aFx;//the address of next scaled pixel value
+ if(nextStop > aPixelPtrRowLimit)
+ {//If the address is after the end of the current row, set it to the end of row.
+ nextStop = aPixelPtrRowLimit;
+ }
+ do //Fill pixel rectangle [aFx,aFy]
+ {
+ while(aPixelPtr < nextStop)
+ {//Fill a row of up to aFx pixels.
+ aOp.EvalInc(aPixelPtr, aValue);
+ }
+ aPixelPtr += (aLongWidth - aFx);//Move aPixelPtr to the next row
+ if(aPixelPtr >= aBitsEnd)
+ {//If aPixelPtr points after the end of video memory - stop the operation!
+ break;
+ }
+ nextStop += aLongWidth;//Move nextPixelAddr to the next row
+ }
+ while(--aFy);
+ return;
+ }
+ if(aOrientation == CFbsDrawDevice::EOrientationRotated90)
+ {
+ //for example: if aFy = 3 and aFx = 2 then
+ //the following pixel values have to be evaluated:
+ // (aPixelPtr), (aPixelPtr - 1),
+ // (aPixelPtr + aLongWidth), (aPixelPtr - 1 + aLongWidth),
+ // (aPixelPtr + 2 * aLongWidth), (aPixelPtr - 1 + 2 * aLongWidth),
+ const TPixelType* pixelPtrPrevRowLimit = aPixelPtrRowLimit - aLongWidth;
+ const TPixelType* nextStop = aPixelPtr - aFx;//the address of next scaled pixel value
+ if(nextStop < pixelPtrPrevRowLimit)
+ {//If the address is before the beginning of the current row, set it to the beginning of row.
+ nextStop = pixelPtrPrevRowLimit;
+ }
+ do //Fill pixel rectangle [aFx,aFy]
+ {
+ while(aPixelPtr > nextStop)
+ {//Fill a row of up to aFy pixels.
+ aOp.EvalDec(aPixelPtr, aValue);
+ }
+ aPixelPtr += (aLongWidth + aFx);//Move aPixelPtr to the next row
+ if(aPixelPtr >= aBitsEnd)
+ {//If aPixelPtr points after the end of video memory - stop the operation!
+ break;
+ }
+ nextStop += aLongWidth;//Move nextPixelAddr to the next row
+ }
+ while(--aFy);
+ return;
+ }
+ if(aOrientation == CFbsDrawDevice::EOrientationRotated180)
+ {
+ //for example: if aFx = 3 and aFy = 2 then
+ //the following pixel values have to be evaluated:
+ // (aPixelPtr), (aPixelPtr - 1), (aPixelPtr - 2)
+ // (aPixelPtr - aLongWidth), (aPixelPtr + 1 - aLongWidth), (aPixelPtr + 2 - aLongWidth)
+ const TPixelType* pixelPtrPrevRowLimit = aPixelPtrRowLimit - aLongWidth;
+ const TPixelType* nextStop = aPixelPtr - aFx;//the address of next scaled pixel value
+ if(nextStop < pixelPtrPrevRowLimit)
+ {//If the address is before the beginning of the current row, set it to the beginning of row.
+ nextStop = pixelPtrPrevRowLimit;
+ }
+ do //Fill pixel rectangle [aFx,aFy]
+ {
+ while(aPixelPtr > nextStop)
+ {//Fill a row of up to aFx pixels.
+ aOp.EvalDec(aPixelPtr, aValue);
+ }
+ aPixelPtr -= (aLongWidth - aFx);//Move aPixelPtr to the prev row
+ if(aPixelPtr < aBitsStart)
+ {//If aPixelPtr points before the beginning of video memory - stop the operation!
+ break;
+ }
+ nextStop -= aLongWidth;//Move nextPixelAddr to the prev row
+ }
+ while(--aFy);
+ return;
+ }
+ else //if(aOrientation == CFbsDrawDevice::EOrientationRotated270)
+ {
+ //for example: if aFy = 3 and aFx = 2 then
+ //the following pixel values have to be evaluated:
+ // (aPixelPtr), (aPixelPtr + 1)
+ // (aPixelPtr - aLongWidth), (aPixelPtr + 1 - aLongWidth)
+ // (aPixelPtr - 2 * aLongWidth), (aPixelPtr + 1 - 2 * aLongWidth)
+ const TPixelType* nextStop = aPixelPtr + aFx;//the address of next scaled pixel value
+ if(nextStop > aPixelPtrRowLimit)
+ {//If the address is after the end of the current row, set it to the end of row.
+ nextStop = aPixelPtrRowLimit;
+ }
+ do //Fill pixel rectangle [aFx,aFy]
+ {
+ while(aPixelPtr < nextStop)
+ {//Fill a row of up to aFy pixels.
+ aOp.EvalInc(aPixelPtr, aValue);
+ }
+ aPixelPtr += (-aLongWidth - aFx);//Move aPixelPtr to the prev row
+ if(aPixelPtr < aBitsStart)
+ {//If aPixelPtr points befor the beginning of video memory - stop the operation!
+ break;
+ }
+ nextStop -= aLongWidth;//Move nextPixelAddr to the prev row
+ }
+ while(--aFy);
+ return;
+ }
+ }
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawBitmap) : public CFbsDrawDevice,
+ public MScalingSettings,
+ public MDrawDeviceOrigin,
+ public MAlphaBlend,
+ public MOutlineAndShadowBlend,
+ public MDrawDeviceOrientation,
+ public MFastBlend
+ {
+public:
+ virtual ~CDrawBitmap();
+ // From CFbsDrawDevice
+ virtual TDisplayMode DisplayMode() const { return iDispMode; }
+ virtual TInt LongWidth() const;
+ virtual void MapColors(const TRect& aRect,const TRgb* aColors,TInt aNumPairs,TBool aMapForwards);
+ virtual TRgb ReadPixel(TInt aX,TInt aY) const;
+ virtual void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer,TDisplayMode aDispMode) const;
+ virtual TUint32* ScanLineBuffer() const;
+ virtual TInt ScanLineBytes() const;
+ virtual TDisplayMode ScanLineDisplayMode() const { return iDispMode; }
+ virtual TSize SizeInPixels() const;
+ virtual TInt HorzTwipsPerThousandPixels() const { return 0; }
+ virtual TInt VertTwipsPerThousandPixels() const { return 0; }
+ virtual void OrientationsAvailable(TBool aOrientation[4]);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLine(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode,TBool aUp);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer ,CGraphicsContext::TDrawMode);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor,CGraphicsContext::TDrawMode);
+ virtual void SetBits(TAny* aBits);
+ virtual void SetDitherOrigin(const TPoint& aPoint);
+ virtual void SetShadowMode(TShadowMode aShadowMode) { iShadowMode = aShadowMode; }
+ virtual void SetFadingParameters(TUint8 aBlackMap,TUint8 aWhiteMap);
+ virtual void SetUserDisplayMode(TDisplayMode aDisplayMode) { iUserDispMode = aDisplayMode; }
+ virtual TBool SetOrientation(TOrientation aOrientation);
+ virtual void WriteRgbAlphaLine(TInt aX,TInt aY,TInt aLength,
+ TUint8* aRgbBuffer, TUint8* aMaskBuffer,
+ CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteRgbAlphaLine(TInt aX,TInt aY,TInt aLength,
+ const TUint8* aRgbBuffer1,
+ const TUint8* aBuffer2,
+ const TUint8* aMaskBuffer,
+ CGraphicsContext::TDrawMode aDrawMode);
+ virtual TInt GetInterface(TInt aInterfaceId, TAny*& aInterface);
+ virtual void GetDrawRect(TRect& aDrawRect) const;
+ virtual void SwapWidthAndHeight();
+ // From MScalingSettings
+ virtual TInt Set(TInt aFactorX, TInt aFactorY, TInt aDivisorX, TInt aDivisorY);
+ virtual void Get(TInt& aFactorX, TInt& aFactorY, TInt& aDivisorX, TInt& aDivisorY);
+ virtual TBool IsScalingOff();
+ // From MDrawDeviceOrigin
+ virtual TInt Set(const TPoint& aOrigin);
+ virtual void Get(TPoint& aOrigin);
+ // From MDrawDeviceOrientation
+ virtual CFbsDrawDevice::TOrientation Orientation();
+ // From MFastBlend
+ virtual TInt FastBlendBitmap(const TPoint& aDest,CFbsDrawDevice* aSrcDrawDevice, const TRect& aSrcRect, CGraphicsContext::TDrawMode aDrawMode, TInt aShadowMode);
+ virtual TInt FastBlendBitmap(const TPoint& aDest,const TUint32* aSrcBase, TInt aSrcStride, const TSize& aSrcSize, const TRect& aSrcRect, TDisplayMode aDisplayMode, CGraphicsContext::TDrawMode aDrawMode, TInt aShadowMode);
+ virtual TInt FastBlendBitmapMasked(const TPoint& aDest, const TUint32* aSrcBase, TInt aSrcStride,
+ const TSize& aSrcSize, const TRect& aSrcRect, TDisplayMode aSrcDisplayMode,
+ const TUint32* aMaskBase, TInt aMaskStride, TDisplayMode aMaskDisplayMode, const TSize &aMaskSize,const TPoint &aMaskSrcPos,TBool aInvertMask,
+ CGraphicsContext::TDrawMode aDrawMode, TInt aShadowMode);
+ virtual TInt FastBlendBitmapScaled(const TRect &aClipRect, const TRect& aDest, const TRect& aSrcRect, const TUint32 *aSrcBase, TInt aSrcLinePitch, TDisplayMode aSrcDisplayMode, const TSize &aSrcSize, CGraphicsContext::TDrawMode aDrawMode, TInt aShadowMode);
+ virtual TInt FastBlendBitmapMaskedScaled(const TRect &aClipRect, const TRect& aDest,
+ const TRect& aSrcRect, const TUint32 *aSrcBase, TInt aSrcLinePitch,
+ TDisplayMode aSrcDisplayMode, const TSize &aSrcSize,
+ const TUint32* aMaskBase, TInt aMaskStride, TDisplayMode aMaskDisplayMode, const TSize &aMaskSize,TBool aInvertMask,
+ CGraphicsContext::TDrawMode aDrawMode, TInt aShadowMode);
+protected:
+ CDrawBitmap();
+ static TInt BitsPerPixel(TDisplayMode aDispMode);
+ void Clear();
+ void CopyOldSettings(CFbsDrawDevice* aDrawDevice);
+ void DeOrientate(TInt& aX,TInt& aY) const;
+ TPoint DeOrientate(const TPoint& aPoint) const;
+ TRect DeOrientate(const TRect& aRect) const;
+ virtual void Shadow(TRgb& aColor) = 0;
+ TRgb FadeRgb(TRgb aColor);
+ TUint32 FadeRgb(TUint32 aColor);
+ void FadeRgb(TInt& aRed, TInt& aGreen, TInt& aBlue);
+ TUint8 FadeGray(TInt aGray256);
+ TUint32 Hash(TUint32 aValue,TInt aX,TInt aY) const;
+ TUint32 PasteInt(TUint32 aFirst,TUint32 aSecond,TInt aOffset) const;
+ static TAny* CopyOffset(TAny* aDestination,const TAny* aSource,TInt aWordsToCopy,TInt aSourceBitOffset);
+ static void ReadLineCommon(TUint32* aPixelPtr,TUint32* aBufferPtr,TInt aWordsCnt,TInt aRestPixels,TInt aBytesCnt,TInt aStartDiffBits);
+ virtual void SetSize(const TSize& aSize);
+ // Scaling related
+ TBool CanBeScaled() const;
+ TInt PixelAddressIncrement() const;
+ TInt LogicalPixelAddressIncrement() const;
+ void SetPixelInc(TInt& aPixelInc, TInt& aRowInc) const;
+ void IncScaledY(TInt& aY) const;
+ void IncScaledY(TInt& aY, TInt aYOrg) const;
+ //Generic set pixels operations, has to be defined here to make it compiled in VC++6.0
+ template <class TPixelType>
+ void SetPixels(TPixelType* aPixelPtr, TPixelType aValue, const TPixelType* aPixelPtrRowLimit,
+ const TPixelType* aBitsStart, const TPixelType* aBitsEnd) const
+ {
+ TPixelSet<TPixelType> op;
+ ::FillScaledRect(aPixelPtr, aValue, aPixelPtrRowLimit, aBitsStart, aBitsEnd, iLongWidth,
+ iScalingSettings.iFactorX, iScalingSettings.iFactorY, iOrientation, op);
+ }
+ template <class TPixelType>
+ void XORPixels(TPixelType* aPixelPtr, TPixelType aValue, const TPixelType* aPixelPtrRowLimit,
+ const TPixelType* aBitsStart, const TPixelType* aBitsEnd) const
+ {
+ TPixelXor<TPixelType> op;
+ ::FillScaledRect(aPixelPtr, aValue, aPixelPtrRowLimit, aBitsStart, aBitsEnd, iLongWidth,
+ iScalingSettings.iFactorX, iScalingSettings.iFactorY, iOrientation, op);
+ }
+ template <class TPixelType>
+ void ANDPixels(TPixelType* aPixelPtr, TPixelType aValue, const TPixelType* aPixelPtrRowLimit,
+ const TPixelType* aBitsStart, const TPixelType* aBitsEnd) const
+ {
+ TPixelAnd<TPixelType> op;
+ ::FillScaledRect(aPixelPtr, aValue, aPixelPtrRowLimit, aBitsStart, aBitsEnd, iLongWidth,
+ iScalingSettings.iFactorX, iScalingSettings.iFactorY, iOrientation, op);
+ }
+ template <class TPixelType>
+ void ORPixels(TPixelType* aPixelPtr, TPixelType aValue, const TPixelType* aPixelPtrRowLimit,
+ const TPixelType* aBitsStart, const TPixelType* aBitsEnd) const
+ {
+ TPixelOr<TPixelType> op;
+ ::FillScaledRect(aPixelPtr, aValue, aPixelPtrRowLimit, aBitsStart, aBitsEnd, iLongWidth,
+ iScalingSettings.iFactorX, iScalingSettings.iFactorY, iOrientation, op);
+ }
+ //Origin related
+ TBool CanOriginBeMoved() const;
+ void MapColorToUserDisplayMode(TInt& red,TInt& green,TInt& blue);
+protected:
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer) = 0;
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const = 0;
+ virtual void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const = 0;
+ virtual TUint32* ScanLine(TInt aY) const;
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor) = 0;
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor) = 0;
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor) = 0;
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer) = 0;
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer) = 0;
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer) = 0;
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor) = 0;
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor) = 0;
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode) = 0;
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp) = 0;
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor) = 0;
+ virtual void BlendRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer) = 0;
+ virtual void BlendLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& /*aColor*/) {}
+ virtual void MapBufferToUserDisplayMode(TInt /*aLength*/,TUint32* /*aBuffer*/) {}
+private:
+ void GetBlendPosAndRect(TRect &aSrcRect, const TRect &aSrcRectIn, const TSize &aSrcSize, const TPoint &aDestOffset);
+ void GetBlendPosAndRect(TRect &aDstRect, TRect &aSrcRect, const TRect &aDestRectIn, const TRect &aSrcRectIn, const TSize &aSrcSize);
+ TBool FastBlendSupported(TDisplayMode aSrcDisplayMode, CGraphicsContext::TDrawMode aDrawMode, TInt aShadowMode, TInt aSrcLinePitch);
+ TBool FastBlendMaskSupported(TDisplayMode aMaskDisplayMode, TInt aMaskStride);
+ void DoCopyOldSettings(CFbsDrawDevice* aDrawDevice);
+ TInt DoFastBlendBitmap(const TPoint &aDest, const TRect& aSrcRect, const TUint8 *aSrcBase, TInt aSrcLinePitch, TDisplayMode aSrcDisplayMode, const TSize &aSrcSize);
+ // Scaling related
+ void InitLogicalCoordinates();
+ void PreWriteRgb(TInt& aWidth, TInt& aHeight, TInt& aX, TInt& aY, CGraphicsContext::TDrawMode aDrawMode);
+ void WriteRgb(TInt& aWidth, TInt& aHeight, TInt& aX, TInt& aY, TRgb aColor, CGraphicsContext::TDrawMode aDrawMode);
+ void SetDefaults();
+ inline TInt Origin(TInt aPhysOrg, TInt aScale) const;
+ inline TInt OtherSide(TInt aPhysOrg, TInt aPhysSize, TInt aScale) const;
+protected:
+ TDisplayMode iDispMode;
+ TInt iLongWidth; // aligned scanline width in pixels
+ TPoint iDitherOrigin;
+ TUint32* iScanLineBuffer;
+ TInt iScanLineWords;
+ TShadowMode iShadowMode;
+ TSize iSize; // (0, 0, iSize.iWidth, iSize.iHeight) - drawing rectangle - physical coordinates
+ TUint32* iBits;
+ TDisplayMode iUserDispMode;
+ TOrientation iOrientation; // 0, 90, 180, 270 degrees
+ TInt iFadeMapFactor;
+ TInt iFadeMapOffset;
+ TScalingSettings iScalingSettings; // X-axis and Y-axis scaling factors
+ TOrigin iOrigin; // drawing device origin
+ TBool iScalingOff; // ETrue, if the scaling is off.
+ TBool iOriginIsZero; // ETrue, if the origin is (0, 0).
+ TRect iDrawRect; // drawing rectangle - logical coordinates
+ MAlphaBlend* iAlphaBlend; // Alphablending interface
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawOneBppBitmap) : public CDrawBitmap
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+protected:
+ virtual void SetSize(const TSize& aSize);
+ virtual void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ virtual void Shadow(TRgb& aColor);
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+private:
+ TUint32 ColorWord(TRgb aColor) const;
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawTwoBppBitmap) : public CDrawBitmap
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ TUint32 ColorInt(TRgb aColor) const;
+ void HashInt(TUint32& aInt1,TUint32& aInt2,TRgb aColor,TInt aX,TInt aY) const;
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ void MapColors(const TRect& aRect,const TRgb* aColors,TInt aNumPairs,TBool aMapForwards);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+protected:
+ virtual void SetSize(const TSize& aSize);
+ TUint32 MapInt(TUint32 aInt,TUint32* aColorMap) const;
+ virtual void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ virtual void Shadow(TRgb& aColor);
+ TUint32 ShadowWord(TUint32 aWord);
+ TUint32 FadeWord(TUint32 aWord);
+ void ShadeBuffer(TInt aLength,TUint32* aBuffer);
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawFourBppBitmapGray) : public CDrawBitmap
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ TUint32 ColorInt(TRgb aColor) const;
+ TUint32 HashInt(TRgb aColor,TInt aX,TInt aY) const;
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+protected:
+ virtual void SetSize(const TSize& aSize);
+ void DitherBuffer(TInt x,TInt y,TInt aLength,TUint32* aBuffer);
+ virtual void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ virtual void Shadow(TRgb& aColor);
+ TUint8 ShadowAndFadeGray16(TInt aGray16);
+ TUint32 FadeWord(TUint32 aWord);
+ void ShadeBuffer(TInt aLength,TUint32* aBuffer);
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+ TRgb BlendFourColors(TUint32 aOutlinePenColor, TUint32 aShadowColor, TUint32 aFillColor,
+ TInt aRedOutlinePenColor,TInt aRedShadowColor,TInt aRedFillColor,
+ TInt aGreenOutlinePenColor, TInt aGreenShadowColor, TInt aGreenFillColor,
+ TInt aBlueOutlinePenColor, TInt aBlueShadowColor, TInt aBlueFillColor,
+ TRgb aBackgroundColor, TUint8 aIndex) const;
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawFourBppBitmapColor) : public CDrawBitmap
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ TUint32 ColorInt(TRgb aColor) const;
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+protected:
+ virtual void SetSize(const TSize& aSize);
+ virtual void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ virtual void Shadow(TRgb& aColor);
+ TUint32 ShadowWord(TUint32 aWord);
+ TUint32 FadeWord(TUint32 aWord);
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+ TRgb BlendFourColors(TUint32 aOutlinePenColor, TUint32 aShadowColor, TUint32 aFillColor,
+ TInt aRedOutlinePenColor,TInt aRedShadowColor,TInt aRedFillColor,
+ TInt aGreenOutlinePenColor, TInt aGreenShadowColor, TInt aGreenFillColor,
+ TInt aBlueOutlinePenColor, TInt aBlueShadowColor, TInt aBlueFillColor,
+ TRgb aBackgroundColor, TUint8 aIndex) const;
+ };
+
+const TInt KInvalidValue = 0xABCDABCD;
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawEightBppBitmapCommon) : public CDrawBitmap, public MFastBlit2
+ {
+public:
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual TInt GetInterface(TInt aInterfaceId, TAny*& aInterface);
+ // From MFastBlit2
+ virtual TInt WriteBitmapBlock(const TPoint& aDest,
+ CFbsDrawDevice* aSrcDrawDevice,
+ const TRect& aSrcRect);
+ virtual TInt WriteBitmapBlock(const TPoint& aDest,
+ const TUint32* aSrcBase,
+ TInt aSrcStride,
+ const TSize& aSrcSize,
+ const TRect& aSrcRect);
+ virtual const TUint32* Bits() const;
+protected:
+ virtual void SetSize(const TSize& aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ TUint8* PixelAddress(TInt aX,TInt aY) const;
+ void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TUint8 aPixel);
+ void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TUint8 aPixel,CGraphicsContext::TDrawMode aDrawMode);
+ void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TUint8 aPixel,TBool aUp);
+ void WriteRgb(TInt aX,TInt aY,TUint8 aPixel);
+ void WriteRgbMulti(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint8 aPixel);
+ void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint8 aPixel);
+ void WriteRgbMultiAND(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint8 aPixel);
+ void WriteRgbMultiOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint8 aPixel);
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawEightBppBitmapGray) : public CDrawEightBppBitmapCommon
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+protected:
+ virtual void Shadow(TRgb& aColor);
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+ TUint8 ShadowAndFade(TInt aGray256);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawEightBppBitmapColor) : public CDrawEightBppBitmapCommon
+ {
+public:
+ ~CDrawEightBppBitmapColor();
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual TInt SetCustomPalette(const CPalette* aPalette);
+ virtual TInt GetCustomPalette(CPalette*& aPalette);
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+protected:
+ TUint8 ColorToIndex(TRgb aColor) const;
+ TRgb IndexToColor(TInt aIndex) const;
+ virtual void Shadow(TRgb& aColor);
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+protected:
+ TRgb* iPalette;
+ TUint8* iColor4KIndex;
+ TUint8* iShadowIndex;
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawSixteenBppBitmapCommon) : public CDrawBitmap, public MFastBlit2
+ {
+public:
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint16 aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint16 aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint16 aColor);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TUint16 aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TUint16 aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TUint16 aColor,TBool aUp);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aLength,TInt aHeight,TUint16 aColor);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual TInt GetInterface(TInt aInterfaceId, TAny*& aInterface);
+ // From MFastBlit2
+ virtual TInt WriteBitmapBlock(const TPoint& aDest,
+ CFbsDrawDevice* aSrcDrawDevice,
+ const TRect& aSrcRect);
+ virtual TInt WriteBitmapBlock(const TPoint& aDest,
+ const TUint32* aSrcBase,
+ TInt aSrcStride,
+ const TSize& aSrcSize,
+ const TRect& aSrcRect);
+ virtual const TUint32* Bits() const;
+protected:
+ virtual void SetSize(const TSize& aSize);
+ TUint16* PixelAddress(TInt aX,TInt aY) const;
+ virtual void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ virtual TUint16 ShadowIndex(TUint16 aColor64KIndex) = 0;
+ virtual TUint16 FadeIndex(TUint16 aColor4KIndex) = 0;
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawTwelveBppBitmap) : public CDrawSixteenBppBitmapCommon
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+protected:
+ virtual void Shadow(TRgb& aColor);
+ virtual TUint16 ShadowIndex(TUint16 aColor4KIndex);
+ virtual TUint16 FadeIndex(TUint16 aColor4KIndex);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawSixteenBppBitmap) : public CDrawSixteenBppBitmapCommon
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ FORCEINLINE void MapColorToUserDisplayMode(TUint16& aColor64K);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+ virtual void BlendRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+protected:
+ virtual void Shadow(TRgb& aColor);
+ FORCEINLINE void Shadow(TInt& aRed, TInt& aGreen, TInt& aBlue);
+ FORCEINLINE void Shadow(TUint16& a64KColor);
+ virtual TUint16 ShadowIndex(TUint16 aColor64KIndex);
+ FORCEINLINE void ShadowIndex(TInt& aRed, TInt& aGreen, TInt& aBlue);
+ virtual TUint16 FadeIndex(TUint16 aColor64KIndex);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ };
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawTwentyFourBppBitmap) : public CDrawBitmap
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual void Shadow(TRgb& aColor);
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+ void BlendRgbMulti(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+protected:
+ virtual void SetSize(const TSize& aSize);
+ TUint8* PixelAddress(TInt aX,TInt aY) const;
+ TInt PixelAddressIncrement() const;
+ void PixelAddressIncrement(TInt& aPixelInc,TInt& aRowInc) const;
+ void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+ TUint8 ShadowComponent(TInt aRgbComponent);
+ TUint8 FadeComponent(TInt aRgbComponent);
+ TUint8 ShadowAndFade(TInt aComponent);
+private:
+ FORCEINLINE void FadeRgb(TInt& red,TInt& green,TInt& blue);
+ FORCEINLINE void Shadow(TInt& red,TInt& green,TInt& blue);
+ FORCEINLINE TUint8 ShadowComponentInl(TInt aRgbComponent);
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+protected:
+ TInt iScanLineBytes;
+ };
+
+inline TUint8* CDrawTwentyFourBppBitmap::PixelAddress(TInt aX,TInt aY) const
+ {
+ return ((TUint8*)iBits) + (aY * iScanLineBytes) + (aX * 3);
+ }
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawThirtyTwoBppBitmapCommon) : public CDrawBitmap, public MFastBlit2
+ {
+public:
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual void Shadow(TRgb& aColor);
+ virtual void Shadow(TUint32& aColor);
+ virtual void InvertBuffer(TInt aLength,TUint32* aBuffer);
+ virtual TRgb ReadRgbNormal(TInt aX,TInt aY) const;
+ virtual void ShadowArea(const TRect& aRect);
+ virtual void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ virtual void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteBinaryOp(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode);
+ virtual void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineXOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineAND(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteLineOR(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ virtual void WriteRgbMulti(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbMultiXOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbMultiAND(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbMultiOR(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ virtual void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ virtual void MapColorToUserDisplayMode(TRgb& aColor);
+ virtual void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+ virtual TInt GetInterface(TInt aInterfaceId, TAny*& aInterface);
+ // From MFastBlit2
+ virtual TInt WriteBitmapBlock(const TPoint& aDest,
+ CFbsDrawDevice* aSrcDrawDevice,
+ const TRect& aSrcRect);
+ virtual TInt WriteBitmapBlock(const TPoint& aDest,
+ const TUint32* aSrcBase,
+ TInt aSrcStride,
+ const TSize& aSrcSize,
+ const TRect& aSrcRect);
+ virtual const TUint32* Bits() const;
+protected:
+ virtual TUint32 Color(const TRgb& aColor) = 0;
+ virtual TRgb RgbColor(TUint32 aColor) const = 0;
+ virtual void SetSize(const TSize& aSize);
+ FORCEINLINE TUint32* PixelAddress(TInt aX,TInt aY) const;
+ FORCEINLINE TInt PixelAddressIncrement() const;
+ void ReadLine(TInt aX,TInt aY,TInt aLength,TAny* aBuffer) const;
+ void ShadowBuffer(TInt aLength,TUint32* aBuffer);
+ FORCEINLINE TUint8 ShadowComponent(TInt aRgbComponent);
+ TUint8 FadeComponent(TInt aRgbComponent);
+ TUint8 ShadowAndFade(TInt aComponent);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ };
+
+FORCEINLINE TUint32* CDrawThirtyTwoBppBitmapCommon::PixelAddress(TInt aX,TInt aY) const
+ {
+ return iBits + aY * iScanLineWords + aX;
+ }
+
+FORCEINLINE TInt CDrawThirtyTwoBppBitmapCommon::PixelAddressIncrement() const
+ {
+ switch (iOrientation)
+ {
+ case EOrientationNormal:
+ return 1;
+ case EOrientationRotated90:
+ return iScanLineWords;
+ case EOrientationRotated180:
+ return -1;
+ case EOrientationRotated270:
+ return -iScanLineWords;
+ default:
+ return 1;
+ }
+ }
+
+
+/**
+@publishedPartner
+*/
+NONSHARABLE_CLASS(CDrawUTwentyFourBppBitmap) : public CDrawThirtyTwoBppBitmapCommon, MFastBlit
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ virtual TDisplayMode ScanLineDisplayMode() const { return EColor16MAP; }
+ virtual void ReadLine(TInt aX, TInt aY, TInt aLength, TAny* aBuffer, TDisplayMode aDispMode) const;
+ virtual TInt GetInterface(TInt aInterfaceId, TAny*& aInterface);
+ // From MFastBlit
+ virtual void WriteAlphaLineEx(TInt aX,
+ TInt aY,
+ TInt aLength,
+ TInt aSrcX,
+ const TUint32* aSrcPtr,
+ TDisplayMode aSrcFormat,
+ TInt aMaskX,
+ const TUint32* aMaskPtr,
+ MAlphaBlend::TShadowing aShadowing);
+ virtual void WriteMaskLineEx(TInt aX,
+ TInt aY,
+ TInt aLength,
+ TInt aSrcX,
+ const TUint32* aSrcPtr,
+ TDisplayMode aSrcFormat,
+ TInt aMaskX,
+ const TUint32* aMaskPtr,
+ TBool aInvertMask);
+ void BlendRgbMulti(TInt aX,TInt aY,TInt aLength,TInt aHeight,TRgb aColor);
+ void BlendLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+protected:
+ virtual TUint32 Color(const TRgb& aColor);
+ virtual TRgb RgbColor(TUint32 aColor) const;
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ };
+
+
+/**
+@publishedPartner
+*/
+class CDrawThirtyTwoBppBitmapAlpha : public CDrawThirtyTwoBppBitmapCommon
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ // from CDrawThirtyTwoBppBitmap
+ void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ void MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer);
+ void BlendRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ void BlendLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ void ShadowArea(const TRect& aRect);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+protected:
+ virtual TUint32 Color(const TRgb& aColor);
+ virtual TRgb RgbColor(TUint32 aColor) const;
+ using CDrawThirtyTwoBppBitmapCommon::Shadow;
+ void Shadow(TUint32& aColor);
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ };
+
+
+/**
+@publishedPartner
+*/
+class CDrawThirtyTwoBppBitmapAlphaPM : public CDrawThirtyTwoBppBitmapCommon
+ {
+public:
+ TInt Construct(TSize aSize);
+ TInt Construct(TSize aSize, TInt aStride);
+ // from CDrawThirtyTwoBppBitmap
+ void WriteRgb(TInt aX,TInt aY,TRgb aColor);
+ void WriteBinary(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TInt aHeight,TRgb aColor);
+ void WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aBuffer,TInt aLength,TRgb aColor,TBool aUp);
+ void WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer);
+ void BlendRgbMulti(TInt aX,TInt aY,TInt aWidth,TInt aLength,TRgb aColor);
+ void BlendLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer);
+ void ShadowArea(const TRect& aRect);
+ virtual void WriteLine(TInt aX,TInt aY,TInt aLength,TUint32* aBuffer,
+ CGraphicsContext::TDrawMode aDrawMode);
+ // From MOutlineAndShadowBlend
+ virtual TInt WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
+ TUint32 aOutlinePenColor, TUint32 aShadowColor,
+ TUint32 aFillColor, const TUint8* aDataBuffer);
+protected:
+ virtual TUint32 Color(const TRgb& aColor);
+ virtual TRgb RgbColor(TUint32 aColor) const;
+private:
+ virtual void WriteRgbAlphaLine(TInt aX,
+ TInt aY,
+ TInt aLength,
+ const TUint8* aRgbBuffer,
+ const TUint8* aMaskBuffer,
+ MAlphaBlend::TShadowing aShadowing,
+ CGraphicsContext::TDrawMode aDrawMode);
+ };
+
+
+
+#include "CoordTransformation.inl"
+
+/** DO NOT have a declaration as the compiler will think the source is in the .cpp and make this non-inline
+
+ Made a global inline to force the compiler to inline so as to gain performance.
+ A member inlines are not guarenteed to be inline.
+
+ ASSERT Primary Color >= 0 && Primary Color <= 255
+ If <0 or >255, after a shift right of 8-bits should prove true.
+ 00000001 00000000 = 256 >> 8 = 00000000 00000001 = TRUE
+ 11111111 11111111 = -1 >> 8 = 00000000 11111111 = TRUE
+ 00000000 11111111 = 255 >> 8 = 00000000 00000000 = FALSE
+
+
+ Initial AlphaValue = 0...1.0
+
+ R = APs + (1 - A)Pd ...so if A=0 the destination pixel is more dominant
+ and if A=1 the sourec pixel is more dominant
+
+ re-adjusting...
+
+ R = APs + Pd - APd
+
+ R = A(Ps-Pd) + Pd
+
+ Passed-in AlphaValue = 0...255
+ AlphaValue = 257 * Passed-in AlphaValue = 0...65536
+
+ NOTE: AlphaValue is now a 16-bit number. the colours are 8-bit, so we shouldn't
+ have overflow problems.
+ NOTE: Negative values (Ps-Pd) shouldn't be a problem as the shifting right of
+ signed values duplicates the signed bit in the msb.
+
+ R = A(Ps-Pd) + Pd
+ --------
+ 65536
+
+ R = (A(Ps-Pd)) >> 16) + Pd
+*/
+inline TRgb AlphaBlend(TInt aPrimaryRed, TInt aPrimaryGreen, TInt aPrimaryBlue, TInt aSecondaryRed,
+ TInt aSecondaryGreen, TInt aSecondaryBlue, TInt aAlphaValue)
+ {
+ __ASSERT_DEBUG(!(aPrimaryRed>>8) && !(aPrimaryGreen>>8) && !(aPrimaryBlue>>8) && !(aAlphaValue>>8) &&
+ !(aSecondaryRed>>8) && !(aSecondaryGreen>>8) && !(aSecondaryBlue>>8),
+ Panic(EScreenDriverPanicAlphaBlendInvariant));
+
+ const TInt alphaValue = aAlphaValue * 257;
+ return TRgb(((alphaValue * (aPrimaryRed - aSecondaryRed)) >> 16) + aSecondaryRed,
+ ((alphaValue * (aPrimaryGreen - aSecondaryGreen)) >> 16) + aSecondaryGreen,
+ ((alphaValue * (aPrimaryBlue - aSecondaryBlue)) >> 16) + aSecondaryBlue);
+ }
+
+inline TRgb AlphaBlend(TInt aPrimaryRed,TInt aPrimaryGreen,TInt aPrimaryBlue,TRgb aSecondary,TInt aAlphaValue)
+ {
+ return AlphaBlend(aPrimaryRed,aPrimaryGreen,aPrimaryBlue,aSecondary.Red(), aSecondary.Green(), aSecondary.Blue(), aAlphaValue);
+ }
+
+/**
+It unpacks the 16 bit colour in to the red, green and blue colour components.
+@param aColor64K The 16 bit colour which needs to be unpacked.
+@param aRed Red component of aColor64K is returned into this.
+@param aGreen Green component of aColor64K is returned into this.
+@param aBlue Blue component of aColor64K is returned into this.
+*/
+FORCEINLINE void UnpackColor64K(TUint16 aColor64K, TInt& aRed, TInt& aGreen, TInt& aBlue)
+ {
+ aRed = (aColor64K&0xF800)>>8;
+ aRed += aRed>>5;
+ aGreen = (aColor64K&0x07E0)>>3;
+ aGreen += aGreen>>6;
+ aBlue = (aColor64K&0x001F)<<3;
+ aBlue += aBlue>>5;
+ }
+
+/**
+It creates the 16 bit colour from the red, green and blue colour components.
+@param aRed The Red component for creating 16 bit colour.
+@param aGreen The Green component for creating 16 bit colour.
+@param aBlue The Blue component for creating 16 bit colour.
+@return TUint16 The 16 bit colour created from the colour components.
+*/
+FORCEINLINE TUint16 PackColor64K(TInt aRed, TInt aGreen, TInt aBlue)
+ {
+ TUint16 color64K = (aBlue & 0xF8) >> 3;
+ color64K |= (aGreen & 0xFc) << 3;
+ color64K |= (aRed & 0xF8) << 8;
+ return color64K;
+ }
+
+/**
+It is an overloaded function for alpha bending which does blending for 16 bit colour.
+@param aPrimaryColor64K The foreground pixel colour in 16 bit format.
+@param aSecondaryColor64K The background pixel colour in 16 bit format.
+@param aAlphaValue The alpha value used for blending.
+@return The 16 bit blended colour.
+*/
+FORCEINLINE TUint16 AlphaBlend(TUint16 aPrimaryColor64K, TUint16 aSecondaryColor64K,TInt aAlphaValue)
+ {
+ TInt primaryRed;
+ TInt primaryGreen;
+ TInt primaryBlue;
+ TInt secondaryRed;
+ TInt secondaryGreen;
+ TInt secondaryBlue;
+
+ UnpackColor64K(aPrimaryColor64K, primaryRed, primaryGreen, primaryBlue);
+ UnpackColor64K(aSecondaryColor64K, secondaryRed, secondaryGreen, secondaryBlue);
+
+ __ASSERT_DEBUG(!(primaryRed>>8) && !(primaryGreen>>8) && !(primaryBlue>>8) && !(aAlphaValue>>8),
+ Panic(EScreenDriverPanicAlphaBlendInvariant));
+
+ const TInt alphaValue = aAlphaValue * 257;
+ return PackColor64K(((alphaValue * (primaryRed - secondaryRed)) >> 16) + secondaryRed,
+ ((alphaValue * (primaryGreen - secondaryGreen)) >> 16) + secondaryGreen,
+ ((alphaValue * (primaryBlue - secondaryBlue)) >> 16) + secondaryBlue);
+ }
+
+/**
+It is an overloaded function for alpha bending which does blending for 16 bit colour.
+@param aPrimaryRed Red component of foreground pixel colour.
+@param aPrimaryGreen Green component of foreground pixel colour.
+@param aPrimaryBlue Blue component of foreground pixel colour.
+@param aSecondaryColor64K The background pixel colour in 16 bit format.
+@param aAlphaValue The alpha value used for blending.
+@return The 16 bit blended colour.
+*/
+FORCEINLINE TUint16 AlphaBlend(TInt aPrimaryRed,TInt aPrimaryGreen,TInt aPrimaryBlue, TUint16 aSecondaryColor64K,TInt aAlphaValue)
+ {
+ __ASSERT_DEBUG(!(aPrimaryRed>>8) && !(aPrimaryGreen>>8) && !(aPrimaryBlue>>8) && !(aAlphaValue>>8),
+ Panic(EScreenDriverPanicAlphaBlendInvariant));
+
+ if (aAlphaValue==0xFF)
+ return(PackColor64K(aPrimaryRed, aPrimaryGreen, aPrimaryBlue));
+ TInt secondaryRed;
+ TInt secondaryGreen;
+ TInt secondaryBlue;
+
+ UnpackColor64K(aSecondaryColor64K, secondaryRed, secondaryGreen, secondaryBlue);
+
+ const TInt alphaValue = aAlphaValue * 257;
+ return PackColor64K(((alphaValue * (aPrimaryRed - secondaryRed)) >> 16) + secondaryRed,
+ ((alphaValue * (aPrimaryGreen - secondaryGreen)) >> 16) + secondaryGreen,
+ ((alphaValue * (aPrimaryBlue - secondaryBlue)) >> 16) + secondaryBlue);
+ }
+
+FORCEINLINE LOCAL_C TUint16 Conv32To16(TUint32 col)
+ {
+ TUint b = (col&0x000000ff)>>3;
+ TUint g = (col&0x0000fc00)>>5;
+ TUint r = (col&0x00f80000)>>8;
+ return TUint16(r|g|b);
+ }
+
+// Alpha-blends an EColor16MA pixel to an EColor64K screen using a fixed mask value.
+FORCEINLINE LOCAL_C TUint16 Blend32To16(TUint32 aSrc32, TUint aMask, TUint16 aDest16)
+ {
+ __ASSERT_DEBUG(aMask < 256, Panic(EScreenDriverPanicInvalidParameter));
+
+ if(aMask)
+ {
+ if(aMask >= 0xFF)
+ return Conv32To16(aSrc32);
+
+ // blend red and blue channel in one go
+ TUint32 d_rb = (aDest16 & 0xF800)<<8 | (aDest16 & 0x001F)<<3;
+ d_rb |= (d_rb>>5) & 0x00ff00ff;
+ const TUint32 s_rb = aSrc32 & 0x00FF00FF;
+ const TUint32 mask2 = aMask | (aMask << 16);
+ const TUint32 rb = ((((aMask * ((0x01000100 + s_rb) - d_rb)) >> 8) + d_rb) - mask2) & 0x00FF00FF;
+
+ // do the green channel normally
+ TInt32 d_g = (aDest16 & 0x07E0)>>3;
+ d_g |= d_g>>6;
+ const TInt32 s_g = (aSrc32 & 0xFF00) >> 8;
+ TInt g = (((aMask * (s_g - d_g)) >> 8) + d_g) & 0xFF;
+
+ return (Conv32To16(rb | g<<8));
+ }
+
+ return aDest16;
+ }
+
+// As for Blend32To16, but assumes 0xFF and 0 alpha checks already done elsewhere
+FORCEINLINE LOCAL_C TUint16 Blend32To16NoChecks(TUint32 aSrc32, TUint aMask, TUint16 aDest16)
+ {
+ // blend red and blue channel in one go
+ TUint32 d_rb = (aDest16 & 0xF800)<<8 | (aDest16 & 0x001F)<<3;
+ d_rb |= (d_rb>>5) & 0x00ff00ff;
+ const TUint32 s_rb = aSrc32 & 0x00FF00FF;
+ const TUint32 mask2 = aMask | (aMask << 16);
+ const TUint32 rb = ((((aMask * ((0x01000100 + s_rb) - d_rb)) >> 8) + d_rb) - mask2) & 0x00FF00FF;
+
+ // do the green channel normally
+ TInt32 d_g = (aDest16 & 0x07E0)>>3;
+ d_g |= d_g>>6;
+ const TInt32 s_g = (aSrc32 & 0xFF00) >> 8;
+ TInt g = (((aMask * (s_g - d_g)) >> 8) + d_g) & 0xFF;
+
+ return (Conv32To16(rb | g<<8));
+ }
+
+// Alpha-blends to an EColor64K screen using a fixed mask value.
+// The source values are pre-split from a 32 bit source into the two following components:
+//
+// aSrcRB=aSrc32 & 0x00FF00FF;
+// aSrcG=(aSrc32 & 0xFF00) >> 8;
+//
+// Mask is assumed not to be 0 or 255, these should be pre-checked for and never arrive here
+//
+FORCEINLINE LOCAL_C TUint16 BlendTo16(const TUint32 aSrcRB, const TUint32 aSrcG, TUint aMask, TUint16 aDest16)
+ {
+ // blend red and blue channel in one go
+ TUint32 d_rb = (aDest16 & 0xF800)<<8 | (aDest16 & 0x001F)<<3;
+ d_rb |= (d_rb>>5) & 0x00ff00ff;
+ const TUint32 mask2 = aMask | (aMask << 16);
+ const TUint32 rb = ((((aMask * ((0x01000100 + aSrcRB) - d_rb)) >> 8) + d_rb) - mask2) & 0x00FF00FF;
+
+ // do the green channel normally
+ TInt32 d_g = (aDest16 & 0x07E0)>>3;
+ d_g |= d_g>>6;
+ const TInt32 g = (((aMask * (aSrcG - d_g)) >> 8) + d_g) & 0xFF;
+
+ // inline conversion to 16 bit
+ return TUint16(((rb&0x00f80000)>>8)|((g&0x0000fc)<<3)|((rb&0x000000ff)>>3));
+ }
+
+// Alpha-blends an EColor16MA pixel to an EColor16MU screen using a fixed mask value.
+FORCEINLINE LOCAL_C TUint32 CalcAlphaPixel(const TUint32 aSrcPixel, const TUint8 aMask, TUint32 aDestPixel)
+ {
+ // (a) (mask * src + (255 - mask) * dest) / 255 This ideal formula
+ // (b) ((mask * (src - dest)) >> 8) + dest A faster approximation to (a)
+ // (c) ((mask * (256 + src - dest) >> 8) + dest - mask Equivalent to (b) but can be used on multiple colors at a time
+
+ if(aMask)
+ {
+ if(aMask == 0xFF)
+ return 0xff000000|aSrcPixel;
+
+ const TUint32 s_rb = aSrcPixel & 0x00FF00FF;
+ const TUint32 d_rb = aDestPixel & 0x00FF00FF;
+ const TUint32 mask2 = aMask | (aMask << 16);
+ const TUint32 rb = ((((aMask * ((0x01000100 + s_rb) - d_rb)) >> 8) + d_rb) - mask2) & 0x00FF00FF;
+
+ const TInt s_g = (aSrcPixel & 0xFF00) >> 8;
+ const TInt d_g = (aDestPixel & 0xFF00) >> 8;
+ const TInt g = ((aMask * (s_g - d_g)) >> 8) + d_g;
+
+ return(rb | (g<<8) | 0xff000000);
+ }
+
+ return aDestPixel;
+
+ }
+
+// Alpha-blends an EColor16MA rgb to an EColor16MU screen using a fixed mask value.
+FORCEINLINE LOCAL_C void AlphaBlendPixelToDest(TUint32 aSrcValue, const TUint8 aSourceAlpha, TUint32* aDestPtr)
+ {
+ *aDestPtr = CalcAlphaPixel(aSrcValue, aSourceAlpha, *aDestPtr);
+ }
+
+void MemFillTUint32(TUint32* tempWordPtr, TInt aCount, const TUint32 aValue);
+
+#endif
+