graphicsdeviceinterface/screendriver/sbit/BMDRAW8M.CPP
changeset 0 5d03bc08d59c
equal deleted inserted replaced
-1:000000000000 0:5d03bc08d59c
       
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "BMDRAW.H"
       
    17 
       
    18 // CDrawEightBppBitmapGray
       
    19 
       
    20 TInt CDrawEightBppBitmapGray::Construct(TSize aSize)
       
    21 	{
       
    22 	return Construct(aSize, (aSize.iWidth + 3) & ~3);
       
    23 	}
       
    24 
       
    25 TInt CDrawEightBppBitmapGray::Construct(TSize aSize, TInt aStride)
       
    26 	{
       
    27 	iDispMode = EGray256;
       
    28 	return CDrawEightBppBitmapCommon::Construct(aSize, aStride);
       
    29 	}
       
    30 
       
    31 void CDrawEightBppBitmapGray::Shadow(TRgb& aColor)
       
    32 	{
       
    33 	if (iShadowMode & EFade)
       
    34 		aColor = TRgb::_Gray256(FadeGray(aColor._Gray256()));
       
    35 
       
    36 	if (iShadowMode & EShadow)
       
    37 		{
       
    38 		TInt gray256 = Max(aColor._Gray256() - 85,0);
       
    39 		aColor = TRgb::_Gray256(gray256);
       
    40 		}
       
    41 	}
       
    42 
       
    43 TUint8 CDrawEightBppBitmapGray::ShadowAndFade(TInt aGray256)
       
    44 	{
       
    45 	if (iShadowMode & EFade)
       
    46 		aGray256 = FadeGray(aGray256);
       
    47 
       
    48 	if (iShadowMode & EShadow)
       
    49 		aGray256 = Max(aGray256 - 85,0);
       
    50 
       
    51 	return TUint8(aGray256);
       
    52 	}
       
    53 
       
    54 TRgb CDrawEightBppBitmapGray::ReadRgbNormal(TInt aX,TInt aY) const
       
    55 	{
       
    56 	return TRgb::_Gray256(*PixelAddress(aX,aY));
       
    57 	}
       
    58 
       
    59 void CDrawEightBppBitmapGray::ShadowArea(const TRect& aRect)
       
    60 	{
       
    61 	const TRect rect(DeOrientate(aRect));
       
    62 
       
    63 	__ASSERT_DEBUG(rect.iTl.iX>=0 && rect.iBr.iX<=iSize.iWidth,Panic(EScreenDriverPanicOutOfBounds));
       
    64 	__ASSERT_DEBUG(rect.iTl.iY>=0 && rect.iBr.iY<=iSize.iHeight,Panic(EScreenDriverPanicOutOfBounds));
       
    65 
       
    66 	const TInt longWidth = iLongWidth;
       
    67 	TUint8* pixelPtr = PixelAddress(rect.iTl.iX,rect.iTl.iY);
       
    68 	const TUint8* pixelRowPtrLimit = pixelPtr + (rect.Height() * longWidth);
       
    69 
       
    70 	if (iShadowMode & EFade)
       
    71 		{
       
    72 		TUint8* pixelRowPtr = pixelPtr;
       
    73 		TUint8* pixelPtrLimit = pixelPtr + rect.Width();
       
    74 
       
    75 		while (pixelRowPtr < pixelRowPtrLimit)
       
    76 			{
       
    77 			TUint8* tempPixelPtr = pixelRowPtr;
       
    78 
       
    79 			while (tempPixelPtr < pixelPtrLimit)
       
    80 				{
       
    81 				*tempPixelPtr = FadeGray(*tempPixelPtr);
       
    82 				++tempPixelPtr;
       
    83 				}
       
    84 
       
    85 			pixelRowPtr += longWidth;
       
    86 			pixelPtrLimit += longWidth;
       
    87 			}
       
    88 		}
       
    89 
       
    90 	if (iShadowMode & EShadow)
       
    91 		{
       
    92 		TUint8* pixelRowPtr = pixelPtr;
       
    93 		TUint8* pixelPtrLimit = pixelPtr + rect.Width();
       
    94 
       
    95 		while (pixelRowPtr < pixelRowPtrLimit)
       
    96 			{
       
    97 			TUint8* tempPixelPtr = pixelRowPtr;
       
    98 
       
    99 			while (tempPixelPtr < pixelPtrLimit)
       
   100 				{
       
   101 				*tempPixelPtr = TUint8(Max(*tempPixelPtr - 85,0));
       
   102 				++tempPixelPtr;
       
   103 				}
       
   104 
       
   105 			pixelRowPtr += longWidth;
       
   106 			pixelPtrLimit += longWidth;
       
   107 			}
       
   108 		}
       
   109 	}
       
   110 
       
   111 void CDrawEightBppBitmapGray::ShadowBuffer(TInt aLength,TUint32* aBuffer)
       
   112 	{
       
   113 	__ASSERT_DEBUG(aLength>0,Panic(EScreenDriverPanicInvalidParameter));
       
   114 	__ASSERT_DEBUG(aBuffer!=NULL,Panic(EScreenDriverPanicInvalidParameter));
       
   115 
       
   116 	TUint8* limit = ((TUint8*)aBuffer) + aLength;
       
   117 
       
   118 	if (iShadowMode & EFade)
       
   119 		{
       
   120 		TUint8* buffer = (TUint8*)aBuffer;
       
   121 
       
   122 		while(buffer < limit)
       
   123 			{
       
   124 			*buffer = FadeGray(*buffer);
       
   125 			++buffer;
       
   126 			}
       
   127 		}
       
   128 
       
   129 	if (iShadowMode & EShadow)
       
   130 		{
       
   131 		TUint8* buffer = (TUint8*)aBuffer;
       
   132 
       
   133 		while(buffer < limit)
       
   134 			{
       
   135 			*buffer = TUint8(Max(*buffer - 85,0));
       
   136 			++buffer;
       
   137 			}
       
   138 		}
       
   139 	}
       
   140 
       
   141 void CDrawEightBppBitmapGray::WriteRgb(TInt aX,TInt aY,TRgb aColor)
       
   142 	{
       
   143 	CDrawEightBppBitmapCommon::WriteRgb(aX,aY,TUint8(aColor._Gray256()));
       
   144 	}
       
   145 
       
   146 void CDrawEightBppBitmapGray::WriteBinary(TInt aX,TInt aY,TUint32* aData,TInt aLength,TInt aHeight,TRgb aColor)
       
   147 	{
       
   148 	CDrawEightBppBitmapCommon::WriteBinary(aX,aY,aData,aLength,aHeight,TUint8(aColor._Gray256()));
       
   149 	}
       
   150 
       
   151 void CDrawEightBppBitmapGray::WriteBinaryOp(TInt aX,TInt aY,TUint32* aData,TInt aLength,TInt aHeight,TRgb aColor,CGraphicsContext::TDrawMode aDrawMode)
       
   152 	{
       
   153 	CDrawEightBppBitmapCommon::WriteBinaryOp(aX,aY,aData,aLength,aHeight,TUint8(aColor._Gray256()),aDrawMode);
       
   154 	}
       
   155 
       
   156 void CDrawEightBppBitmapGray::WriteBinaryLineVertical(TInt aX,TInt aY,TUint32* aData,TInt aLength,TRgb aColor,TBool aUp)
       
   157 	{
       
   158 	CDrawEightBppBitmapCommon::WriteBinaryLineVertical(aX,aY,aData,aLength,TUint8(aColor._Gray256()),aUp);
       
   159 	}
       
   160 
       
   161 /**
       
   162 MAlphaBlend::WriteRgbAlphaLine() implementation.
       
   163 @see MAlphaBlend::WriteRgbAlphaLine()
       
   164 */
       
   165 void CDrawEightBppBitmapGray::WriteRgbAlphaLine(TInt aX, TInt aY, TInt aLength,
       
   166                                                 const TUint8* aRgbBuffer,
       
   167                                                 const TUint8* aMaskBuffer,
       
   168                                                 MAlphaBlend::TShadowing aShadowing,
       
   169                                                 CGraphicsContext::TDrawMode /*aDrawMode*/)
       
   170     {
       
   171 	DeOrientate(aX,aY);
       
   172 	TUint8* pixelPtr = PixelAddress(aX,aY);
       
   173 	const TInt pixelPtrInc = LogicalPixelAddressIncrement();
       
   174 	const TUint8* maskBufferPtrLimit = aMaskBuffer + aLength;
       
   175 	TRgb pixelClr;
       
   176 
       
   177 	while (aMaskBuffer < maskBufferPtrLimit)
       
   178 		{
       
   179         TRgb srcColor(aRgbBuffer[2],aRgbBuffer[1],aRgbBuffer[0]);
       
   180         if(aShadowing == MAlphaBlend::EShdwBefore)
       
   181             {
       
   182 		    Shadow(srcColor);
       
   183             }
       
   184 		TInt pixelValue = pixelPtr[0] * (255 - aMaskBuffer[0]);
       
   185 		TInt srceValue = (((srcColor.Red() << 1) + 
       
   186                             srcColor.Green() + (srcColor.Green() << 2) + 
       
   187                             srcColor.Blue()) >> 3) * aMaskBuffer[0];
       
   188 
       
   189 		pixelValue += srceValue;
       
   190 		pixelClr =TRgb::_Gray256(pixelValue / 255);
       
   191         if(aShadowing == MAlphaBlend::EShdwAfter)
       
   192             {
       
   193 		    Shadow(pixelClr);
       
   194             }
       
   195 		MapColorToUserDisplayMode(pixelClr);
       
   196 		pixelPtr[0] = TUint8(pixelClr._Gray256());
       
   197 
       
   198 		pixelPtr += pixelPtrInc;
       
   199 		aRgbBuffer += 4;
       
   200 		aMaskBuffer++;
       
   201 		}
       
   202 	}
       
   203 
       
   204 void CDrawEightBppBitmapGray::WriteRgbMulti(TInt aX,TInt aY,TInt aLength,TInt aRows,TRgb aColor)
       
   205 	{
       
   206 	CDrawEightBppBitmapCommon::WriteRgbMulti(aX,aY,aLength,aRows,TUint8(aColor._Gray256()));
       
   207 	}
       
   208 
       
   209 void CDrawEightBppBitmapGray::WriteRgbMultiXOR(TInt aX,TInt aY,TInt aLength,TInt aRows,TRgb aColor)
       
   210 	{
       
   211 	CDrawEightBppBitmapCommon::WriteRgbMultiXOR(aX,aY,aLength,aRows,TUint8(aColor._Gray256()));
       
   212 	}
       
   213 
       
   214 void CDrawEightBppBitmapGray::WriteRgbMultiAND(TInt aX,TInt aY,TInt aLength,TInt aRows,TRgb aColor)
       
   215 	{
       
   216 	CDrawEightBppBitmapCommon::WriteRgbMultiAND(aX,aY,aLength,aRows,TUint8(aColor._Gray256()));
       
   217 	}
       
   218 
       
   219 void CDrawEightBppBitmapGray::WriteRgbMultiOR(TInt aX,TInt aY,TInt aLength,TInt aRows,TRgb aColor)
       
   220 	{
       
   221 	CDrawEightBppBitmapCommon::WriteRgbMultiOR(aX,aY,aLength,aRows,TUint8(aColor._Gray256()));
       
   222 	}
       
   223 
       
   224 void CDrawEightBppBitmapGray::WriteRgbAlphaMulti(TInt aX,TInt aY,TInt aLength,TRgb aColor,const TUint8* aMaskBuffer)
       
   225 	{
       
   226 	DeOrientate(aX,aY);
       
   227 	TUint8* pixelPtr = PixelAddress(aX,aY);
       
   228 	const TInt pixelPtrInc = PixelAddressIncrement();
       
   229 	const TUint8* maskBufferPtrLimit = aMaskBuffer + aLength;
       
   230 
       
   231 	if (iShadowMode)
       
   232 		Shadow(aColor);
       
   233 	
       
   234 	const TInt gray = aColor._Gray256();
       
   235 	while (aMaskBuffer < maskBufferPtrLimit)
       
   236 		{
       
   237 		pixelPtr[0] = TUint8(((gray * aMaskBuffer[0]) + ((255 - aMaskBuffer[0]) * pixelPtr[0])) / 255);
       
   238 
       
   239 		pixelPtr += pixelPtrInc;
       
   240 		aMaskBuffer++;
       
   241 		}
       
   242 	}
       
   243 
       
   244 void CDrawEightBppBitmapGray::MapColorToUserDisplayMode(TRgb& aColor)
       
   245 	{
       
   246 	switch (iUserDispMode)
       
   247 		{
       
   248 	case EGray2:
       
   249 		aColor = TRgb::_Gray2(aColor._Gray2());
       
   250 		break;
       
   251 	case EGray4:
       
   252 	case EColor16:
       
   253 		aColor = TRgb::_Gray4(aColor._Gray4());
       
   254 		break;
       
   255 	case EGray16:
       
   256 	case EColor256:
       
   257 		aColor = TRgb::_Gray16(aColor._Gray16());
       
   258 		break;
       
   259 	default:
       
   260 		break;
       
   261 		}
       
   262 	}
       
   263 
       
   264 void CDrawEightBppBitmapGray::MapBufferToUserDisplayMode(TInt aLength,TUint32* aBuffer)
       
   265 	{
       
   266 	TUint8* bufferPtr = (TUint8*)aBuffer;
       
   267 	const TUint8* bufferLimit = bufferPtr + aLength;
       
   268 
       
   269 	switch (iUserDispMode)
       
   270 		{
       
   271 	case EGray2:
       
   272 		while (bufferPtr < bufferLimit)
       
   273 			{
       
   274 			if (*bufferPtr & 0x80)
       
   275 				*bufferPtr++ = 0xff;
       
   276 			else
       
   277 				*bufferPtr++ = 0;
       
   278 			}
       
   279 		break;
       
   280 	case EGray4:
       
   281 	case EColor16:
       
   282 		while (bufferPtr < bufferLimit)
       
   283 			{
       
   284 			TUint8 gray4 = TUint8(*bufferPtr >> 6);
       
   285 			gray4 |= (gray4 << 2);
       
   286 			*bufferPtr++ = TUint8(gray4 | (gray4 << 4));
       
   287 			}
       
   288 		break;
       
   289 	case EGray16:
       
   290 	case EColor256:
       
   291 		while (bufferPtr < bufferLimit)
       
   292 			{
       
   293 			TUint8 gray16 = TUint8(*bufferPtr >> 4);
       
   294 			*bufferPtr++ = TUint8(gray16 | (gray16 << 4));
       
   295 			}
       
   296 		break;
       
   297 	default:
       
   298 		break;
       
   299 		}
       
   300 	}
       
   301 
       
   302 TInt CDrawEightBppBitmapGray::WriteRgbOutlineAndShadow(TInt aX, TInt aY, const TInt aLength,
       
   303 	                                   TUint32 aOutlinePenColor, TUint32 aShadowColor,
       
   304 	                                   TUint32 aFillColor, const TUint8* aDataBuffer)
       
   305 	{
       
   306 	//This is non-optimised since this screen mode is rarely used and is usually 
       
   307 	//fast enough without optimisation.
       
   308 	DeOrientate(aX,aY);
       
   309 	TUint8* pixelPtr = PixelAddress(aX,aY);
       
   310 	const TInt pixelPtrInc = LogicalPixelAddressIncrement();
       
   311 	const TUint8* dataBufferPtrLimit = aDataBuffer + aLength;
       
   312 	TInt blendedRedColor;
       
   313 	TInt blendedGreenColor;
       
   314 	TInt blendedBlueColor;
       
   315 	TUint8 index = 0;
       
   316 	TRgb finalColor;
       
   317 
       
   318 	TRgb outlinePenColor;
       
   319 	outlinePenColor.SetInternal(aOutlinePenColor);
       
   320 	TRgb shadowColor;
       
   321 	shadowColor.SetInternal(aShadowColor);
       
   322 	TRgb fillColor;
       
   323 	fillColor.SetInternal(aFillColor);
       
   324 
       
   325 	const TInt redOutlinePenColor = outlinePenColor.Red();
       
   326 	const TInt redShadowColor = shadowColor.Red();
       
   327 	const TInt redFillColor = fillColor.Red();
       
   328 
       
   329 	const TInt greenOutlinePenColor = outlinePenColor.Green();
       
   330 	const TInt greenShadowColor = shadowColor.Green();
       
   331 	const TInt greenFillColor = fillColor.Green();
       
   332 
       
   333 	const TInt blueOutlinePenColor = outlinePenColor.Blue();
       
   334 	const TInt blueShadowColor = shadowColor.Blue();
       
   335 	const TInt blueFillColor = fillColor.Blue();
       
   336 	
       
   337 	while (aDataBuffer < dataBufferPtrLimit)
       
   338 		{
       
   339 		index = *aDataBuffer++;
       
   340 		if (255 == FourColorBlendLookup[index][KBackgroundColorIndex])
       
   341 			{
       
   342 			//background colour
       
   343 			//No drawing required so move on to next pixel.
       
   344 			pixelPtr += pixelPtrInc;
       
   345 			continue;
       
   346 			}
       
   347 		else if (255 == FourColorBlendLookup[index][KFillColorIndex])
       
   348 			{
       
   349 			//fill colour
       
   350 			finalColor.SetInternal(aFillColor);
       
   351 			}
       
   352 		else if (255 == FourColorBlendLookup[index][KShadowColorIndex])
       
   353 			{
       
   354 			//Shadow colour
       
   355 			finalColor.SetInternal(aShadowColor);
       
   356 			}
       
   357 		else if (255 == FourColorBlendLookup[index][KOutlineColorIndex])
       
   358 			{
       
   359 			//Outline colour
       
   360 			finalColor.SetInternal(aOutlinePenColor);
       
   361 			}
       
   362 		else
       
   363 			{
       
   364 			TRgb backgroundColor = TRgb::_Gray256(*pixelPtr);
       
   365 	
       
   366 			blendedRedColor = (redOutlinePenColor * FourColorBlendLookup[index][KOutlineColorIndex] + 
       
   367 						   		redShadowColor * FourColorBlendLookup[index][KShadowColorIndex] +
       
   368 						  		redFillColor * FourColorBlendLookup[index][KFillColorIndex] + 
       
   369 						  		backgroundColor.Red() * FourColorBlendLookup[index][KBackgroundColorIndex]) >> 8;
       
   370 
       
   371 			blendedGreenColor = (greenOutlinePenColor * FourColorBlendLookup[index][KOutlineColorIndex] + 
       
   372 								greenShadowColor * FourColorBlendLookup[index][KShadowColorIndex] +
       
   373 								greenFillColor * FourColorBlendLookup[index][KFillColorIndex] + 
       
   374 								backgroundColor.Green() * FourColorBlendLookup[index][KBackgroundColorIndex]) >> 8;
       
   375 
       
   376 			blendedBlueColor = (blueOutlinePenColor * FourColorBlendLookup[index][KOutlineColorIndex] + 
       
   377 								blueShadowColor * FourColorBlendLookup[index][KShadowColorIndex] +
       
   378 								blueFillColor * FourColorBlendLookup[index][KFillColorIndex] + 
       
   379 								backgroundColor.Blue() * FourColorBlendLookup[index][KBackgroundColorIndex]) >> 8;
       
   380 
       
   381 			finalColor = TRgb(blendedRedColor, blendedGreenColor, blendedBlueColor);
       
   382 			}
       
   383 
       
   384 		*pixelPtr = TUint8(finalColor._Gray256());
       
   385 		pixelPtr += pixelPtrInc;
       
   386 		}
       
   387 	return KErrNone;
       
   388 	}