os/graphics/fbs/fontandbitmapserver/sfbs/BMPASTR.CPP
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <s32file.h>
sl@0
    17
#include <fbs.h>
sl@0
    18
#include <bitmap.h>
sl@0
    19
#include <graphics/bitmapuid.h>
sl@0
    20
#include "fbsbitmapasyncstreamer.h"
sl@0
    21
sl@0
    22
CFbsBitmapAsyncStreamer::CFbsBitmapAsyncStreamer(TMode aMode):
sl@0
    23
	CBase(),
sl@0
    24
	iFbs(RFbsSession::GetSession()),
sl@0
    25
	iMode(aMode)
sl@0
    26
	{}
sl@0
    27
sl@0
    28
EXPORT_C CFbsBitmapAsyncStreamer::~CFbsBitmapAsyncStreamer()
sl@0
    29
	{
sl@0
    30
	iReadStream.Close();
sl@0
    31
	iWriteStream.Close();
sl@0
    32
	delete iStore;
sl@0
    33
	if(iMode==ELoad) delete iBitmap;
sl@0
    34
	}
sl@0
    35
sl@0
    36
EXPORT_C CFbsBitmapAsyncStreamer* CFbsBitmapAsyncStreamer::NewL(TMode aMode)
sl@0
    37
	{
sl@0
    38
	CFbsBitmapAsyncStreamer* thisptr=new(ELeave) CFbsBitmapAsyncStreamer(aMode);
sl@0
    39
	CleanupStack::PushL(thisptr);
sl@0
    40
	thisptr->ConstructL();
sl@0
    41
	CleanupStack::Pop();
sl@0
    42
	return(thisptr);
sl@0
    43
	}
sl@0
    44
sl@0
    45
void CFbsBitmapAsyncStreamer::ConstructL()
sl@0
    46
	{
sl@0
    47
	if(iMode==ELoad) iBitmap=new(ELeave) CFbsBitmap;
sl@0
    48
	}
sl@0
    49
sl@0
    50
EXPORT_C TInt CFbsBitmapAsyncStreamer::Load(const TDesC& aFilename,TInt32 aId,TInt& aScanLines)
sl@0
    51
	{
sl@0
    52
	if(iMode!=ELoad) return(KErrGeneral);
sl@0
    53
sl@0
    54
	TRAPD(ret,DoLoadL(aFilename,aId));
sl@0
    55
	if(ret!=KErrNone) return(ret);
sl@0
    56
sl@0
    57
	iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
sl@0
    58
sl@0
    59
	ret=iBitmap->Create(iHeader.iSizeInPixels,iDispMode);
sl@0
    60
	iBitmap->BeginDataAccess();
sl@0
    61
	iBitmap->Address()->iHeader=iHeader;
sl@0
    62
	if(ret!=KErrNone) return(ret);
sl@0
    63
sl@0
    64
	aScanLines=iHeader.iSizeInPixels.iHeight;
sl@0
    65
	iScanLineBase=(TUint32*)iBitmap->DataAddress();
sl@0
    66
	return(KErrNone);
sl@0
    67
	}
sl@0
    68
sl@0
    69
void CFbsBitmapAsyncStreamer::DoLoadL(const TDesC& aFilename,TInt32 aId)
sl@0
    70
	{
sl@0
    71
	iStore=CDirectFileStore::OpenL(iFbs->FileServer(),aFilename,EFileShareReadersOnly);
sl@0
    72
	if (iStore->Type()[1]!=KMultiBitmapFileImageUid)
sl@0
    73
		User::LeaveIfError(KErrGeneral);
sl@0
    74
	TStreamId streamid=iStore->Root();
sl@0
    75
	RStoreReadStream readstream;
sl@0
    76
	readstream.OpenL(*iStore,streamid);
sl@0
    77
	TInt numbitmaps=readstream.ReadInt32L();
sl@0
    78
	if(numbitmaps<aId+1)
sl@0
    79
		User::Leave(KErrUnknown);
sl@0
    80
	TStreamId bmpstreamid;
sl@0
    81
	bmpstreamid.InternalizeL(readstream);
sl@0
    82
	for(TInt count=0;count<aId;count++)
sl@0
    83
		bmpstreamid.InternalizeL(readstream);
sl@0
    84
	readstream.Close();
sl@0
    85
	iReadStream.OpenL(*iStore,bmpstreamid);
sl@0
    86
	CBitwiseBitmap::InternalizeHeaderL(iReadStream,iHeader);
sl@0
    87
	}
sl@0
    88
sl@0
    89
EXPORT_C TBool CFbsBitmapAsyncStreamer::LoadScanLinesL(TInt aNumberOfScanLines,CFbsBitmap*& aBitmap)
sl@0
    90
	{
sl@0
    91
	if(iMode!=ELoad || iBitmap==NULL) User::Leave(KErrGeneral);
sl@0
    92
	if(iHeader.iCompression!=ENoBitmapCompression)
sl@0
    93
		{
sl@0
    94
		TRAP_IGNORE(iBitmap->Address()->DoInternalizeL(iReadStream,iHeader.iBitmapSize-iHeader.iStructSize,iBitmap->DataAddress()));
sl@0
    95
		iBitmap->EndDataAccess(EFalse);
sl@0
    96
		aBitmap=iBitmap;
sl@0
    97
		iBitmap=NULL;
sl@0
    98
		return(ETrue);
sl@0
    99
		}
sl@0
   100
	aNumberOfScanLines=Abs(aNumberOfScanLines);
sl@0
   101
	if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
sl@0
   102
		aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
sl@0
   103
	TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
sl@0
   104
	TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
sl@0
   105
	iReadStream.ReadL(sladd,aNumberOfScanLines*slbytes);
sl@0
   106
	iCurrentScanLine+=aNumberOfScanLines;
sl@0
   107
	if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
sl@0
   108
		{
sl@0
   109
		iBitmap->EndDataAccess(EFalse);
sl@0
   110
		aBitmap=iBitmap;
sl@0
   111
		iBitmap=NULL;
sl@0
   112
		return(ETrue);
sl@0
   113
		}
sl@0
   114
	return(EFalse);
sl@0
   115
	}
sl@0
   116
sl@0
   117
EXPORT_C TInt CFbsBitmapAsyncStreamer::Save(const TDesC& aFilename,CFbsBitmap* aBitmap,TInt32& aId,TInt& aScanLines)
sl@0
   118
	{
sl@0
   119
	if(iMode!=ESave || aBitmap==NULL || !aBitmap->iHandle) return(KErrGeneral);
sl@0
   120
	RFile file;
sl@0
   121
	TInt ret=file.Replace(iFbs->FileServer(),aFilename,EFileWrite);
sl@0
   122
	if(ret!=KErrNone) return(ret);
sl@0
   123
	iHeader=aBitmap->Header();
sl@0
   124
sl@0
   125
	iDispMode = CBitwiseBitmap::DisplayMode(iHeader.iBitsPerPixel,iHeader.iColor);
sl@0
   126
sl@0
   127
	TRAP(ret,DoSaveL(file));
sl@0
   128
	if(ret!=KErrNone) return(ret);
sl@0
   129
	aId=0;
sl@0
   130
	iBitmap=aBitmap;
sl@0
   131
	iBitmap->BeginDataAccess();
sl@0
   132
	aScanLines=iHeader.iSizeInPixels.iHeight;
sl@0
   133
	iScanLineBase=(TUint32*)aBitmap->DataAddress();
sl@0
   134
	return(KErrNone);
sl@0
   135
	}
sl@0
   136
sl@0
   137
void CFbsBitmapAsyncStreamer::DoSaveL(RFile& aFile)
sl@0
   138
	{
sl@0
   139
	iStore=CDirectFileStore::NewL(aFile);
sl@0
   140
	TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
sl@0
   141
	iStore->SetTypeL(uidtype);
sl@0
   142
	iId=iWriteStream.CreateL(*iStore);
sl@0
   143
	iWriteStream.WriteInt32L(iHeader.iBitmapSize);
sl@0
   144
	iWriteStream.WriteInt32L(iHeader.iStructSize);
sl@0
   145
	iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iWidth);
sl@0
   146
	iWriteStream.WriteInt32L(iHeader.iSizeInPixels.iHeight);
sl@0
   147
	iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iWidth);
sl@0
   148
	iWriteStream.WriteInt32L(iHeader.iSizeInTwips.iHeight);
sl@0
   149
	iWriteStream.WriteInt32L(iHeader.iBitsPerPixel);
sl@0
   150
	iWriteStream.WriteUint32L(iHeader.iColor);
sl@0
   151
	iWriteStream.WriteInt32L(0);
sl@0
   152
	iWriteStream.WriteUint32L(iHeader.iCompression);
sl@0
   153
	}
sl@0
   154
sl@0
   155
EXPORT_C TBool CFbsBitmapAsyncStreamer::SaveScanLinesL(TInt aNumberOfScanLines)
sl@0
   156
	{
sl@0
   157
	if(iMode!=ESave || iBitmap==NULL) User::Leave(KErrGeneral);
sl@0
   158
	aNumberOfScanLines=Abs(aNumberOfScanLines);
sl@0
   159
	if(aNumberOfScanLines+iCurrentScanLine>iHeader.iSizeInPixels.iHeight)
sl@0
   160
		aNumberOfScanLines=iHeader.iSizeInPixels.iHeight-iCurrentScanLine;
sl@0
   161
	TInt slbytes = CBitwiseBitmap::ByteWidth(iHeader.iSizeInPixels.iWidth,iDispMode);
sl@0
   162
	TUint8* sladd=(TUint8*)iBitmap->Address()->ScanLineAddress(iScanLineBase,iCurrentScanLine);
sl@0
   163
	iWriteStream.WriteL(sladd,aNumberOfScanLines*slbytes);
sl@0
   164
	iCurrentScanLine+=aNumberOfScanLines;
sl@0
   165
	if(iCurrentScanLine==iHeader.iSizeInPixels.iHeight)
sl@0
   166
		{
sl@0
   167
		iBitmap->EndDataAccess(ETrue);
sl@0
   168
		iWriteStream.Close();
sl@0
   169
		TStreamId headstreamid=iWriteStream.CreateL(*iStore);
sl@0
   170
		iWriteStream.WriteInt32L(1); // number of bitmaps
sl@0
   171
		iId.ExternalizeL(iWriteStream); // stream id of bitmap
sl@0
   172
		iWriteStream.Close();
sl@0
   173
		iStore->SetRootL(headstreamid);
sl@0
   174
		delete iStore;
sl@0
   175
		iStore=NULL;
sl@0
   176
		return(ETrue);
sl@0
   177
		}
sl@0
   178
	return(EFalse);
sl@0
   179
	}
sl@0
   180