imaging/imagingplugins/codecs/GifCodec/rawimageprocessor.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingplugins/codecs/GifCodec/rawimageprocessor.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,247 @@
+// Copyright (c) 2007-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "rawimageprocessor.h"
+
+// The classes below are used for Gif Decoder to optimize decoded data transfer 
+// to destination bitmap. The main purpose of these classes is to provide direct access
+// to bitmap memory and to remove colour transformation/not used functionality of standard image processor
+// overheads.
+
+// RawImageProcessor
+
+CRawImageProcessor* CRawImageProcessor::NewL()
+ 	{
+   	return new (ELeave) CRawImageProcessor();
+   	}
+
+CRawImageProcessor::CRawImageProcessor()
+	{
+	}
+//  from the CImageProcessor //
+
+TBool CRawImageProcessor::SetPixelBlock(TRgb* /* aColorBuffer */)
+	{
+    ASSERT(EFalse);
+   	return ETrue;
+   	}
+
+TBool CRawImageProcessor::SetPixels(TRgb* aColorBuffer,TInt aNumOfPixels)
+    {
+	TInt length = aNumOfPixels * iPixelSize;
+	if(iBitmapDataPtr + length > iBitmapDataPtrLimit) 
+		{
+		if (iBitmapDataPtrLimit != iBitmapDataPtr) 
+			{
+			if (iBitmapDataPtr < iBitmapDataPtrLimit) 
+				{
+				Mem::Copy(iBitmapDataPtr, aColorBuffer, iBitmapDataPtrLimit - iBitmapDataPtr);		
+				}
+			iBitmapDataPtr = iBitmapDataPtrLimit;
+			return ETrue;
+			}
+		return EFalse;
+		}
+	Mem::Copy(iBitmapDataPtr, aColorBuffer, length);
+	iBitmapDataPtr += length;
+    return ETrue;
+    }
+
+TBool CRawImageProcessor::SetMonoPixel(TInt /*aGray256*/)
+	{
+	ASSERT(EFalse);
+   	return EFalse;
+   	}
+
+TBool CRawImageProcessor::SetMonoPixelRun(TInt /*aGray256*/,TInt /*aCount*/)
+	{
+   	ASSERT(EFalse);
+   	return EFalse;
+   	}
+
+TBool CRawImageProcessor::SetMonoPixels(TUint32* /*aGray256Buffer*/,TInt /*aBufferLength*/)
+    {
+    ASSERT(EFalse);
+    return EFalse;
+    }
+
+TBool CRawImageProcessor::SetMonoPixelBlock(TUint32* /*aGray256Buffer*/)
+    {
+    ASSERT(EFalse);
+    return EFalse;
+    }
+
+TBool CRawImageProcessor::SetPos(const TPoint& aPosition)
+    {
+    iBitmapDataPtr = iBitmapData + (aPosition.iY-iImageRect.iTl.iY) * iScanlineSize + (aPosition.iX-iImageRect.iTl.iX) * iPixelSize;
+    return ETrue;
+    }
+
+TBool CRawImageProcessor::FlushPixels()
+    {
+    return ETrue;
+    }
+
+void CRawImageProcessor::PrepareL(CFbsBitmap& aBitmap,const TRect& aImageRect)
+    {
+   	if( aImageRect.iTl.iX<0 || aImageRect.iTl.iY<0 || aImageRect.Width()>aBitmap.SizeInPixels().iWidth || aImageRect.Height()>aBitmap.SizeInPixels().iHeight )
+		User::Leave(KErrArgument);
+    
+    iImageRect = aImageRect;
+    iBitmap 	= &aBitmap;
+    iPixelSize	= TDisplayModeUtils::NumDisplayModeBitsPerPixel( aBitmap.DisplayMode() );
+
+    if (iPixelSize & 7) // we do not support display modes with pixel size of not multiple to byte size
+        {
+        ASSERT(EFalse);
+        User::Leave(KErrArgument);
+        }
+
+    iPixelSize >>= 3;
+    
+    iScanlineSize = iBitmap->ScanLineLength(aBitmap.SizeInPixels().iWidth, aBitmap.DisplayMode() );
+    
+    iBitmapData = reinterpret_cast<TUint8*>( iBitmap->DataAddress() ); // destination bitmap data ptr, not owned
+	
+	if (!iBitmapData)// not sure it is possible but anyway
+		{
+		User::Leave(KErrArgument);
+		}
+
+    iBitmapDataPtr = iBitmapData;
+	iBitmapDataPtrLimit = iBitmapDataPtr + iScanlineSize * aBitmap.SizeInPixels().iHeight;
+    }
+
+void CRawImageProcessor::PrepareL(CFbsBitmap& /*aBitmap*/,const TRect& /*aImageRect*/, const TSize& /*aRgbBlockSize*/)
+    {
+    ASSERT(EFalse);
+    }
+
+void CRawImageProcessor::SetYPosIncrement(TInt /*aYInc*/)
+    {
+    ASSERT(EFalse);
+    }
+
+void CRawImageProcessor::SetLineRepeat(TInt /*aLineRepeat*/)
+    {
+    ASSERT(EFalse);
+    }
+
+void CRawImageProcessor::SetPixelPadding(TInt /*aNumberOfPixels*/)
+    {
+    ASSERT(EFalse);
+    }
+    
+TBool CRawImageProcessor::SetPixelRun(TRgb /*aColor*/,TInt /*aCount*/)
+   	{
+   	ASSERT(EFalse);
+   	return EFalse;
+   	}
+
+TBool CRawImageProcessor::SetPixel(TRgb /*aColor*/)
+   	{
+   	ASSERT(EFalse);
+   	return EFalse;
+   	}
+
+// RawImageUtilProcessor
+
+CRawImageUtilProcessor* CRawImageUtilProcessor::NewL()
+	{
+   	return new (ELeave) CRawImageUtilProcessor();
+   	}
+
+//  from the CImageProcessor //
+
+TBool CRawImageUtilProcessor::SetPixels(TRgb* aColorBuffer,TInt aNumOfPixels)
+    {
+	TPoint pos;
+	pos.iX = iPosition.iX;
+	pos.iY = iPosition.iY;
+	
+	TInt width = iSize.iWidth;
+	TInt height = iSize.iHeight;
+	TInt pixelToWrite = 0;
+	
+	while (aNumOfPixels && pos.iY < height) 
+		{
+		pixelToWrite = Min(width-pos.iX, aNumOfPixels);
+		iUtil.SetPixels(reinterpret_cast<TUint32*>(aColorBuffer), pixelToWrite);
+		aNumOfPixels -= pixelToWrite;
+		aColorBuffer += pixelToWrite;
+		pos.iX += pixelToWrite;
+		if (pos.iX == width) 
+			{
+			pos.iX = 0;
+			pos.iY++;
+			}
+		}
+	
+	iPosition.iX = pos.iX;
+	iPosition.iY = pos.iY;
+	return ETrue;
+    }
+
+TBool CRawImageUtilProcessor::SetMonoPixels(TUint32* aGray256Buffer,TInt aNumOfPixels)
+    {
+	TPoint pos;
+	pos.iX = iPosition.iX;
+	pos.iY = iPosition.iY;
+	
+	TInt width = iSize.iWidth;
+	TInt height = iSize.iHeight;
+	TInt pixelToWrite = 0;
+	
+	while (aNumOfPixels && pos.iY < height) 
+		{
+		pixelToWrite = Min(width-pos.iX, aNumOfPixels);
+		iUtil.SetPixels(aGray256Buffer, pixelToWrite);
+		aNumOfPixels -= pixelToWrite;
+		aGray256Buffer += pixelToWrite;
+		pos.iX += pixelToWrite;
+		if (pos.iX == width) 
+			{
+			pos.iX = 0;
+			pos.iY++;
+			}
+		}
+	
+	iPosition.iX = pos.iX;
+	iPosition.iY = pos.iY;
+	return ETrue;
+    }
+
+TBool CRawImageUtilProcessor::SetPos(const TPoint& aPosition)
+    {
+    iPosition.iX = aPosition.iX - iImageRect.iTl.iX;
+    iPosition.iY = aPosition.iY - iImageRect.iTl.iY;
+    return iUtil.SetPos(iPosition);
+    }
+
+void CRawImageUtilProcessor::PrepareL(CFbsBitmap& aBitmap,const TRect& aImageRect)
+    {
+    iImageRect = aImageRect;
+    iSize = iImageRect.Size();
+    iPosition = TPoint(0, 0);
+	iUtil.SetBitmapL(&aBitmap);
+	iUtil.Begin(iPosition);
+	iUtil.End();
+    }
+