menufw/hierarchynavigator/hnpresentationmodel/src/hnattrimgprovfileimage.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:40:49 +0200
changeset 0 f72a12da539e
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  image provider for image file
*
*/


#include <AknsSkinInstance.h>
#include <AknsUtils.h>
#include "hnconvutils.h"
#include "hnglobals.h"
#include "hnattrimgprovfileimage.h"
#include "imageconversion.h"

// ============================ MEMBER FUNCTIONS =============================


// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CHnAttrImgProvFileImage::CHnAttrImgProvFileImage()
    {
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CHnAttrImgProvFileImage::CorrectBitmapSize(
        CImageDecoder& aImageDec, TSize& aBitmapSize )
    {
    const TFrameInfo& frameInfo = aImageDec.FrameInfo();
    TSize imageSize = frameInfo.iOverallSizeInPixels;
    if ( imageSize.iWidth && imageSize.iHeight )
        {
        if ( imageSize.iWidth <= aBitmapSize.iWidth
                && imageSize.iHeight <= aBitmapSize.iHeight)
            {
            aBitmapSize = imageSize;
            }
        else
            {
            TInt reductionFactor = aImageDec.ReductionFactor(
                    imageSize, aBitmapSize );
            TInt err = aImageDec.ReducedSize(
                    imageSize, reductionFactor, aBitmapSize );
            ASSERT( KErrNone == err );
            }
        }
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
void CHnAttrImgProvFileImage::ConstructL( const TDesC& aFileName )
    {
    TSize bitmapSize( KMaxIconBitmapSize, KMaxIconBitmapSize );
    
    HBufC8* buf = HnConvUtils::StrToStr8LC( aFileName );
    iValue.CreateL( aFileName.Length() + 1  );
    iValue.Copy( *buf );
    CleanupStack::PopAndDestroy( buf );
    
    CImageDecoder* imageDec = CImageDecoder::FileNewL(CEikonEnv::Static()->FsSession(), 
            aFileName, CImageDecoder::EOptionAlwaysThread);
    CleanupStack::PushL( imageDec );            
    
    CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
    TDismissableCleaner bitmapCleaner( bitmap );
    CleanupClosePushL( bitmapCleaner );
    CFbsBitmap* mask = new (ELeave) CFbsBitmap();
    CleanupStack::PushL( mask );

    CorrectBitmapSize( *imageDec, bitmapSize );
    User::LeaveIfError( bitmap->Create( bitmapSize, EColor64K ) );
    User::LeaveIfError( mask->Create( bitmapSize, EGray256  ) );
    TRequestStatus status = KRequestPending;
    imageDec->Convert( &status, *bitmap, *mask );
    User::WaitForRequest( status );  

    CleanupStack::Pop( mask );
    CFbsBitmap* avkonishMask = AknIconUtils::CreateIconL( mask );
    mask = NULL;
    CleanupStack::PushL( avkonishMask );

    bitmapCleaner.Dismiss();
    CFbsBitmap* avkonishBitmap = AknIconUtils::CreateIconL( bitmap );
    bitmap = NULL;
    CleanupStack::PushL( avkonishBitmap );
    
    CreateIconL( avkonishBitmap, avkonishMask );
    CleanupStack::Pop( avkonishBitmap );
    CleanupStack::Pop( avkonishMask );
    
    CleanupStack::PopAndDestroy( &bitmapCleaner );
    CleanupStack::PopAndDestroy( imageDec ); 
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
EXPORT_C CHnAttrImgProvFileImage* CHnAttrImgProvFileImage::NewL( 
        const TDesC& aFileName )
    {
    CHnAttrImgProvFileImage* self = NewLC( aFileName );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
EXPORT_C CHnAttrImgProvFileImage* CHnAttrImgProvFileImage::NewLC( 
        const TDesC& aFileName )
    {
    CHnAttrImgProvFileImage* self = new( ELeave ) CHnAttrImgProvFileImage;
    CleanupStack::PushL( self );
    self->ConstructL( aFileName );
    return self;
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
CHnAttrImgProvFileImage::~CHnAttrImgProvFileImage()
    {
    iValue.Close();
    }

// ---------------------------------------------------------------------------
// 
// ---------------------------------------------------------------------------
//
const TDesC8& CHnAttrImgProvFileImage::Value()
    {
    return iValue;
    }