fbs/fontandbitmapserver/sfbs/BMPASTR.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/sfbs/BMPASTR.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,180 @@
+// Copyright (c) 1995-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:
+//
+
+#include <s32file.h>
+#include <fbs.h>
+#include <bitmap.h>
+#include <graphics/bitmapuid.h>
+#include "fbsbitmapasyncstreamer.h"
+
+CFbsBitmapAsyncStreamer::CFbsBitmapAsyncStreamer(TMode aMode):
+	CBase(),
+	iFbs(RFbsSession::GetSession()),
+	iMode(aMode)
+	{}
+
+EXPORT_C CFbsBitmapAsyncStreamer::~CFbsBitmapAsyncStreamer()
+	{
+	iReadStream.Close();
+	iWriteStream.Close();
+	delete iStore;
+	if(iMode==ELoad) delete iBitmap;
+	}
+
+EXPORT_C CFbsBitmapAsyncStreamer* CFbsBitmapAsyncStreamer::NewL(TMode aMode)
+	{
+	CFbsBitmapAsyncStreamer* thisptr=new(ELeave) CFbsBitmapAsyncStreamer(aMode);
+	CleanupStack::PushL(thisptr);
+	thisptr->ConstructL();
+	CleanupStack::Pop();
+	return(thisptr);
+	}
+
+void CFbsBitmapAsyncStreamer::ConstructL()
+	{
+	if(iMode==ELoad) iBitmap=new(ELeave) CFbsBitmap;
+	}
+
+EXPORT_C TInt CFbsBitmapAsyncStreamer::Load(const TDesC& aFilename,TInt32 aId,TInt& aScanLines)
+	{
+	if(iMode!=ELoad) return(KErrGeneral);
+
+	TRAPD(ret,DoLoadL(aFilename,aId));
+	if(ret!=KErrNone) return(ret);
+
+	iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
+
+	ret=iBitmap->Create(iHeader.iSizeInPixels,iDispMode);
+	iBitmap->BeginDataAccess();
+	iBitmap->Address()->iHeader=iHeader;
+	if(ret!=KErrNone) return(ret);
+
+	aScanLines=iHeader.iSizeInPixels.iHeight;
+	iScanLineBase=(TUint32*)iBitmap->DataAddress();
+	return(KErrNone);
+	}
+
+void CFbsBitmapAsyncStreamer::DoLoadL(const TDesC& aFilename,TInt32 aId)
+	{
+	iStore=CDirectFileStore::OpenL(iFbs->FileServer(),aFilename,EFileShareReadersOnly);
+	if (iStore->Type()[1]!=KMultiBitmapFileImageUid)
+		User::LeaveIfError(KErrGeneral);
+	TStreamId streamid=iStore->Root();
+	RStoreReadStream readstream;
+	readstream.OpenL(*iStore,streamid);
+	TInt numbitmaps=readstream.ReadInt32L();
+	if(numbitmaps<aId+1)
+		User::Leave(KErrUnknown);
+	TStreamId bmpstreamid;
+	bmpstreamid.InternalizeL(readstream);
+	for(TInt count=0;count<aId;count++)
+		bmpstreamid.InternalizeL(readstream);
+	readstream.Close();
+	iReadStream.OpenL(*iStore,bmpstreamid);
+	CBitwiseBitmap::InternalizeHeaderL(iReadStream,iHeader);
+	}
+
+EXPORT_C TBool CFbsBitmapAsyncStreamer::LoadScanLinesL(TInt aNumberOfScanLines,CFbsBitmap*& aBitmap)
+	{
+	if(iMode!=ELoad || iBitmap==NULL) User::Leave(KErrGeneral);
+	if(iHeader.iCompression!=ENoBitmapCompression)
+		{
+		TRAP_IGNORE(iBitmap->Address()->DoInternalizeL(iReadStream,iHeader.iBitmapSize-iHeader.iStructSize,iBitmap->DataAddress()));
+		iBitmap->EndDataAccess(EFalse);
+		aBitmap=iBitmap;
+		iBitmap=NULL;
+		return(ETrue);
+		}
+	aNumberOfScanLines=Abs(aNumberOfScanLines);
+	if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
+		aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
+	TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
+	TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
+	iReadStream.ReadL(sladd,aNumberOfScanLines*slbytes);
+	iCurrentScanLine+=aNumberOfScanLines;
+	if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
+		{
+		iBitmap->EndDataAccess(EFalse);
+		aBitmap=iBitmap;
+		iBitmap=NULL;
+		return(ETrue);
+		}
+	return(EFalse);
+	}
+
+EXPORT_C TInt CFbsBitmapAsyncStreamer::Save(const TDesC& aFilename,CFbsBitmap* aBitmap,TInt32& aId,TInt& aScanLines)
+	{
+	if(iMode!=ESave || aBitmap==NULL || !aBitmap->iHandle) return(KErrGeneral);
+	RFile file;
+	TInt ret=file.Replace(iFbs->FileServer(),aFilename,EFileWrite);
+	if(ret!=KErrNone) return(ret);
+	iHeader=aBitmap->Header();
+
+	iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
+
+	TRAP(ret,DoSaveL(file));
+	if(ret!=KErrNone) return(ret);
+	aId=0;
+	iBitmap=aBitmap;
+	iBitmap->BeginDataAccess();
+	aScanLines=iHeader.iSizeInPixels.iHeight;
+	iScanLineBase=(TUint32*)aBitmap->DataAddress();
+	return(KErrNone);
+	}
+
+void CFbsBitmapAsyncStreamer::DoSaveL(RFile& aFile)
+	{
+	iStore=CDirectFileStore::NewL(aFile);
+	TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
+	iStore->SetTypeL(uidtype);
+	iId=iWriteStream.CreateL(*iStore);
+	iWriteStream.WriteInt32L(iHeader.iBitmapSize);
+	iWriteStream.WriteInt32L(iHeader.iStructSize);
+	iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iWidth);
+	iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iHeight);
+	iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iWidth);
+	iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iHeight);
+	iWriteStream.WriteInt32L(iHeader.iBitsPerPixel);
+	iWriteStream.WriteUint32L(iHeader.iColor);
+	iWriteStream.WriteInt32L(0);
+	iWriteStream.WriteUint32L(iHeader.iCompression);
+	}
+
+EXPORT_C TBool CFbsBitmapAsyncStreamer::SaveScanLinesL(TInt aNumberOfScanLines)
+	{
+	if(iMode!=ESave || iBitmap==NULL) User::Leave(KErrGeneral);
+	aNumberOfScanLines=Abs(aNumberOfScanLines);
+	if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
+		aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
+	TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
+	TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
+	iWriteStream.WriteL(sladd,aNumberOfScanLines*slbytes);
+	iCurrentScanLine+=aNumberOfScanLines;
+	if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
+		{
+		iBitmap->EndDataAccess(ETrue);
+		iWriteStream.Close();
+		TStreamId headstreamid=iWriteStream.CreateL(*iStore);
+		iWriteStream.WriteInt32L(1); // number of bitmaps
+		iId.ExternalizeL(iWriteStream); // stream id of bitmap
+		iWriteStream.Close();
+		iStore->SetRootL(headstreamid);
+		delete iStore;
+		iStore=NULL;
+		return(ETrue);
+		}
+	return(EFalse);
+	}
+