diff -r 35baca0e7a2e -r 023eef975703 javamanager/javainstaller/installer/src.s60/iconconverter/iconconverter.cpp --- a/javamanager/javainstaller/installer/src.s60/iconconverter/iconconverter.cpp Tue Jul 06 20:36:19 2010 +0300 +++ b/javamanager/javainstaller/installer/src.s60/iconconverter/iconconverter.cpp Fri Jul 09 16:35:45 2010 +0300 @@ -20,11 +20,14 @@ #include #include +#include #include "javacommonutils.h" #include "logger.h" #include "mifconverter.h" #include "iconconverter.h" +#include "iconsizeutils.h" // TIconSizes +#include "iconsizenotifier.h" // KUidIconSizeNotifPlugin namespace java { @@ -32,12 +35,13 @@ /** * The icon in S60 temporary drive */ -_LIT(KTempIconName, "D:\\micon.mbm"); +_LIT(KTempIconName1, "D:\\micon1.mbm"); +_LIT(KTempMaskName1, "D:\\mmask1.mbm"); -/** - * The mask in S60 temporary drive - */ -_LIT(KTempMaskName, "D:\\mmask.mbm"); +#ifdef RD_JAVA_S60_RELEASE_9_2 +_LIT(KTempIconName2, "D:\\micon2.mbm"); +_LIT(KTempMaskName2, "D:\\mmask2.mbm"); +#endif // RD_JAVA_S60_RELEASE_9_2 // MIF file constants @@ -51,13 +55,11 @@ const TInt KMifIconHeaderAnimated = 0; - CIconConverter* CIconConverter::NewL(RFs& aRFs) { return new(ELeave) CIconConverter(aRFs); } - CIconConverter::CIconConverter(RFs &aRFs) { iRFs = aRFs; @@ -79,6 +81,8 @@ // Do NOT close file server session delete iBitmapMask; delete iBitmap; + delete iBitmapMaskScaledCopy; + delete iBitmapScaledCopy; delete iImageDecoder; RFbsSession::Disconnect(); @@ -246,34 +250,77 @@ *iBitmapMask); CActiveScheduler::Start(); - err = iActiveListener->iStatus.Int(); + User::LeaveIfError(iActiveListener->iStatus.Int()); + + // Scale icons + TIconSizes sizes(GetIdealIconSizes()); + CBitmapScaler* scaler = CBitmapScaler::NewL(); + CleanupStack::PushL(scaler); + scaler->SetQualityAlgorithm(CBitmapScaler::EMaximumQuality); + + // Scale for Menu + ILOG2(EJavaInstaller, "Scaling Menu icon to (%d, %d)", + sizes.iMenuIconSize.iWidth, sizes.iMenuIconSize.iHeight); + iBitmapScaledCopy = new(ELeave) CFbsBitmap; + iBitmapMaskScaledCopy = new(ELeave) CFbsBitmap; + ScaleL(*scaler, sizes.iMenuIconSize); + User::LeaveIfError(iBitmapScaledCopy->Save(KTempIconName1)); + User::LeaveIfError(iBitmapMaskScaledCopy->Save(KTempMaskName1)); + iBitmapScaledCopy->Reset(); + iBitmapMaskScaledCopy->Reset(); + +#ifdef RD_JAVA_S60_RELEASE_9_2 + // Scale for App Manager + ILOG2(EJavaInstaller, "Scaling App Mgr icon to (%d, %d)", + sizes.iMenuIconSize.iWidth, sizes.iMenuIconSize.iHeight); + ScaleL(*scaler, sizes.iAppMgrIconSize); + User::LeaveIfError(iBitmapScaledCopy->Save(KTempIconName2)); + User::LeaveIfError(iBitmapMaskScaledCopy->Save(KTempMaskName2)); + iBitmapScaledCopy->Reset(); + iBitmapMaskScaledCopy->Reset(); +#endif // RD_JAVA_S60_RELEASE_9_2 + + CleanupStack::PopAndDestroy(scaler); delete iActiveListener; iActiveListener = NULL; - if (err != KErrNone) - { - User::Leave(err); - } - // store bitmap to two temp files - User::LeaveIfError(iBitmap->Save(KTempIconName)); - User::LeaveIfError(iBitmapMask->Save(KTempMaskName)); - - // construct multi bitmap file from bitmap and mask files (2 files) + // Construct multi bitmap file from bitmap and mask files (2 files) +#ifdef RD_JAVA_S60_RELEASE_9_2 + const TInt KBmpCount = 4; + TInt32 sourceIds[] = {0, 0, 0, 0}; +#else + const TInt KBmpCount = 2; TInt32 sourceIds[] = {0, 0}; - TFileName** filenames = new(ELeave) TFileName*[2]; +#endif // RD_JAVA_S60_RELEASE_9_2 + + TFileName** filenames = new(ELeave) TFileName*[KBmpCount]; CleanupStack::PushL(filenames); - filenames[0] = new(ELeave) TFileName(KTempIconName); + filenames[0] = new(ELeave) TFileName(KTempIconName1); CleanupStack::PushL(filenames[0]); - filenames[1] = new(ELeave) TFileName(KTempMaskName); + filenames[1] = new(ELeave) TFileName(KTempMaskName1); CleanupStack::PushL(filenames[1]); - - CFbsBitmap::StoreL(aOutputFile, 2, (const TDesC**)filenames, sourceIds); + +#ifdef RD_JAVA_S60_RELEASE_9_2 + filenames[2] = new(ELeave) TFileName(KTempIconName2); + CleanupStack::PushL(filenames[2]); + filenames[3] = new(ELeave) TFileName(KTempMaskName2); + CleanupStack::PushL(filenames[3]); +#endif // RD_JAVA_S60_RELEASE_9_2 + + CFbsBitmap::StoreL(aOutputFile, KBmpCount, (const TDesC**)filenames, sourceIds); // Now try to delete the temp icon and mask files, // ignore possible errors - (void)iRFs.Delete(KTempIconName); - (void)iRFs.Delete(KTempMaskName); - + (void)iRFs.Delete(KTempIconName1); + (void)iRFs.Delete(KTempMaskName1); + +#ifdef RD_JAVA_S60_RELEASE_9_2 + (void)iRFs.Delete(KTempIconName2); + (void)iRFs.Delete(KTempMaskName2); + CleanupStack::PopAndDestroy(filenames[3]); + CleanupStack::PopAndDestroy(filenames[2]); +#endif // RD_JAVA_S60_RELEASE_9_2 + CleanupStack::PopAndDestroy(filenames[1]); CleanupStack::PopAndDestroy(filenames[0]); CleanupStack::PopAndDestroy(filenames); @@ -371,4 +418,64 @@ mimeTypes.ResetAndDestroy(); } +void CIconConverter::ScaleL(CBitmapScaler& aScaler, const TSize aSize) +{ + ASSERT(iBitmapScaledCopy); + ASSERT(iBitmapMaskScaledCopy); + + User::LeaveIfError(iBitmapScaledCopy->Create(aSize, EColor16M)); + User::LeaveIfError(iBitmapMaskScaledCopy->Create(aSize, EGray256)); + + iActiveListener->InitialiseActiveListener(); + aScaler.Scale(&iActiveListener->iStatus, *iBitmap, *iBitmapScaledCopy, ETrue); + CActiveScheduler::Start(); + User::LeaveIfError(iActiveListener->iStatus.Int()); + + iActiveListener->InitialiseActiveListener(); + aScaler.Scale(&iActiveListener->iStatus, *iBitmapMask, *iBitmapMaskScaledCopy, ETrue); + CActiveScheduler::Start(); + User::LeaveIfError(iActiveListener->iStatus.Int()); +} + +TIconSizes CIconConverter::GetIdealIconSizes() +{ + TIconSizes fallbackSizes; + fallbackSizes.iMenuIconSize = TSize(KIconInMenuFallbackSize, KIconInMenuFallbackSize); + fallbackSizes.iAppMgrIconSize = TSize(KIconInAppMgrFallbackSize, KIconInAppMgrFallbackSize); + +#ifdef RD_JAVA_S60_RELEASE_9_2 + RNotifier notifier; + TInt err = notifier.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaInstaller, "CIconConverter::GetIdealIconSizes #1 err = %d", err); + return fallbackSizes; + } + + CleanupClosePushL(notifier); + + TPckgBuf des; + iActiveListener->InitialiseActiveListener(); + notifier.StartNotifierAndGetResponse(iActiveListener->iStatus, + KUidIconSizeNotifPlugin, des, des); + CActiveScheduler::Start(); + notifier.CancelNotifier(KUidIconSizeNotifPlugin); + err = iActiveListener->iStatus.Int(); + + CleanupStack::PopAndDestroy(¬ifier); + + if (KErrNone != err) + { + ELOG1(EJavaInstaller, "CIconConverter::GetIdealIconSizes #2 err = %d", err); + return fallbackSizes; + } + else + { + return des(); + } +#else + return fallbackSizes; +#endif +} + } // namespace java