fbs/fontandbitmapserver/sfbs/FBSBMP.CPP
branchRCL_3
changeset 18 57c618273d5c
parent 0 5d03bc08d59c
child 19 bbf46f59e123
equal deleted inserted replaced
17:e375a7921169 18:57c618273d5c
     1 // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
     1 // Copyright (c) 1995-2010 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
    23 #include "fbshelper.h"
    23 #include "fbshelper.h"
    24 #include "fbsrasterizer.h"
    24 #include "fbsrasterizer.h"
    25 #include "BitwiseBitmap.inl"
    25 #include "BitwiseBitmap.inl"
    26 #include "fbsmessage.h"
    26 #include "fbsmessage.h"
    27 #include "bitmapconst.h"
    27 #include "bitmapconst.h"
       
    28 #include "OstTraceDefinitions.h"
       
    29 #include "fbstrace.h"
       
    30 #ifdef OST_TRACE_COMPILER_IN_USE
       
    31 #include "FBSBMPTraces.h"
       
    32 #endif
    28 
    33 
    29 const TInt KMaxPixelSize = KMaxTInt / 4; // Maximum pixel size to avoid some overflow problems
    34 const TInt KMaxPixelSize = KMaxTInt / 4; // Maximum pixel size to avoid some overflow problems
    30 const TInt KMaxBitmapHandleBufferSize = KNumBytesPerBitmapHandle * 2000; 	// Maximum size of buffer to store all bitmap handles.
    35 const TInt KMaxBitmapHandleBufferSize = KNumBytesPerBitmapHandle * 2000; 	// Maximum size of buffer to store all bitmap handles.
    31 
    36 
    32 GLREF_C void Panic(TFbsPanic aPanic);
    37 GLREF_C void Panic(TFbsPanic aPanic);
    93 @publishedAll
    98 @publishedAll
    94 @released
    99 @released
    95 */
   100 */
    96 EXPORT_C void CFbsBitmap::Reset()
   101 EXPORT_C void CFbsBitmap::Reset()
    97 	{
   102 	{
       
   103     FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);)
       
   104     FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_RESET_ENTRY, "> this=0x%08x; iH=0x%08x; iSH=0x%08x; iSSH=0x%08x", (TUint)this, iHandle, iServerHandle, ssh );)
    98 	if (iHandle && !(iFlags & EIsRomBitmap))
   105 	if (iHandle && !(iFlags & EIsRomBitmap))
    99 		{
   106 		{
   100 		iFbs->SendCommand(EFbsMessClose, iHandle, Handle());
   107 		iFbs->SendCommand(EFbsMessClose, iHandle, Handle());
   101 		iFbs->iHelper->RemoveBitmap(*this);
   108 		iFbs->iHelper->RemoveBitmap(*this);
   102 		}
   109 		}
   112 	iAddressPointer = NULL;
   119 	iAddressPointer = NULL;
   113 	iFlags = 0;
   120 	iFlags = 0;
   114 	iUseCount = 0;
   121 	iUseCount = 0;
   115 	iHandle = 0;
   122 	iHandle = 0;
   116 	iServerHandle = 0;
   123 	iServerHandle = 0;
       
   124 	FBS_OST(OstTrace1( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_RESET_EXIT, "< this=0x%08x", (TUint)this );)
   117 	}
   125 	}
   118 	
   126 	
   119 /** Tests whether or not the bitmap is read-only.
   127 /** Tests whether or not the bitmap is read-only.
   120 @return ETrue if the bitmap is read-only, EFalse otherwise.
   128 @return ETrue if the bitmap is read-only, EFalse otherwise.
   121 @publishedAll
   129 @publishedAll
   252 @publishedAll
   260 @publishedAll
   253 @released
   261 @released
   254 */
   262 */
   255 EXPORT_C TInt CFbsBitmap::Create(const TSize& aSizeInPixels,TDisplayMode aDispMode)
   263 EXPORT_C TInt CFbsBitmap::Create(const TSize& aSizeInPixels,TDisplayMode aDispMode)
   256 	{
   264 	{
   257 	return DoCreate(aSizeInPixels,aDispMode,KUidCFbsBitmapCreation);
   265     FBS_OST(OstTraceExt4(GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATE_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode); ) 
       
   266 	TInt err = DoCreate(aSizeInPixels,aDispMode,KUidCFbsBitmapCreation);
       
   267     FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);)
       
   268 	FBS_OST(OstTraceExt5(GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATE_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x; iSSH=0x%08x", (TUint)this, err, iHandle, iServerHandle, ssh); )
       
   269     return err;
   258 	}
   270 	}
   259 
   271 
   260 TInt CFbsBitmap::DoCreate(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aUid, TInt aDataSize)
   272 TInt CFbsBitmap::DoCreate(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aUid, TInt aDataSize)
   261 	{
   273 	{
   262 	if(!iFbs) return(KErrCouldNotConnect);
   274 	if(!iFbs) return(KErrCouldNotConnect);
   303 @publishedAll
   315 @publishedAll
   304 @released
   316 @released
   305 */
   317 */
   306 EXPORT_C TInt CFbsBitmap::CreateHardwareBitmap(const TSize& aSizeInPixels,TDisplayMode aDispMode,TUid aCreatorUid)
   318 EXPORT_C TInt CFbsBitmap::CreateHardwareBitmap(const TSize& aSizeInPixels,TDisplayMode aDispMode,TUid aCreatorUid)
   307 	{
   319 	{
   308 	return DoCreate(aSizeInPixels,aDispMode,aCreatorUid);
   320     FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEHARDWAREBITMAP_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d; uid=0x%08x", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode, aCreatorUid.iUid);)
       
   321 	TInt err = DoCreate(aSizeInPixels,aDispMode,aCreatorUid);
       
   322     FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);)
       
   323 	FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEHARDWAREBITMAP_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x; iSSH=0x%08x", (TUint)this, err, iHandle, iServerHandle, ssh);)
       
   324 	return err;
   309 	}
   325 	}
   310 
   326 
   311 /** Resets the pixel-size of the bitmap.
   327 /** Resets the pixel-size of the bitmap.
   312 If the new size is bigger than the old, the original bitmap is still situated 
   328 If the new size is bigger than the old, the original bitmap is still situated 
   313 at (0,0), but pixels outside the range of the old pixel-size are set to zero.
   329 at (0,0), but pixels outside the range of the old pixel-size are set to zero.
   404 with the specified handle number.
   420 with the specified handle number.
   405 @publishedAll
   421 @publishedAll
   406 @released
   422 @released
   407 @see CFbsBitmap::Handle()
   423 @see CFbsBitmap::Handle()
   408 */
   424 */
   409 EXPORT_C TInt CFbsBitmap::Duplicate(TInt aBitmapHandle)
   425 EXPORT_C TInt CFbsBitmap::Duplicate(TInt aBitmapHandle)	
   410 		{
   426     {
       
   427     TInt ret = KErrNone;
       
   428     FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_DUPLICATE_ENTRY, "> this=0x%08x; iH=0x%08x;", (TUint)this, aBitmapHandle);)
   411 	if(!iFbs) 
   429 	if(!iFbs) 
   412 		{
   430 		{
   413 		return(KErrCouldNotConnect);
   431 		ret = KErrCouldNotConnect;
   414 		}
   432 		FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR, "! this=0x%08x; !iFbs", (TUint)this);)
   415 	if(!aBitmapHandle) 
   433 		}
   416 		{
   434 	else if(!aBitmapHandle) 
   417 		return(KErrUnknown);
   435 		{
   418 		}
   436 		ret = KErrUnknown;
   419 	Reset();
   437 		FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR2, "! this=0x%08x; !aBitmapHandle", (TUint)this);)
   420 	TBool isinrom=EFalse;
   438 		}
   421 	TInt ret=User::IsRomAddress(isinrom,(TAny*)aBitmapHandle);
   439     else
   422 	if(ret!=KErrNone) 
   440         {
   423 		{
   441         TBool isinrom = EFalse;
   424 		return(KErrUnknown);
   442         ret = User::IsRomAddress(isinrom, (TAny*)aBitmapHandle);
   425 		}
   443         if (ret == KErrNone)
   426 	if(isinrom)
   444             {
   427 		{
   445             if (isinrom)
   428 		if (((CBitwiseBitmap*)aBitmapHandle)->Uid() != KCBitwiseBitmapUid)
   446                 {
   429 			return(KErrUnknown);
   447                 ret = DuplicateInRom(aBitmapHandle);
   430 		iAddressPointer = (CBitwiseBitmap*)aBitmapHandle;
   448                 FBS_OST_IF(ret != KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR4, "! this=0x%08x; DuplicateInRom() returned %d;", (TUint)this, ret);)
   431 		iFlags = EIsRomBitmap;
   449                 }
   432 		iHandle=1;
   450             else
   433 		return iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth + 4);
   451                 {
   434 		}
   452                 ret = DuplicateInRam(aBitmapHandle);
   435 	TPckgBuf<TBmpHandles> b;
   453                 FBS_OST_IF(ret != KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR5, "! this=0x%08x; DuplicateInRam() returned %d;", (TUint)this, ret);)
   436 	TIpcArgs args(aBitmapHandle,&b);
   454                 }
   437 	ret=iFbs->SendCommand(EFbsMessBitmapDuplicate,args);
   455             }
   438 	if(ret!=KErrNone) 
   456         else 
   439 		{
   457             {
   440 		return(ret);
   458             FBS_OST(OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATE_ERROR3, "! this=0x%08x; IsRomAddress() returned %d", (TUint)this, ret);)
   441 		}
   459             ret = KErrUnknown;
   442 	iHandle=b().iHandle;
   460             }
   443 	iServerHandle=b().iServerHandle;
   461         }
   444 	iAddressPointer=(CBitwiseBitmap*)(iFbs->HeapBase()+b().iAddressOffset);
   462     FBS_OST(TInt ssh = (iFbs ? iFbs->ServerSessionHandle() : 0);)
   445 	if (iAddressPointer->iUid.iUid != KCBitwiseBitmapUid.iUid && iAddressPointer->iUid.iUid != KCBitwiseBitmapHardwareUid.iUid)
   463     FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_DUPLICATE_EXIT, "< this=0x%08x; iH=0x%08x; iSH=0x%08x; ret=%d; iSSH=0x%08x", (TUint)this, iHandle, iServerHandle, ret, ssh);)
   446 		{
   464 	return ret;
   447 		iFlags = EIsExtendedBitmap;
   465     }
   448 		}
   466 
   449 	ret = iFbs->iHelper->AddBitmap(*this);
   467 /** Duplicates a bitmap where the bitmap handle refers to a rom bitmap.
   450 	if (ret != KErrNone)
   468 @param aBitmapHandle A valid Rom bitmap handle.
   451 		{
   469 @return KErrNone on success.
   452 		return ret;
   470  */
   453 		}
   471 TInt CFbsBitmap::DuplicateInRom(TInt aBitmapHandle)
   454 	return iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth+4);
   472     {
   455 	}
   473     TInt ret = KErrNone;
       
   474     Reset();
       
   475     TUid uid = ((CBitwiseBitmap*)aBitmapHandle)->Uid();
       
   476     if (uid != KCBitwiseBitmapUid)
       
   477         {
       
   478         FBS_OST(OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINROM_ERROR, "! this=0x%08x; 0x%08x != KCBitwiseBitmapUid", (TUint)this, (TUint)uid.iUid);)
       
   479         ret = KErrUnknown;
       
   480         }
       
   481     else
       
   482         {
       
   483         iAddressPointer = (CBitwiseBitmap*)aBitmapHandle;
       
   484         iFlags = EIsRomBitmap;
       
   485         iHandle=1;
       
   486         ret = iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth + 4);
       
   487         FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINROM_ERROR2, "! this=0x%08x; AllocScanLineBuffer() returned %d", (TUint)this, ret);)
       
   488         }
       
   489     return ret;
       
   490     }
       
   491 
       
   492 /** Duplicates a bitmap where the bitmap handle refers to a ram bitmap
       
   493 @param aBitmapHandle A valid Ram bitmap handle.
       
   494 @return KErrNone on success.
       
   495  */
       
   496 TInt CFbsBitmap::DuplicateInRam(TInt aBitmapHandle)
       
   497     {
       
   498     TInt ret = KErrNone;
       
   499     Reset();
       
   500      
       
   501     TPckgBuf<TBmpHandles> b;
       
   502     TIpcArgs args(aBitmapHandle,&b);
       
   503     ret=iFbs->SendCommand(EFbsMessBitmapDuplicate,args);
       
   504     FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINRAM_ERROR, "! this=0x%08x; SendCommand(EFbsMessBitmapDuplicate) returned %d", (TUint)this, ret);)
       
   505     if(ret==KErrNone) 
       
   506         {
       
   507         iHandle=b().iHandle;
       
   508         iServerHandle=b().iServerHandle;
       
   509         iAddressPointer=(CBitwiseBitmap*)(iFbs->HeapBase()+b().iAddressOffset);
       
   510         if (iAddressPointer->iUid.iUid != KCBitwiseBitmapUid.iUid && iAddressPointer->iUid.iUid != KCBitwiseBitmapHardwareUid.iUid)
       
   511             {
       
   512             iFlags = EIsExtendedBitmap;
       
   513             }
       
   514         ret = iFbs->iHelper->AddBitmap(*this);
       
   515         FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINRAM_ERROR2, "! this=0x%08x; AddBitmap() returned %d", (TUint)this, ret);)
       
   516         if (ret == KErrNone)
       
   517             {
       
   518             ret = iFbs->AllocScanLineBuffer(iAddressPointer->iByteWidth+4);
       
   519             FBS_OST_IF(ret!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_DUPLICATEINRAM_ERROR3, "! this=0x%08x; AllocScanLineBuffer() returned %d", (TUint)this, ret);)
       
   520             }
       
   521         }
       
   522     return ret;
       
   523     }
   456 
   524 
   457 /** Loads a specific bitmap from a multi-bitmap file.
   525 /** Loads a specific bitmap from a multi-bitmap file.
   458 The bitmap may be shared by other font and bitmap server clients.
   526 The bitmap may be shared by other font and bitmap server clients.
   459 @param aFileName The filename of the multi-bitmap (.mbm) file. 
   527 @param aFileName The filename of the multi-bitmap (.mbm) file. 
   460 @param aId The bitmap identifier.
   528 @param aId The bitmap identifier.
   465 @publishedAll
   533 @publishedAll
   466 @released
   534 @released
   467 */	
   535 */	
   468 EXPORT_C TInt CFbsBitmap::Load(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded)
   536 EXPORT_C TInt CFbsBitmap::Load(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded)
   469 	{
   537 	{
   470 	return Load(aFileName,aId,aShareIfLoaded,0);
   538     FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD_ENTRY, "> this=0x%08x; file=%S, id=0x%08x; share=%d", (TUint)this, aFileName, aId, aShareIfLoaded);)
       
   539 	TInt err = Load(aFileName,aId,aShareIfLoaded,0);
       
   540     FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);)
       
   541 	return err; 
   471 	}
   542 	}
   472 
   543 
   473 /**  Loads a specific bitmap from a multi-bitmap file.
   544 /**  Loads a specific bitmap from a multi-bitmap file.
   474 The bitmap may be shared by other font and bitmap server clients.
   545 The bitmap may be shared by other font and bitmap server clients.
   475 @param aFileName The filename of the multi-bitmap (.mbm) file.
   546 @param aFileName The filename of the multi-bitmap (.mbm) file.
   481 @publishedAll
   552 @publishedAll
   482 @released
   553 @released
   483 */	
   554 */	
   484 EXPORT_C TInt CFbsBitmap::Load(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
   555 EXPORT_C TInt CFbsBitmap::Load(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
   485 	{
   556 	{
       
   557     TInt err = KErrNone;
       
   558     FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD2_ENTRY, "> this=0x%08x; file=%S, id=0x%08x; share=%d; off=%d", (TUint)this, aFileName, aId, aShareIfLoaded, aFileOffset);)
   486 	if(!iFbs)
   559 	if(!iFbs)
   487 		{
   560 		{
   488 		return(KErrCouldNotConnect);
   561         FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR, "! this=0x%08x; !iFbs", (TUint)this);)
   489 		}
   562 		err = KErrCouldNotConnect;
   490 	Reset();
       
   491 	TUint32* rompointer = NULL;
       
   492 	//access using filename has the advantage of using rom address lookup cache
       
   493 	IsFileInRom(aFileName, rompointer);
       
   494 	TBool romPointerValid;
       
   495 	TInt err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid);
       
   496 	if(romPointerValid)
       
   497 		{
       
   498 		return err;
       
   499 		}
       
   500 	_LIT(KResourcePath, "?:\\Resource\\*");
       
   501 	TInt match = aFileName.MatchF(KResourcePath);
       
   502 	//if the file is in the resource directory we don't need to check capabilities and the file can just be opened on the server side.
       
   503 	if (match == 0)
       
   504 		{
       
   505 		err = DoLoad(aFileName,aId,aShareIfLoaded,aFileOffset);
       
   506 		}
   563 		}
   507 	else
   564 	else
   508 		{
   565 	    {
   509 		RFile file;
   566         Reset();
   510 		err = file.Open(iFbs->FileServer(),aFileName,EFileShareReadersOnly);
   567         TUint32* rompointer = NULL;
   511 		if (err!=KErrNone)
   568         //access using filename has the advantage of using rom address lookup cache
   512 			{
   569         IsFileInRom(aFileName, rompointer);
   513 			return err;
   570         TBool romPointerValid;
   514 			}
   571         err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid);
   515 		err = DoLoad(file,aId,aShareIfLoaded,aFileOffset);
   572         if(romPointerValid)
   516 		file.Close();
   573             {
   517 		}
   574             FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR2, "! this=0x%08x; romPointerValid", (TUint)this);)
       
   575             err = KErrCouldNotConnect;
       
   576             }
       
   577         else
       
   578             {
       
   579             _LIT(KResourcePath, "?:\\Resource\\*");
       
   580             TInt match = aFileName.MatchF(KResourcePath);
       
   581             //if the file is in the resource directory we don't need to check capabilities and the file can just be opened on the server side.
       
   582             if (match == 0)
       
   583                 {
       
   584                 err = DoLoad(aFileName,aId,aShareIfLoaded,aFileOffset);
       
   585                 FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR3, "! this=0x%08x; DoLoad returned %d", (TUint)this, err);)
       
   586                 }
       
   587             else
       
   588                 {
       
   589                 RFile file;
       
   590                 err = file.Open(iFbs->FileServer(),aFileName,EFileShareReadersOnly);
       
   591                 if (err==KErrNone)
       
   592                     {
       
   593                     err = DoLoad(file,aId,aShareIfLoaded,aFileOffset);
       
   594                     FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOAD2_ERROR4, "! this=0x%08x; DoLoad returned %d", (TUint)this, err);)
       
   595                     }
       
   596                 file.Close();
       
   597                 }
       
   598             }
       
   599 	    }
       
   600     FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD2_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);)
   518 	return err;
   601 	return err;
   519 	}
   602 	}
   520 
   603 
   521 /** Loads and compresses a specific bitmap from a multi-bitmap file.
   604 /** Loads and compresses a specific bitmap from a multi-bitmap file.
   522 The bitmap may be shared by other font and bitmap server clients.
   605 The bitmap may be shared by other font and bitmap server clients.
   530 @publishedAll 
   613 @publishedAll 
   531 @released
   614 @released
   532 */	
   615 */	
   533 EXPORT_C TInt CFbsBitmap::LoadAndCompress(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded)
   616 EXPORT_C TInt CFbsBitmap::LoadAndCompress(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded)
   534     {	
   617     {	
   535     return LoadAndCompress(aFileName, aId, aShareIfLoaded, 0);
   618     FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, aFileName, aId, aShareIfLoaded);)
       
   619     TInt ret = LoadAndCompress(aFileName, aId, aShareIfLoaded, 0);
       
   620     FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS_EXIT, "< this=0x%08x; err=%d", (TUint)this, ret);)
       
   621     return ret;
   536 	}
   622 	}
   537 
   623 
   538 /** Loads and compresses a specific bitmap from a multi-bitmap file.
   624 /** Loads and compresses a specific bitmap from a multi-bitmap file.
   539 The bitmap may be shared by other font and bitmap server clients. If the 
   625 The bitmap may be shared by other font and bitmap server clients. If the 
   540 bitmap is loaded from ROM then compression is not allowed.
   626 bitmap is loaded from ROM then compression is not allowed.
   547 codes. 
   633 codes. 
   548 @publishedAll 
   634 @publishedAll 
   549 @released
   635 @released
   550 */	
   636 */	
   551 EXPORT_C TInt CFbsBitmap::LoadAndCompress(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
   637 EXPORT_C TInt CFbsBitmap::LoadAndCompress(const TDesC& aFileName,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
   552     {	
   638     {
       
   639     FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS2_ENTRY, "> this=0x%08x; file=%S, id=0x%08x; share=%d; off=%d", (TUint)this, aFileName, aId, aShareIfLoaded, aFileOffset);)
   553 	TInt err = Load(aFileName,aId,aShareIfLoaded,aFileOffset);
   640 	TInt err = Load(aFileName,aId,aShareIfLoaded,aFileOffset);
   554 	if (err == KErrNone)
   641 	if (err == KErrNone)
   555 		{
   642 		{
   556 		err = !(iFlags & EIsRomBitmap) ? Compress() : KErrAccessDenied;
   643 		err = !(iFlags & EIsRomBitmap) ? Compress() : KErrAccessDenied;
   557 		}
   644 		FBS_OST_IF(err!=KErrNone, OstTraceExt3( TRACE_ERROR, CFBSBITMAP_LOADANDCOMPRESS2_ERROR, "! this=0x%08x; iFlags=0x%08x; err=%d", (TUint)this, (TUint)iFlags, err);)
       
   645 		}
       
   646 	FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS2_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);)
   558 	return err;
   647 	return err;
   559 	}
   648 	}
   560 
   649 
   561 /** Saves the bitmap as a direct file store.
   650 /** Saves the bitmap as a direct file store.
   562 The file store overwrites any existing file with the same name.
   651 The file store overwrites any existing file with the same name.
  1149 EXPORT_C TBool CFbsBitmap::IsCompressedInRAM() const
  1238 EXPORT_C TBool CFbsBitmap::IsCompressedInRAM() const
  1150 	{
  1239 	{
  1151 	CBitwiseBitmap* bitmap = CleanAddress();
  1240 	CBitwiseBitmap* bitmap = CleanAddress();
  1152 	if (bitmap==NULL)
  1241 	if (bitmap==NULL)
  1153 		{
  1242 		{
  1154 			return EFalse;
  1243 		return EFalse;
  1155 		}	
  1244 		}	
  1156 	return bitmap->IsCompressedInRAM();
  1245 	return bitmap->IsCompressedInRAM();
  1157 	}
  1246 	}
  1158 
  1247 
  1159 /** Gets the twip-size of the bitmap.
  1248 /** Gets the twip-size of the bitmap.
  1248 @see CFbsBitmap::DataAddress()
  1337 @see CFbsBitmap::DataAddress()
  1249 @see CFbsBitmap::EndDataAccess()
  1338 @see CFbsBitmap::EndDataAccess()
  1250 */
  1339 */
  1251 EXPORT_C void CFbsBitmap::BeginDataAccess() const
  1340 EXPORT_C void CFbsBitmap::BeginDataAccess() const
  1252 	{
  1341 	{
  1253 	if (!iHandle)
  1342     FBS_OST_VERBOSE(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_BEGINDATAACCESS_ENTRY, "> this=0x%08x;", (TUint)this););
  1254 		return;
  1343 	FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_BEGINDATAACCESS_ERROR, "! this=0x%08x; !iHandle", (TUint)this););
  1255 	(void)CleanAddress();	//called for side-effect to make sure bitmap reference is current. Should be low overhead.
  1344 	
  1256 	const_cast<CFbsBitmap*>(this)->iUseCount++;
  1345 	if (iHandle)
       
  1346 	    {
       
  1347         (void)CleanAddress();	//called for side-effect to make sure bitmap reference is current. Should be low overhead.
       
  1348         const_cast<CFbsBitmap*>(this)->iUseCount++;
       
  1349 	    }
       
  1350     
       
  1351 	FBS_OST_VERBOSE(OstTraceExt2(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_BEGINDATAACCESS_EXIT, "< this=0x%08x; iUseCount=%d;", (TUint)this, const_cast<CFbsBitmap*>(this)->iUseCount);)
  1257 	}
  1352 	}
  1258 
  1353 
  1259 /** Marks the end of direct access to the bitmap data.
  1354 /** Marks the end of direct access to the bitmap data.
  1260 Use this function after ending direct access to the bitmap data.
  1355 Use this function after ending direct access to the bitmap data.
  1261 Calls to EndDataAccess() must correspond to prior calls to BeginDataAccess().
  1356 Calls to EndDataAccess() must correspond to prior calls to BeginDataAccess().
  1269 @param aReadOnly True if the bitmap data had only been read.  False if the data has been modified.
  1364 @param aReadOnly True if the bitmap data had only been read.  False if the data has been modified.
  1270 @see CFbsBitmap::BeginDataAccess()
  1365 @see CFbsBitmap::BeginDataAccess()
  1271 */
  1366 */
  1272 EXPORT_C void CFbsBitmap::EndDataAccess(TBool aReadOnly) const
  1367 EXPORT_C void CFbsBitmap::EndDataAccess(TBool aReadOnly) const
  1273 	{
  1368 	{
  1274 	if (!iHandle)
  1369     FBS_OST_VERBOSE(OstTraceExt2(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_ENDDATAACCESS_ENTRY, "> this=0x%08x; aReadOnly=%d;", (TUint)this, (TUint)aReadOnly);)
  1275 		return;
  1370     FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_ENDDATAACCESS_ERROR, "! this=0x%08x; !iHandle", (TUint)this););
  1276 	const_cast<CFbsBitmap*>(this)->iUseCount--;
  1371     if (iHandle)
  1277 	if (!aReadOnly && !(iFlags & EIsReadOnlyBitmapMask))
  1372         {
  1278 		User::LockedInc(iAddressPointer->Extra()->iTouchCount);
  1373         const_cast<CFbsBitmap*>(this)->iUseCount--;
       
  1374         if (!aReadOnly && !(iFlags & EIsReadOnlyBitmapMask))
       
  1375             {
       
  1376             User::LockedInc(iAddressPointer->Extra()->iTouchCount);
       
  1377             }
       
  1378         }
       
  1379     FBS_OST_VERBOSE(OstTraceExt2(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_ENDDATAACCESS_EXIT, "< this=0x%08x; iUseCount=%d;", (TUint)this, const_cast<CFbsBitmap*>(this)->iUseCount);)
  1279 	}
  1380 	}
  1280 
  1381 
  1281 /** Locks the global bitmap heap.
  1382 /** Locks the global bitmap heap.
  1282 This function is deprecated, since it is no longer necessary to lock the global
  1383 This function is deprecated, since it is no longer necessary to lock the global
  1283 bitmap heap to prevent the pixel data from being moved in memory asynchronously,
  1384 bitmap heap to prevent the pixel data from being moved in memory asynchronously,
  1297 @see CFbsBitmap::UnlockHeap()
  1398 @see CFbsBitmap::UnlockHeap()
  1298 @see CFbsBitmap::BeginDataAccess()
  1399 @see CFbsBitmap::BeginDataAccess()
  1299 */
  1400 */
  1300 EXPORT_C void CFbsBitmap::LockHeap(TBool /*aAlways*/) const
  1401 EXPORT_C void CFbsBitmap::LockHeap(TBool /*aAlways*/) const
  1301 	{
  1402 	{
       
  1403     FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAP_ENTRY, "> this=0x%08x;", (TUint)this);)
  1302 	BeginDataAccess();
  1404 	BeginDataAccess();
  1303 #ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP
  1405 #ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP
  1304 	//These debug checks now refer to the cleaned data address
  1406 	//These debug checks now refer to the cleaned data address
  1305 	if (!iHandle)
  1407     FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_LOCKHEAP_ERROR, "! this=0x%08x; !iHandle", (TUint)this););
  1306 		return;
  1408 	if (iHandle && !(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps
  1307 	if (!(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps
       
  1308 		{
  1409 		{
  1309 		TThreadId threadId = RThread().Id();
  1410 		TThreadId threadId = RThread().Id();
  1310 		iFbs->iHelper->iDebugMutex.Wait();
  1411 		iFbs->iHelper->iDebugMutex.Wait();
  1311 		if (iAddressPointer->Extra()->iLockCount++ == 0)
  1412 		if (iAddressPointer->Extra()->iLockCount++ == 0)
  1312 			{
  1413 			{
  1316 		else
  1417 		else
  1317 			__ASSERT_ALWAYS(iAddressPointer->Extra()->iThreadId == threadId, Panic(EFbsPanicBadHeapLock));
  1418 			__ASSERT_ALWAYS(iAddressPointer->Extra()->iThreadId == threadId, Panic(EFbsPanicBadHeapLock));
  1318 		iFbs->iHelper->iDebugMutex.Signal();
  1419 		iFbs->iHelper->iDebugMutex.Signal();
  1319 		}
  1420 		}
  1320 #endif
  1421 #endif
       
  1422 	FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAP_EXIT, "< this=0x%08x;", (TUint)this);)
  1321 	}
  1423 	}
  1322 
  1424 
  1323 /** Unlocks the global heap. 
  1425 /** Unlocks the global heap. 
  1324 This function is deprecated. See LockHeap() for more details.
  1426 This function is deprecated. See LockHeap() for more details.
  1325 Calls to UnlockHeap() should be replaced by calls to EndDataAccess().
  1427 Calls to UnlockHeap() should be replaced by calls to EndDataAccess().
  1330 @see CFbsBitmap::LockHeap()
  1432 @see CFbsBitmap::LockHeap()
  1331 @see CFbsBitmap::EndDataAccess()
  1433 @see CFbsBitmap::EndDataAccess()
  1332 */
  1434 */
  1333 EXPORT_C void CFbsBitmap::UnlockHeap(TBool /*aAlways*/) const
  1435 EXPORT_C void CFbsBitmap::UnlockHeap(TBool /*aAlways*/) const
  1334 	{
  1436 	{
       
  1437     FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP_ENTRY, "> this=0x%08x;", (TUint)this);)
       
  1438     FBS_OST_IF(!iHandle, OstTrace1(TRACE_ERROR, CFBSBITMAP_UNLOCKHEAP_ERROR, "! this=0x%08x; !iHandle", (TUint)this););
       
  1439 	if (iHandle)
       
  1440 	    {
  1335 #ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP
  1441 #ifdef SYMBIAN_DEBUG_FBS_LOCKHEAP
  1336 	if (!iHandle)
  1442 	    if (!(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps
  1337 		return;
  1443             {
  1338 	if (!(iFlags & EIsRomBitmap)) // can't do anything with ROM bitmaps
  1444             TThreadId threadId = RThread().Id();
  1339 		{
  1445             iFbs->iHelper->iDebugMutex.Wait();
  1340 		TThreadId threadId = RThread().Id();
  1446             __ASSERT_ALWAYS(iAddressPointer->Extra()->iLockCount > 0, Panic(EFbsPanicBadHeapLock));
  1341 		iFbs->iHelper->iDebugMutex.Wait();
  1447             __ASSERT_ALWAYS(iAddressPointer->Extra()->iThreadId == threadId, Panic(EFbsPanicBadHeapLock));
  1342 		__ASSERT_ALWAYS(iAddressPointer->Extra()->iLockCount > 0, Panic(EFbsPanicBadHeapLock));
  1448             if (--iAddressPointer->Extra()->iLockCount == 0)
  1343 		__ASSERT_ALWAYS(iAddressPointer->Extra()->iThreadId == threadId, Panic(EFbsPanicBadHeapLock));
  1449                 iAddressPointer->Extra()->iThreadId = TThreadId(KNullThreadId);
  1344 		if (--iAddressPointer->Extra()->iLockCount == 0)
  1450             iFbs->iHelper->iDebugMutex.Signal();
  1345 			iAddressPointer->Extra()->iThreadId = TThreadId(KNullThreadId);
  1451             }
  1346 		iFbs->iHelper->iDebugMutex.Signal();
       
  1347 		}
       
  1348 #endif
  1452 #endif
  1349 	EndDataAccess();
  1453 	    EndDataAccess();
       
  1454 	    }
       
  1455 	FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP_EXIT, "< this=0x%08x;", (TUint)this);)
  1350 	}
  1456 	}
  1351 
  1457 
  1352 /** Locks the global bitmap heap, leaving on the clean-up stack a pointer
  1458 /** Locks the global bitmap heap, leaving on the clean-up stack a pointer
  1353 to a TCleanupItem that unlocks the heap on deletion.
  1459 to a TCleanupItem that unlocks the heap on deletion.
  1354 Use this function instead of LockHeap() if code may leave between the
  1460 Use this function instead of LockHeap() if code may leave between the
  1360 @deprecated
  1466 @deprecated
  1361 @see CFbsBitmap::LockHeap()
  1467 @see CFbsBitmap::LockHeap()
  1362 */
  1468 */
  1363 EXPORT_C void CFbsBitmap::LockHeapLC(TBool /*aAlways*/) const
  1469 EXPORT_C void CFbsBitmap::LockHeapLC(TBool /*aAlways*/) const
  1364 	{
  1470 	{
  1365 	LockHeap();
  1471     FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAPLC_ENTRY, "> this=0x%08x;", (TUint)this);)
       
  1472     LockHeap();
  1366 	TCleanupItem cleanitem(CFbsBitmap::UnlockHeap, (TAny*)this);
  1473 	TCleanupItem cleanitem(CFbsBitmap::UnlockHeap, (TAny*)this);
  1367 	CleanupStack::PushL(cleanitem);
  1474 	CleanupStack::PushL(cleanitem);
       
  1475 	FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_LOCKHEAPLC_EXIT, "< this=0x%08x;", (TUint)this);)
  1368 	}
  1476 	}
  1369 
  1477 
  1370 EXPORT_C void CFbsBitmap::UnlockHeap(TAny* aFbsBitmap)
  1478 EXPORT_C void CFbsBitmap::UnlockHeap(TAny* aFbsBitmap)
  1371 	{
  1479 	{
  1372 	((CFbsBitmap*)aFbsBitmap)->UnlockHeap();
  1480     FBS_OST(OstTrace1(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP2_ENTRY, "> bitmap=0x%08x;", (TUint)aFbsBitmap);)
       
  1481     ((CFbsBitmap*)aFbsBitmap)->UnlockHeap();
       
  1482     FBS_OST(OstTrace0(GRAPHICS_CONTROL_FUNCTIONS, CFBSBITMAP_UNLOCKHEAP2_EXIT, "<");)
  1373 	}
  1483 	}
  1374 
  1484 
  1375 /** Tests whether the bitmap is volatile.
  1485 /** Tests whether the bitmap is volatile.
  1376 A bitmap becomes volatile if CFbsBitmap::DataAdress() is called without
  1486 A bitmap becomes volatile if CFbsBitmap::DataAdress() is called without
  1377 CFbsBitmap::BeginDataAccess() having been called before and it can become non-volatile
  1487 CFbsBitmap::BeginDataAccess() having been called before and it can become non-volatile
  1396 @return The number of times the bitmap has been touched.
  1506 @return The number of times the bitmap has been touched.
  1397 */
  1507 */
  1398 EXPORT_C TInt CFbsBitmap::TouchCount() const
  1508 EXPORT_C TInt CFbsBitmap::TouchCount() const
  1399 	{
  1509 	{
  1400 	if (!iHandle || (iFlags & EIsReadOnlyBitmapMask))
  1510 	if (!iHandle || (iFlags & EIsReadOnlyBitmapMask))
  1401 			return 0; // A read-only bitmap can never be touched.
  1511 		return 0; // A read-only bitmap can never be touched.
  1402 	return CleanAddress()->Extra()->iTouchCount;
  1512 	return CleanAddress()->Extra()->iTouchCount;
  1403 	}
  1513 	}
  1404 
  1514 
  1405 /** Returns the serial number of the bitmap
  1515 /** Returns the serial number of the bitmap
  1406 The serial number is unique to this bitmap.
  1516 The serial number is unique to this bitmap.
  1721 @publishedAll
  1831 @publishedAll
  1722 @released
  1832 @released
  1723 */	
  1833 */	
  1724 EXPORT_C TInt CFbsBitmap::Load(RFile& aFile,TInt32 aId/*=0*/,TBool aShareIfLoaded/*=ETrue*/)
  1834 EXPORT_C TInt CFbsBitmap::Load(RFile& aFile,TInt32 aId/*=0*/,TBool aShareIfLoaded/*=ETrue*/)
  1725 	{
  1835 	{
  1726 	return Load(aFile,aId,aShareIfLoaded,0);
  1836     FBS_OST(TFullName fileName;)
       
  1837     FBS_OST(aFile.FullName(fileName);)
       
  1838     FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD3_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, fileName, aId, aShareIfLoaded);)
       
  1839 	TInt ret = Load(aFile,aId,aShareIfLoaded,0);
       
  1840     FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD3_EXIT, "< this=0x%08x, ret=%d", (TUint)this, ret);) 
       
  1841 	return ret;
  1727 	}
  1842 	}
  1728 
  1843 
  1729 /** Loads a specific bitmap from an opened multi-bitmap file handle.
  1844 /** Loads a specific bitmap from an opened multi-bitmap file handle.
  1730 The bitmap may be shared by other font and bitmap server clients.
  1845 The bitmap may be shared by other font and bitmap server clients.
  1731 @param aFile The handle of the multi-bitmap (.mbm) file. 
  1846 @param aFile The handle of the multi-bitmap (.mbm) file. 
  1737 @publishedAll
  1852 @publishedAll
  1738 @released
  1853 @released
  1739 */	
  1854 */	
  1740 EXPORT_C TInt CFbsBitmap::Load(RFile& aFile,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
  1855 EXPORT_C TInt CFbsBitmap::Load(RFile& aFile,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
  1741 	{
  1856 	{
       
  1857     TInt err = KErrNone;
       
  1858     FBS_OST(TFullName fileName;)
       
  1859     FBS_OST(aFile.FullName(fileName);)
       
  1860     FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD4_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d; off=%d", (TUint)this, fileName, aId, aShareIfLoaded, aFileOffset);)
  1742 	if (!iFbs)
  1861 	if (!iFbs)
  1743 		{
  1862 		{
  1744 		return(KErrCouldNotConnect);
  1863         FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_LOAD4_ERROR, "! this=0x%08x; !iFbs", (TUint)this);)
  1745 		}
  1864 		err = KErrCouldNotConnect;
  1746 	Reset();
  1865 		}
  1747 	TUint32* rompointer;
  1866 	else
  1748 	IsFileInRom(aFile,rompointer);
  1867 	    {
  1749 	TBool romPointerValid;
  1868         Reset();
  1750 	TInt err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid);
  1869         TUint32* rompointer;
  1751 	if (!romPointerValid)
  1870         IsFileInRom(aFile,rompointer);
  1752 		{
  1871         TBool romPointerValid;
  1753 		err = DoLoad(aFile,aId,aShareIfLoaded,aFileOffset);
  1872         err = DoLoadFromRom(rompointer, aId, aFileOffset, romPointerValid);
  1754 		}
  1873         if (!romPointerValid)
       
  1874             {
       
  1875             err = DoLoad(aFile,aId,aShareIfLoaded,aFileOffset);
       
  1876             FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOAD4_ERROR2, "! this=0x%08x; DoLoad() returned %d", (TUint)this, err);)
       
  1877             }
       
  1878 	    }
       
  1879 	FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOAD4_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);)
  1755 	return err;
  1880 	return err;
  1756 	}
  1881 	}
  1757 
  1882 
  1758 /** Loads and compresses a specific bitmap from an opened multi-bitmap file handle.
  1883 /** Loads and compresses a specific bitmap from an opened multi-bitmap file handle.
  1759 The bitmap may be shared by other font and bitmap server clients.
  1884 The bitmap may be shared by other font and bitmap server clients.
  1767 @publishedAll 
  1892 @publishedAll 
  1768 @released
  1893 @released
  1769 */	
  1894 */	
  1770 EXPORT_C TInt CFbsBitmap::LoadAndCompress(RFile& aFile,TInt32 aId/*=0*/,TBool aShareIfLoaded/*=ETrue*/)
  1895 EXPORT_C TInt CFbsBitmap::LoadAndCompress(RFile& aFile,TInt32 aId/*=0*/,TBool aShareIfLoaded/*=ETrue*/)
  1771 	{
  1896 	{
  1772 	return LoadAndCompress(aFile,aId,aShareIfLoaded,0);
  1897     FBS_OST(TFullName fileName;)
       
  1898     FBS_OST(aFile.FullName(fileName);)
       
  1899     FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS3_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, fileName, aId, aShareIfLoaded);)      
       
  1900 	TInt ret = LoadAndCompress(aFile,aId,aShareIfLoaded,0);
       
  1901     FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS3_EXIT, "< this=0x%08x; ret=%d", (TUint)this, ret);)
       
  1902     return ret;
  1773 	}
  1903 	}
  1774 
  1904 
  1775 /** Loads and compresses a specific bitmap from an opened multi-bitmap file handle.
  1905 /** Loads and compresses a specific bitmap from an opened multi-bitmap file handle.
  1776 The bitmap may be shared by other font and bitmap server clients. If the 
  1906 The bitmap may be shared by other font and bitmap server clients. If the 
  1777 bitmap is loaded from ROM then compression is not allowed.
  1907 bitmap is loaded from ROM then compression is not allowed.
  1785 @publishedAll 
  1915 @publishedAll 
  1786 @released
  1916 @released
  1787 */	
  1917 */	
  1788 EXPORT_C TInt CFbsBitmap::LoadAndCompress(RFile& aFile,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
  1918 EXPORT_C TInt CFbsBitmap::LoadAndCompress(RFile& aFile,TInt32 aId,TBool aShareIfLoaded,TUint aFileOffset)
  1789 	{
  1919 	{
       
  1920     FBS_OST(TFullName fileName;)
       
  1921     FBS_OST(aFile.FullName(fileName);)
       
  1922     FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS4_ENTRY, "> this=0x%08x; file=%S; id=0x%08x; share=%d", (TUint)this, fileName, aId, aShareIfLoaded);)
  1790 	TInt err = Load(aFile,aId,aShareIfLoaded,aFileOffset);
  1923 	TInt err = Load(aFile,aId,aShareIfLoaded,aFileOffset);
  1791 	if (err == KErrNone)
  1924 	if (err == KErrNone)
  1792 		{
  1925 		{
  1793 		err = !(iFlags & EIsRomBitmap) ? Compress() : KErrAccessDenied;
  1926         if (!(iFlags & EIsRomBitmap))
  1794 		}
  1927             {
       
  1928             err = Compress();
       
  1929             FBS_OST_IF(err!=KErrNone, OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOADANDCOMPRESS4_ERROR, "! this=0x%08x; Compress() returned %d", (TUint)this, err);)
       
  1930             }
       
  1931         else
       
  1932             {
       
  1933             err = KErrAccessDenied;
       
  1934             FBS_OST(OstTraceExt2( TRACE_ERROR, CFBSBITMAP_LOADANDCOMPRESS4_ERROR2, "! this=0x%08x; Cannot compress bitmap in ROM; iFlags=0x%08x", (TUint)this, (TUint)iFlags);)
       
  1935             }
       
  1936 		}
       
  1937 	FBS_OST(OstTraceExt2( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_LOADANDCOMPRESS4_EXIT, "< this=0x%08x; err=%d", (TUint)this, err);)
  1795 	return err;
  1938 	return err;
  1796 	}
  1939 	}
  1797 
  1940 
  1798 /** Gets all the bitmap handles for all the bitmaps stored in the Font Bitmap Server. There is a limit of
  1941 /** Gets all the bitmap handles for all the bitmaps stored in the Font Bitmap Server. There is a limit of
  1799 the number of bitmaps that can be retrieved defined by KMaxBitmapHandleBufferSize. If this limit has been
  1942 the number of bitmaps that can be retrieved defined by KMaxBitmapHandleBufferSize. If this limit has been
  1906 @see CFbsBitmap::BeginDataAccess()
  2049 @see CFbsBitmap::BeginDataAccess()
  1907 @see CFbsBitmap::EndDataAccess()
  2050 @see CFbsBitmap::EndDataAccess()
  1908 */
  2051 */
  1909 EXPORT_C TInt CFbsBitmap::CreateExtendedBitmap(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aType, const TAny* aData, TInt aDataSize)
  2052 EXPORT_C TInt CFbsBitmap::CreateExtendedBitmap(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aType, const TAny* aData, TInt aDataSize)
  1910 	{
  2053 	{
       
  2054     TInt err;
       
  2055     FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d; type=0x%08x", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode, aType.iUid);)
  1911 	if (!aData || aDataSize == 0)
  2056 	if (!aData || aDataSize == 0)
  1912 		{
  2057 		{
  1913 		return KErrArgument;
  2058         FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_CREATEEXTENDEDBITMAP_ERROR, "! this=0x%08x; (!aData || aDataSize == 0)", (TUint)this);)
  1914 		}
  2059 		err = KErrArgument;
  1915 	TInt err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize);
  2060 		}
  1916 	if (err == KErrNone)
  2061 	else
  1917 		{
  2062 	    {
  1918 		Mem::Copy(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aData, aDataSize);
  2063         err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize);
  1919 		}
  2064         if (err == KErrNone)
       
  2065             {
       
  2066             Mem::Copy(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aData, aDataSize);
       
  2067             }
       
  2068 	    }
       
  2069 	FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x", (TUint)this, err, iHandle, iServerHandle);)
  1920 	return err;
  2070 	return err;
  1921 	}
  2071 	}
  1922 
  2072 
  1923 /**
  2073 /**
  1924 Creates an extended bitmap. Extended bitmaps are used to store immutable
  2074 Creates an extended bitmap. Extended bitmaps are used to store immutable
  1958 @see CFbsBitmap::EndDataAccess()
  2108 @see CFbsBitmap::EndDataAccess()
  1959 @see MFbsExtendedBitmapInitializer
  2109 @see MFbsExtendedBitmapInitializer
  1960 */
  2110 */
  1961 EXPORT_C TInt CFbsBitmap::CreateExtendedBitmap(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aType, TInt aDataSize, MFbsExtendedBitmapInitializer& aInitializer)
  2111 EXPORT_C TInt CFbsBitmap::CreateExtendedBitmap(const TSize& aSizeInPixels, TDisplayMode aDispMode, TUid aType, TInt aDataSize, MFbsExtendedBitmapInitializer& aInitializer)
  1962 	{
  2112 	{
       
  2113     TInt err; 
       
  2114     FBS_OST(OstTraceExt5( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP2_ENTRY, "> this=0x%08x; w=%d; h=%d; dm=%d; type=0x%08x;", (TUint)this, aSizeInPixels.iWidth, aSizeInPixels.iHeight, aDispMode, aType.iUid);)
  1963 	if (aDataSize == 0)
  2115 	if (aDataSize == 0)
  1964 		{
  2116 		{
  1965 		return KErrArgument;
  2117         FBS_OST(OstTrace1( TRACE_ERROR, CFBSBITMAP_CREATEEXTENDEDBITMAP2_ERROR, "! this=0x%08x; aDataSize == 0", (TUint)this);)
  1966 		}
  2118 		err = KErrArgument;
  1967 	TInt err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize);
  2119 		}
  1968 	if (err == KErrNone)
  2120 	else
  1969 		{
  2121 	    {
  1970 		err = aInitializer.InitExtendedBitmap(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aDataSize);
  2122         err = DoCreate(aSizeInPixels, aDispMode, aType, aDataSize);
  1971 		if (err != KErrNone)
  2123         if (err == KErrNone)
  1972 			{
  2124             {
  1973 			Reset();
  2125             err = aInitializer.InitExtendedBitmap(iFbs->iLargeBitmapChunk.Base() + iAddressPointer->iDataOffset, aDataSize);
  1974 			}
  2126             if (err != KErrNone)
  1975 		}
  2127                 {
       
  2128                 Reset();
       
  2129                 }
       
  2130             }
       
  2131 	    }
       
  2132 	FBS_OST(OstTraceExt4( GRAPHICS_RESOURCE_MANAGEMENT_FUNCTIONS, CFBSBITMAP_CREATEEXTENDEDBITMAP2_EXIT, "< this=0x%08x; err=%d; iH=0x%08x; iSH=0x%08x", (TUint)this, err, iHandle, iServerHandle);)
  1976 	return err;
  2133 	return err;
  1977 	}
  2134 	}
  1978 
  2135 
  1979 /**
  2136 /**
  1980 Gets the UID identifying the data format of an extended bitmap.
  2137 Gets the UID identifying the data format of an extended bitmap.