First public contribution.
1 // Copyright (c) 1995-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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
19 #include <graphics/bitmapuid.h>
20 #include "fbsbitmapasyncstreamer.h"
22 CFbsBitmapAsyncStreamer::CFbsBitmapAsyncStreamer(TMode aMode):
24 iFbs(RFbsSession::GetSession()),
28 EXPORT_C CFbsBitmapAsyncStreamer::~CFbsBitmapAsyncStreamer()
33 if(iMode==ELoad) delete iBitmap;
36 EXPORT_C CFbsBitmapAsyncStreamer* CFbsBitmapAsyncStreamer::NewL(TMode aMode)
38 CFbsBitmapAsyncStreamer* thisptr=new(ELeave) CFbsBitmapAsyncStreamer(aMode);
39 CleanupStack::PushL(thisptr);
40 thisptr->ConstructL();
45 void CFbsBitmapAsyncStreamer::ConstructL()
47 if(iMode==ELoad) iBitmap=new(ELeave) CFbsBitmap;
50 EXPORT_C TInt CFbsBitmapAsyncStreamer::Load(const TDesC& aFilename,TInt32 aId,TInt& aScanLines)
52 if(iMode!=ELoad) return(KErrGeneral);
54 TRAPD(ret,DoLoadL(aFilename,aId));
55 if(ret!=KErrNone) return(ret);
57 iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
59 ret=iBitmap->Create(iHeader.iSizeInPixels,iDispMode);
60 iBitmap->BeginDataAccess();
61 iBitmap->Address()->iHeader=iHeader;
62 if(ret!=KErrNone) return(ret);
64 aScanLines=iHeader.iSizeInPixels.iHeight;
65 iScanLineBase=(TUint32*)iBitmap->DataAddress();
69 void CFbsBitmapAsyncStreamer::DoLoadL(const TDesC& aFilename,TInt32 aId)
71 iStore=CDirectFileStore::OpenL(iFbs->FileServer(),aFilename,EFileShareReadersOnly);
72 if (iStore->Type()[1]!=KMultiBitmapFileImageUid)
73 User::LeaveIfError(KErrGeneral);
74 TStreamId streamid=iStore->Root();
75 RStoreReadStream readstream;
76 readstream.OpenL(*iStore,streamid);
77 TInt numbitmaps=readstream.ReadInt32L();
79 User::Leave(KErrUnknown);
80 TStreamId bmpstreamid;
81 bmpstreamid.InternalizeL(readstream);
82 for(TInt count=0;count<aId;count++)
83 bmpstreamid.InternalizeL(readstream);
85 iReadStream.OpenL(*iStore,bmpstreamid);
86 CBitwiseBitmap::InternalizeHeaderL(iReadStream,iHeader);
89 EXPORT_C TBool CFbsBitmapAsyncStreamer::LoadScanLinesL(TInt aNumberOfScanLines,CFbsBitmap*& aBitmap)
91 if(iMode!=ELoad || iBitmap==NULL) User::Leave(KErrGeneral);
92 if(iHeader.iCompression!=ENoBitmapCompression)
94 TRAP_IGNORE(iBitmap->Address()->DoInternalizeL(iReadStream,iHeader.iBitmapSize-iHeader.iStructSize,iBitmap->DataAddress()));
95 iBitmap->EndDataAccess(EFalse);
100 aNumberOfScanLines=Abs(aNumberOfScanLines);
101 if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
102 aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
103 TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
104 TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
105 iReadStream.ReadL(sladd,aNumberOfScanLines*slbytes);
106 iCurrentScanLine+=aNumberOfScanLines;
107 if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
109 iBitmap->EndDataAccess(EFalse);
117 EXPORT_C TInt CFbsBitmapAsyncStreamer::Save(const TDesC& aFilename,CFbsBitmap* aBitmap,TInt32& aId,TInt& aScanLines)
119 if(iMode!=ESave || aBitmap==NULL || !aBitmap->iHandle) return(KErrGeneral);
121 TInt ret=file.Replace(iFbs->FileServer(),aFilename,EFileWrite);
122 if(ret!=KErrNone) return(ret);
123 iHeader=aBitmap->Header();
125 iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
127 TRAP(ret,DoSaveL(file));
128 if(ret!=KErrNone) return(ret);
131 iBitmap->BeginDataAccess();
132 aScanLines=iHeader.iSizeInPixels.iHeight;
133 iScanLineBase=(TUint32*)aBitmap->DataAddress();
137 void CFbsBitmapAsyncStreamer::DoSaveL(RFile& aFile)
139 iStore=CDirectFileStore::NewL(aFile);
140 TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
141 iStore->SetTypeL(uidtype);
142 iId=iWriteStream.CreateL(*iStore);
143 iWriteStream.WriteInt32L(iHeader.iBitmapSize);
144 iWriteStream.WriteInt32L(iHeader.iStructSize);
145 iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iWidth);
146 iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iHeight);
147 iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iWidth);
148 iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iHeight);
149 iWriteStream.WriteInt32L(iHeader.iBitsPerPixel);
150 iWriteStream.WriteUint32L(iHeader.iColor);
151 iWriteStream.WriteInt32L(0);
152 iWriteStream.WriteUint32L(iHeader.iCompression);
155 EXPORT_C TBool CFbsBitmapAsyncStreamer::SaveScanLinesL(TInt aNumberOfScanLines)
157 if(iMode!=ESave || iBitmap==NULL) User::Leave(KErrGeneral);
158 aNumberOfScanLines=Abs(aNumberOfScanLines);
159 if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
160 aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
161 TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
162 TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
163 iWriteStream.WriteL(sladd,aNumberOfScanLines*slbytes);
164 iCurrentScanLine+=aNumberOfScanLines;
165 if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
167 iBitmap->EndDataAccess(ETrue);
168 iWriteStream.Close();
169 TStreamId headstreamid=iWriteStream.CreateL(*iStore);
170 iWriteStream.WriteInt32L(1); // number of bitmaps
171 iId.ExternalizeL(iWriteStream); // stream id of bitmap
172 iWriteStream.Close();
173 iStore->SetRootL(headstreamid);