/*
* Copyright (c) 2003-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:  Multipart bitmap file output.
*
*/

#include "SDCGlobals.h"
#include "SDCMBMOutput.h"
#include "SDCException.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSDCMBMOutput::CSDCMBMOutput()
    {

    }

CSDCMBMOutput::~CSDCMBMOutput()
    {

    }

//////////////////////////////////////////////////////////////////////
// Other methods
//////////////////////////////////////////////////////////////////////

void CSDCMBMOutput::Output( CSDCData* aData, const char* aBaseName, const char* aBmconvTxtFilename )
    {
    FILE* file = fopen( aBmconvTxtFilename, "wt" );
    if( !file ) throw CSDCException( ESDCFileOpenError, "Text output file for bmconv can not be opened" );

    if( aData->IsScalable() )
        {
        fprintf( file, "/E\n" );
        }
    else
        {
        fprintf( file, "%s.mbm\n", aBaseName );
        }

    for( unsigned int i=0; i<aData->iMbmVector.size(); i++ )
        {
        TSDCMBMEntry* entry = aData->iMbmVector[i];
        if( (entry->iIndex>=16384) && (!aData->IsScalable()) )
            {
            throw CSDCException( ESDCContentError, "SVG icons require scalable skin" );
            }

        if( aData->IsScalable() )
            {
            switch( entry->iColorDepth )
                {
                case ESDCColorDepth1: fprintf( file, "/1" ); break;
                case ESDCColorDepth2: fprintf( file, "/2" ); break;
                case ESDCColorDepth4: fprintf( file, "/4" ); break;
                case ESDCColorDepth8: fprintf( file, "/8" ); break;
                case ESDCColorDepthC4: fprintf( file, "/c4" ); break;
                case ESDCColorDepthC8: fprintf( file, "/c8" ); break;
                case ESDCColorDepthC12: fprintf( file, "/c12" ); break;
                case ESDCColorDepthC16: fprintf( file, "/c16" ); break;
                case ESDCColorDepthC24: fprintf( file, "/c24" ); break;
                case ESDCColorDepthC32: fprintf( file, "/c32" ); break;
                default:
                    throw CSDCException( ESDCUnknownError, "Unknown color depth value used internally" );
                }
            switch( entry->iMaskColorDepth )
                {
                case ESDCColorDepthNone: break;
                case ESDCColorDepth1: fprintf( file, ",1" ); break;
                case ESDCColorDepth2: fprintf( file, ",2" ); break;
                case ESDCColorDepth4: fprintf( file, ",4" ); break;
                case ESDCColorDepth8: fprintf( file, ",8" ); break;
                default:
                    throw CSDCException( ESDCUnknownError, "Unknown color depth value used internally" );
                }
            fprintf( file, " " );
            if ( entry->iSvgAnim )
                {
                 fprintf( file, "/A " );
                }
            char pathBuf[512];
            gInput.ConvertToAscii( pathBuf, entry->iSourcePath );
            char buf[512];
            gInput.ConvertToAscii( buf, entry->iSourceFilename );
            fprintf( file, "%s%s\n", pathBuf, buf );
            }
        else
            {
            switch( entry->iColorDepth )
                {
                case ESDCColorDepth1: fprintf( file, "/1" ); break;
                case ESDCColorDepth2: fprintf( file, "/2" ); break;
                case ESDCColorDepth4: fprintf( file, "/4" ); break;
                case ESDCColorDepth8: fprintf( file, "/8" ); break;
                case ESDCColorDepthC4: fprintf( file, "/c4" ); break;
                case ESDCColorDepthC8: fprintf( file, "/c8" ); break;
                case ESDCColorDepthC12: fprintf( file, "/c12" ); break;
                case ESDCColorDepthC16: fprintf( file, "/c16" ); break;
                case ESDCColorDepthC24: fprintf( file, "/c24" ); break;
                case ESDCColorDepthC32: fprintf( file, "/c32" ); break;
                default:
                    throw CSDCException( ESDCUnknownError, "Unknown color depth value used internally" );
                }
            char pathBuf[512];
            gInput.ConvertToAscii( pathBuf, entry->iSourcePath );
            char buf[512];
            gInput.ConvertToAscii( buf, entry->iSourceFilename );
            fprintf( file, "%s%s\n", pathBuf, buf );

            switch( entry->iMaskColorDepth )
                {
                case ESDCColorDepthNone: continue;
                case ESDCColorDepth1: fprintf( file, "/1" ); break;
                case ESDCColorDepth2: fprintf( file, "/2" ); break;
                case ESDCColorDepth4: fprintf( file, "/4" ); break;
                case ESDCColorDepth8: fprintf( file, "/8" ); break;
                default:
                    throw CSDCException( ESDCUnknownError, "Unknown color depth value used internally" );
                }
            gInput.ConvertToAscii( pathBuf, entry->iSourcePath );
            gInput.ConvertToAscii( buf, entry->iMaskSourceFilename );
            fprintf( file, "%s%s\n", pathBuf, buf );
            }
        }

    fclose( file );
    }

// End of file
