1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/fbs/fontandbitmapserver/sfbs/BMPASTR.CPP Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,180 @@
1.4 +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include <s32file.h>
1.20 +#include <fbs.h>
1.21 +#include <bitmap.h>
1.22 +#include <graphics/bitmapuid.h>
1.23 +#include "fbsbitmapasyncstreamer.h"
1.24 +
1.25 +CFbsBitmapAsyncStreamer::CFbsBitmapAsyncStreamer(TMode aMode):
1.26 + CBase(),
1.27 + iFbs(RFbsSession::GetSession()),
1.28 + iMode(aMode)
1.29 + {}
1.30 +
1.31 +EXPORT_C CFbsBitmapAsyncStreamer::~CFbsBitmapAsyncStreamer()
1.32 + {
1.33 + iReadStream.Close();
1.34 + iWriteStream.Close();
1.35 + delete iStore;
1.36 + if(iMode==ELoad) delete iBitmap;
1.37 + }
1.38 +
1.39 +EXPORT_C CFbsBitmapAsyncStreamer* CFbsBitmapAsyncStreamer::NewL(TMode aMode)
1.40 + {
1.41 + CFbsBitmapAsyncStreamer* thisptr=new(ELeave) CFbsBitmapAsyncStreamer(aMode);
1.42 + CleanupStack::PushL(thisptr);
1.43 + thisptr->ConstructL();
1.44 + CleanupStack::Pop();
1.45 + return(thisptr);
1.46 + }
1.47 +
1.48 +void CFbsBitmapAsyncStreamer::ConstructL()
1.49 + {
1.50 + if(iMode==ELoad) iBitmap=new(ELeave) CFbsBitmap;
1.51 + }
1.52 +
1.53 +EXPORT_C TInt CFbsBitmapAsyncStreamer::Load(const TDesC& aFilename,TInt32 aId,TInt& aScanLines)
1.54 + {
1.55 + if(iMode!=ELoad) return(KErrGeneral);
1.56 +
1.57 + TRAPD(ret,DoLoadL(aFilename,aId));
1.58 + if(ret!=KErrNone) return(ret);
1.59 +
1.60 + iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
1.61 +
1.62 + ret=iBitmap->Create(iHeader.iSizeInPixels,iDispMode);
1.63 + iBitmap->BeginDataAccess();
1.64 + iBitmap->Address()->iHeader=iHeader;
1.65 + if(ret!=KErrNone) return(ret);
1.66 +
1.67 + aScanLines=iHeader.iSizeInPixels.iHeight;
1.68 + iScanLineBase=(TUint32*)iBitmap->DataAddress();
1.69 + return(KErrNone);
1.70 + }
1.71 +
1.72 +void CFbsBitmapAsyncStreamer::DoLoadL(const TDesC& aFilename,TInt32 aId)
1.73 + {
1.74 + iStore=CDirectFileStore::OpenL(iFbs->FileServer(),aFilename,EFileShareReadersOnly);
1.75 + if (iStore->Type()[1]!=KMultiBitmapFileImageUid)
1.76 + User::LeaveIfError(KErrGeneral);
1.77 + TStreamId streamid=iStore->Root();
1.78 + RStoreReadStream readstream;
1.79 + readstream.OpenL(*iStore,streamid);
1.80 + TInt numbitmaps=readstream.ReadInt32L();
1.81 + if(numbitmaps<aId+1)
1.82 + User::Leave(KErrUnknown);
1.83 + TStreamId bmpstreamid;
1.84 + bmpstreamid.InternalizeL(readstream);
1.85 + for(TInt count=0;count<aId;count++)
1.86 + bmpstreamid.InternalizeL(readstream);
1.87 + readstream.Close();
1.88 + iReadStream.OpenL(*iStore,bmpstreamid);
1.89 + CBitwiseBitmap::InternalizeHeaderL(iReadStream,iHeader);
1.90 + }
1.91 +
1.92 +EXPORT_C TBool CFbsBitmapAsyncStreamer::LoadScanLinesL(TInt aNumberOfScanLines,CFbsBitmap*& aBitmap)
1.93 + {
1.94 + if(iMode!=ELoad || iBitmap==NULL) User::Leave(KErrGeneral);
1.95 + if(iHeader.iCompression!=ENoBitmapCompression)
1.96 + {
1.97 + TRAP_IGNORE(iBitmap->Address()->DoInternalizeL(iReadStream,iHeader.iBitmapSize-iHeader.iStructSize,iBitmap->DataAddress()));
1.98 + iBitmap->EndDataAccess(EFalse);
1.99 + aBitmap=iBitmap;
1.100 + iBitmap=NULL;
1.101 + return(ETrue);
1.102 + }
1.103 + aNumberOfScanLines=Abs(aNumberOfScanLines);
1.104 + if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
1.105 + aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
1.106 + TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
1.107 + TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
1.108 + iReadStream.ReadL(sladd,aNumberOfScanLines*slbytes);
1.109 + iCurrentScanLine+=aNumberOfScanLines;
1.110 + if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
1.111 + {
1.112 + iBitmap->EndDataAccess(EFalse);
1.113 + aBitmap=iBitmap;
1.114 + iBitmap=NULL;
1.115 + return(ETrue);
1.116 + }
1.117 + return(EFalse);
1.118 + }
1.119 +
1.120 +EXPORT_C TInt CFbsBitmapAsyncStreamer::Save(const TDesC& aFilename,CFbsBitmap* aBitmap,TInt32& aId,TInt& aScanLines)
1.121 + {
1.122 + if(iMode!=ESave || aBitmap==NULL || !aBitmap->iHandle) return(KErrGeneral);
1.123 + RFile file;
1.124 + TInt ret=file.Replace(iFbs->FileServer(),aFilename,EFileWrite);
1.125 + if(ret!=KErrNone) return(ret);
1.126 + iHeader=aBitmap->Header();
1.127 +
1.128 + iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
1.129 +
1.130 + TRAP(ret,DoSaveL(file));
1.131 + if(ret!=KErrNone) return(ret);
1.132 + aId=0;
1.133 + iBitmap=aBitmap;
1.134 + iBitmap->BeginDataAccess();
1.135 + aScanLines=iHeader.iSizeInPixels.iHeight;
1.136 + iScanLineBase=(TUint32*)aBitmap->DataAddress();
1.137 + return(KErrNone);
1.138 + }
1.139 +
1.140 +void CFbsBitmapAsyncStreamer::DoSaveL(RFile& aFile)
1.141 + {
1.142 + iStore=CDirectFileStore::NewL(aFile);
1.143 + TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
1.144 + iStore->SetTypeL(uidtype);
1.145 + iId=iWriteStream.CreateL(*iStore);
1.146 + iWriteStream.WriteInt32L(iHeader.iBitmapSize);
1.147 + iWriteStream.WriteInt32L(iHeader.iStructSize);
1.148 + iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iWidth);
1.149 + iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iHeight);
1.150 + iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iWidth);
1.151 + iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iHeight);
1.152 + iWriteStream.WriteInt32L(iHeader.iBitsPerPixel);
1.153 + iWriteStream.WriteUint32L(iHeader.iColor);
1.154 + iWriteStream.WriteInt32L(0);
1.155 + iWriteStream.WriteUint32L(iHeader.iCompression);
1.156 + }
1.157 +
1.158 +EXPORT_C TBool CFbsBitmapAsyncStreamer::SaveScanLinesL(TInt aNumberOfScanLines)
1.159 + {
1.160 + if(iMode!=ESave || iBitmap==NULL) User::Leave(KErrGeneral);
1.161 + aNumberOfScanLines=Abs(aNumberOfScanLines);
1.162 + if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
1.163 + aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
1.164 + TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
1.165 + TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
1.166 + iWriteStream.WriteL(sladd,aNumberOfScanLines*slbytes);
1.167 + iCurrentScanLine+=aNumberOfScanLines;
1.168 + if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
1.169 + {
1.170 + iBitmap->EndDataAccess(ETrue);
1.171 + iWriteStream.Close();
1.172 + TStreamId headstreamid=iWriteStream.CreateL(*iStore);
1.173 + iWriteStream.WriteInt32L(1); // number of bitmaps
1.174 + iId.ExternalizeL(iWriteStream); // stream id of bitmap
1.175 + iWriteStream.Close();
1.176 + iStore->SetRootL(headstreamid);
1.177 + delete iStore;
1.178 + iStore=NULL;
1.179 + return(ETrue);
1.180 + }
1.181 + return(EFalse);
1.182 + }
1.183 +