gfxconversion/mifconv/src/mifconv_bitmapconverter.cpp
changeset 12 9b222d6b819d
parent 0 f453ebb75370
--- a/gfxconversion/mifconv/src/mifconv_bitmapconverter.cpp	Tue Feb 02 01:11:11 2010 +0200
+++ b/gfxconversion/mifconv/src/mifconv_bitmapconverter.cpp	Fri Apr 16 15:32:00 2010 +0300
@@ -21,9 +21,28 @@
 #include "mifconv_util.h"
 #include "mifconv_exception.h"
 #include "mifconv_argumentmanager.h"
+#include "mifconv_mbmgenerator.h"
+#include "mifconv_mbmgenerator_pbmcomp.h"
 #include <stdio.h>
+#include <sys/stat.h>
+
+using namespace std;
 
-const MifConvString BMCONV_DEFAULT_PATH(EPOC_TOOLS_PATH);
+#ifdef __linux__
+const char* DefaultPaletteFileSearchLocations[] =
+{
+    "/epoc32/include/mw/ThirdPartyBitmap.pal",
+    "/epoc32/include/middleware/ThirdPartyBitmap.pal",
+    "/epoc32/include/ThirdPartyBitmap.pal"
+};
+#else
+const char* DefaultPaletteFileSearchLocations[] =
+{
+    "\\epoc32\\include\\mw\\ThirdPartyBitmap.pal",
+    "\\epoc32\\include\\middleware\\ThirdPartyBitmap.pal",
+    "\\epoc32\\include\\ThirdPartyBitmap.pal"
+};
+#endif
 
 /**
  *
@@ -31,8 +50,8 @@
 MifConvBitmapConverter::MifConvBitmapConverter()
 {
     MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance();
-	// Output file:
-	iTargetFilename = MifConvUtil::FilenameWithoutExtension(argMgr->TargetFile()) + "." + MifConvString(MBM_FILE_EXTENSION);
+    // Output file:
+    iTargetFilename = MifConvUtil::FilenameWithoutExtension(argMgr->TargetFile()) + "." + MifConvString(MBM_FILE_EXTENSION);
 }
 
 /**
@@ -55,22 +74,22 @@
  */
 void MifConvBitmapConverter::CleanupTargetFiles()
 {
-	if( MifConvUtil::FileExists(iTargetFilename) )
-	{
+    if( MifConvUtil::FileExists(iTargetFilename) )
+    {
         // Try to remove file MIFCONV_MAX_REMOVE_TRIES times, no exception in case of failure:
         MifConvUtil::RemoveFile(iTargetFilename, MIFCONV_MAX_REMOVE_TRIES, true);
-	}
+    }
 }
 
 /**
  *
  */
-void MifConvBitmapConverter::AppendFile( const MifConvSourceFile& sourcefile )
+void MifConvBitmapConverter::AppendFile( const MifConvSourceFile& aSourcefile )
 {    
-	if( MifConvUtil::FileExtension( sourcefile.Filename() ) == BMP_FILE_EXTENSION )
-	{
-		iSourceFiles.push_back( sourcefile );
-	}
+    if( MifConvUtil::FileExtension( aSourcefile.Filename() ) == BMP_FILE_EXTENSION )
+    {
+        iSourceFiles.push_back( aSourcefile );
+    }
 }
 
 /**
@@ -80,7 +99,7 @@
 {
     if( iSourceFiles.size() > 0 )
     {
-	    ConvertToMbm();
+        ConvertToMbm();
     }
 }
 
@@ -89,29 +108,144 @@
  */
 void MifConvBitmapConverter::Cleanup(bool err)
 {
-	CleanupTempFiles();
-	if( err )
-	{
-	    CleanupTargetFiles();
-	}
+    CleanupTempFiles();
+    if( err )
+    {
+        CleanupTargetFiles();
+    }
 }
 
 /**
  *
  */
 void MifConvBitmapConverter::ConvertToMbm()
-{    
-    RunBmconv();
+{   
+    MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance();
+    const MifConvString& bmconvPath = argMgr->StringValue(MifConvBmconvPathArg);
+    
+    // If bmconv.exe's location is given.
+    if( bmconvPath.length() > 0 ) 
+    {
+        // Create and initialize the temp file.  
+        InitTempFile();
+    
+        // Run external bmconv.
+        RunExternalBmconv(bmconvPath);
+    }
+    else // Use internal logic.
+    {
+        // Create the path if not existing.
+        MifConvUtil::EnsurePathExists(iTargetFilename, true);
+        
+        cout << "Writing mbm: " << iTargetFilename << endl; 
+    
+        // Variable for source files.
+        MifConvSourceFileList sourceFiles;
+        
+        // Get palette file name from either arguments or default values.
+        MifConvString palettefilename = GetPaletteFileName();
+        
+        // Add filenames to the temp file.
+        // Sourcefiles and their mask files are considered as same.
+        for( MifConvSourceFileList::iterator i = iSourceFiles.begin(); i != iSourceFiles.end(); ++i )
+            {               
+            cout << "Loading file: " << i->Filename() << endl;
+            sourceFiles.push_back( *i );              
+            // Prepare also for the case that mask is not used at all.
+            if (i->BmpMaskFilename().length() > 0 )
+                {
+                cout << "Loading file: " << i->BmpMaskFilename() << endl;
+                MifConvSourceFile maskFile;
+                maskFile.SetFilename(i->BmpMaskFilename());
+                maskFile.SetDepthString(i->MaskDepthString());
+                sourceFiles.push_back( maskFile );
+                }
+            }
+       
+        // Create internal bmconv to handle compiling.
+        BmConv bmConv = BmConv(sourceFiles);
+        int ret = bmConv.Compile(iTargetFilename.c_str(), palettefilename); 
+        if (ret) {
+            THROW_ERROR_COMMON("BMP to MBM conversion failed", MifConvString(__FILE__), __LINE__);
+        }
+
+    }
 }
 
+const MifConvString MifConvBitmapConverter::GetPaletteFileName() 
+    {
+    
+    // Get palette argument.
+    MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance();
+    const MifConvString& paletteArg = argMgr->StringValue(MifConvPaletteFileArg);
+    
+    MifConvString palettefilename;       
+    MifConvString paletteBuf;
+    
+    // If palette argument has been given.
+    if( paletteArg.length() == 0 )
+        {
+        // Default palette file.
+        const MifConvString& defaultPalettefile = DefaultPaletteFileName(paletteBuf);
+        
+        // Palette file not given in arguments. If the default palette file
+        // was found, use it, otherwise throw error.
+        if( defaultPalettefile.length() > 0 )
+            {
+            palettefilename = defaultPalettefile;           
+            }
+        else
+            {
+            // Palettefile not given in arguments nor found from default locations:
+            THROW_ERROR_COMMON("Unable to open palette file from default locations! ", MifConvString(__FILE__), __LINE__ );
+            }
+        } else {
+        palettefilename = paletteArg;           
+        }   
+    
+    // Check that palette file exists.
+    if( !MifConvUtil::FileExists(palettefilename) )
+    {
+        THROW_ERROR_COMMON("Unable to open palette file! " + paletteArg, MifConvString(__FILE__), __LINE__ );
+    }
+    
+    return palettefilename;
+    }
+
+const MifConvString& MifConvBitmapConverter::DefaultPaletteFileName(MifConvString& aBuf)
+    {
+    int numOfSearchLocations = sizeof(DefaultPaletteFileSearchLocations)/sizeof(char*);
+    
+    // Get epocroot.
+    MifConvString epocRoot(MifConvArgumentManager::Instance()->EpocRoot());
+    
+    for( int i = 0; i < numOfSearchLocations; ++i )
+        {
+        aBuf = epocRoot;
+        aBuf += DefaultPaletteFileSearchLocations[i];
+        
+        // Remove possible double-\.
+        if ((aBuf.at(1) == '\\') && (aBuf.at(0) == '\\')) aBuf = aBuf.substr(1, aBuf.length()-1);
+        if( MifConvUtil::FileExists(aBuf))
+            {
+            return aBuf;
+            }
+        }
+    aBuf = "";
+    return aBuf;
+    }
+
 /**
  *
  */
 void MifConvBitmapConverter::InitTempFile()
 {
+    // Take an instance from the argument manager.
     MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance();
-    // Construct temp file name
+
+    // Construct temp file name.
     iTempDir = MifConvUtil::DefaultTempDirectory();
+    
     const MifConvString& tempDirArg = argMgr->StringValue(MifConvTempPathArg);
     if( tempDirArg.length() > 0 )
     {
@@ -137,26 +271,30 @@
 
     iTempFilename = iTempDir + MifConvUtil::FilenameWithoutExtension(MifConvUtil::FilenameWithoutPath(argMgr->TargetFile()));
     iTempFilename += BMCONV_TEMP_FILE_POSTFIX;
-
+    
     // Create temp file
     fstream tempFile(iTempFilename.c_str(), ios::out|ios::binary|ios::trunc);
     if (!tempFile.is_open())
     {        
-        throw MifConvException(MifConvString("Unable to create tmp file! ") + iTempFilename);        
+        throw MifConvException(MifConvString("Unable to create tmp file! ") + iTempFilename);    
     }
 
     try {
-        // quiet mode        
+        // quiet mode
+        // ex. "-q"
         tempFile << BMCONV_OPTION_PREFIX << BMCONV_QUIET_PARAMETER << " ";
+        
         // Palette argument
         const MifConvString& paletteArg = argMgr->StringValue(MifConvPaletteFileArg);
         if( paletteArg.length() > 0 )
         {
+            // ex. "-p"
             tempFile << BMCONV_OPTION_PREFIX << BMCONV_PALETTE_PARAMETER;            
             tempFile << MifConvString(paletteArg + " ");
         }
 
-        tempFile << iTargetFilename << " ";                
+        tempFile << iTargetFilename << " ";
+        
         // Add filenames to the temp file
         for( MifConvSourceFileList::iterator i = iSourceFiles.begin(); i != iSourceFiles.end(); ++i )
         {
@@ -166,34 +304,20 @@
     catch(...) {
         tempFile.close();
         throw;
-    }        
-
+    }    
     tempFile.close();
 }
 
 /**
- *
+ * Run external bmconv from given path.
  */
-void MifConvBitmapConverter::RunBmconv()
-{
-    MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance();
-    // Create and initialize the temp file:    
-    InitTempFile();
-
+void MifConvBitmapConverter::RunExternalBmconv( const MifConvString& aBmconvPath )
+{    
     // Build bmconv command    
     MifConvString bmconvCommand("\""); // Open " mark
     
-    const MifConvString& bmconvPath = argMgr->StringValue(MifConvBmconvPathArg);
-    const MifConvString& defaultBmconvPath = GetDefaultBmConvPath();
-    if( bmconvPath.length() > 0 )
-    {
-        bmconvCommand += bmconvPath; // If the path is given, use it.
-    }
-    else
-    {
-        bmconvCommand += defaultBmconvPath; // Use default path
-    }
-
+    bmconvCommand += aBmconvPath; // If the path is given, use it.
+        
     // Ensure that the last char of the path is dir-separator:
     if( bmconvCommand.length() > 1 && bmconvCommand.at(bmconvCommand.length()-1) != DIR_SEPARATOR2 )
         bmconvCommand += DIR_SEPARATOR;
@@ -201,19 +325,19 @@
     // Then add bmconv executable call and close the " mark
     bmconvCommand += BMCONV_EXECUTABLE_NAME + MifConvString("\" ");  
     bmconvCommand += "\"" + iTempFilename + "\"";
-        
+            
     MifConvUtil::EnsurePathExists(iTargetFilename, true);
-    
+        
     cout << "Writing mbm: " << iTargetFilename << endl;           
     int err = 0;
-    
+      
 #ifdef __linux__
     if ((err = system (MifConvString(bmconvCommand).c_str())) != 0)   // Returns 0 if success
 #else
     if ((err = system (MifConvString("\""+bmconvCommand+"\"").c_str())) != 0)   // Returns 0 if success
 #endif
     {
-    	THROW_ERROR_COMMON("Executing BMCONV failed", MifConvString(__FILE__), __LINE__);
+            THROW_ERROR_COMMON("Executing BMCONV failed", MifConvString(__FILE__), __LINE__);
     }
 }
 
@@ -236,42 +360,26 @@
 /**
  *
  */
-const MifConvString& MifConvBitmapConverter::GetDefaultBmConvPath()
-{
-    if( iDefaultBmConvPath.length() == 0 )
-    {        
-        // Check if the EPOCROOT is given
-        MifConvString epocRoot(MifConvArgumentManager::Instance()->EpocRoot());
-        if( epocRoot.length() > 0 )
-        {
-            // EPOCROOT environment variable defined.
-            iDefaultBmConvPath = epocRoot + BMCONV_DEFAULT_PATH;
-        }        
-    }
-
-    return iDefaultBmConvPath;
-}
-
-/**
- *
- */
-void MifConvBitmapConverter::AppendBmpToTempFile(fstream& aStream, const MifConvSourceFile& bmpFile)
+void MifConvBitmapConverter::AppendBmpToTempFile(fstream& aStream, const MifConvSourceFile& aBmpFile)
     {
-    cout << "Loading file: " << bmpFile.Filename() << endl;
-
+    cout << "Loading file: " << aBmpFile.Filename() << endl;
+    
+    // ex. "-8..\..\bitmaps\mifconv_test_bitmap_01.bmp"
     aStream << BMCONV_OPTION_PREFIX;
-    aStream << bmpFile.DepthString();
-    aStream << bmpFile.Filename();
+    aStream << aBmpFile.DepthString();
+    aStream << aBmpFile.Filename();
     aStream << " ";
         
     // Prepare also for the case that mask is not used at all.
-    const MifConvString& maskName = bmpFile.BmpMaskFilename();
+    const MifConvString& maskName = aBmpFile.BmpMaskFilename();
     if (maskName.length() > 0 )
     {
         cout << "Loading file: " << maskName << endl;
+        
+        // ex. -8..\..\bitmaps\mifconv_test_bitmap_01_mask_soft.bmp 
         aStream << BMCONV_OPTION_PREFIX;
-        aStream << bmpFile.MaskDepthString();
-        aStream << maskName;        
+        aStream << aBmpFile.MaskDepthString();
+        aStream << maskName;      
     }
     aStream << " ";    
     }