resource_manager.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: resource_manager.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:29:26  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: resource_manager.cpp,v 1000.0 2004/06/01 21:29:26 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  */
  38.  
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbifile.hpp>
  41. #include <gui/widgets/fl/resource_manager.hpp> 
  42. #include <gui/utils/system_path.hpp>
  43. #include <FL/Fl.H>
  44. #include <FL/fl_draw.H>
  45. #include <FL/Fl_BMP_Image.H>
  46. #include <FL/Fl_GIF_Image.H>
  47. #include <util/image/image_io.hpp>
  48. BEGIN_NCBI_SCOPE
  49. ////////////////////////////////////////////////////////////////////////////////
  50. ///
  51. CPNGImageExt::CPNGImageExt(const char* filename)
  52. : Fl_PNG_Image(filename) 
  53. {
  54. }
  55. void    CPNGImageExt::DrawTransparent(Fl_Color back_color, int X, int Y, int W, int H,
  56.                                       bool disabled, int cx, int cy)
  57. {   
  58.     if(d() == 4)    {
  59.         int n = w() * h() * d();
  60.         TByte*  new_data = new TByte[n];
  61.         TByte** p_data = (TByte**) data();        
  62.         TByte*  d = *p_data;
  63.         TByte bk_red = back_color >> 24;
  64.         TByte bk_green = back_color >> 16;
  65.         TByte bk_blue = back_color >> 8;
  66.         
  67.         TByte dis_red, dis_green, dis_blue;
  68.         const static double dis_K = 0.66;
  69.         const double K = 1.0 - dis_K;
  70.                 
  71.         if(disabled) {
  72.             Fl::get_color(FL_GRAY, dis_red, dis_green, dis_blue);
  73.             dis_red = (TByte) (dis_red * dis_K);
  74.             dis_green = (TByte) (dis_green * dis_K);
  75.             dis_blue = (TByte) (dis_blue * dis_K);
  76.         }
  77.         
  78.         for( int i = 0; i < n; i += 4 )    { // iterate by pixels
  79.             TByte kDst = d[i + 3];
  80.             TByte kSrc = 255 - kDst;
  81.             
  82.             TByte red = d[i];
  83.             TByte green = d[i + 1]; 
  84.             TByte blue = d[i + 2];
  85.             
  86.             if(disabled)    { // average with gray 
  87.                 red = (TByte) (red * K + dis_red);
  88.                 green = (TByte) (red * K + dis_green);
  89.                 blue = (TByte) (red * K + dis_blue);
  90.             }
  91.             // alpha-blending with background
  92.             new_data[i] = (red * kDst + bk_red * kSrc) / 255;
  93.             new_data[i + 1] = (green * kDst + bk_green * kSrc) / 255;
  94.             new_data[i + 2] = (blue * kDst + bk_blue * kSrc) / 255;
  95.             new_data[i + 3] = 255;                
  96.         }
  97.         
  98.         uncache();
  99.         array = new_data;
  100.         draw(X, Y, W, H, cx, cy);
  101.         array = d;
  102.         delete new_data;
  103.     } else {
  104.         draw(X, Y, W, H, cx, cy);
  105.     }
  106. }
  107. ////////////////////////////////////////////////////////////////////////////////
  108. /// CResourceManager
  109. const char*  kListDelim = ";";
  110. const char* kWhiteSpace = " /t/n";
  111. CResourceManager::CResourceManager(const string& dir_list)
  112. {
  113.     m_DirList.clear();
  114.     list<string> toks;
  115.     NStr::Split(dir_list, kListDelim, toks);
  116.     ITERATE( list<string>, it, toks) { // iterating through directories
  117.         string dir = NStr::TruncateSpaces(*it);
  118.         dir = CSystemPath::ResolvePath(dir);
  119.         
  120.         if(dir.size())  { // not empty
  121.             CDirEntry entry(dir);
  122.             if (entry.Exists()) { // and does exist   
  123.                 m_DirList.push_back(dir);
  124.             }
  125.         }
  126.     }
  127. }
  128. void    CResourceManager::RegisterAlias(const string& alias,
  129.                                         const string& local_path)
  130. {
  131.     m_AliasToPath[alias] = local_path;
  132. }
  133. CFLTKImageHandle    CResourceManager::GetImage(const string& alias)
  134. {
  135.     TAliasToImageMap::iterator it = m_AliasToImage.find(alias);
  136.     if(it == m_AliasToImage.end())  {
  137.         string error;
  138.         TAliasToPathMap::const_iterator itP = m_AliasToPath.find(alias);
  139.         if(itP == m_AliasToPath.end())  {
  140.             error = "Alias not registered";
  141.         }   else { // loading        
  142.             try {
  143.                 string full_path;
  144.                 ITERATE(TDirList, itDir, m_DirList) {
  145.                     full_path = *itDir;
  146.                     full_path += CDirEntry::GetPathSeparator();
  147.                     full_path += itP->second;
  148.                     CDirEntry entry(full_path);
  149.                     if(entry.Exists())
  150.                         break;
  151.                 }
  152.                 if(full_path.size() == 0)   {
  153.                     error = "File "";
  154.                     error = itP->second + "" is not found";
  155.                 } else { // try to load file
  156.                     CImageIO::EType type = CImageIO::GetTypeFromFileName(full_path);
  157.                     TImage* pImage = NULL;
  158.                     switch(type)    {
  159.                     case CImageIO::ePng: pImage = new CPNGImageExt(full_path.c_str()); break;
  160.                     case CImageIO::eBmp: pImage = new Fl_BMP_Image(full_path.c_str()); break;
  161.                     case CImageIO::eGif: pImage = new Fl_GIF_Image(full_path.c_str()); break;
  162.                     default: break;
  163.                     };
  164.                     if(pImage)  {
  165.                         if(*pImage->data())   {
  166.                             CFLTKImageHandle handle(pImage);
  167.                             m_AliasToImage[alias] = handle;
  168.                             return handle;
  169.                         } else {
  170.                             error = "Invalid image format";
  171.                         }
  172.                     } else {
  173.                         error = "Unsupported image type "";
  174.                         error += full_path;
  175.                         error += '"';
  176.                     }
  177.                 }
  178.                 
  179.             } catch(std::exception& e) {
  180.                 error = e.what();
  181.             }
  182.             catch(...)  {
  183.                 error = "Unknown error";
  184.             }
  185.         }
  186.         ERR_POST("CResourceManager: Error loading image  for alias "" << alias << "", " << error << '.');
  187.         return CFLTKImageHandle(NULL);
  188.         
  189.     } else {
  190.         return it->second;
  191.     }
  192. }
  193. END_NCBI_SCOPE
  194. /*
  195.  * ===========================================================================
  196.  * $Log: resource_manager.cpp,v $
  197.  * Revision 1000.0  2004/06/01 21:29:26  gouriano
  198.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  199.  *
  200.  * Revision 1.5  2004/05/21 22:27:53  gorelenk
  201.  * Added PCH ncbi_pch.hpp
  202.  *
  203.  * Revision 1.4  2004/05/13 17:25:01  yazhuk
  204.  * Extended CPNGImageExt::DrawTransparent() to support grayed-out images
  205.  *
  206.  * Revision 1.3  2004/05/10 16:25:40  yazhuk
  207.  * Addressed GCC warnings
  208.  *
  209.  * Revision 1.2  2004/05/03 19:48:53  yazhuk
  210.  * Added Fl_PNG_Image class, implemented support for "standard" directories
  211.  *
  212.  * Revision 1.1  2004/04/22 16:56:41  yazhuk
  213.  * Initial revision
  214.  *
  215.  *
  216.  * ===========================================================================
  217.  */