]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
no message
authorstv <stv@opencascade.com>
Thu, 30 Mar 2006 07:26:55 +0000 (07:26 +0000)
committerstv <stv@opencascade.com>
Thu, 30 Mar 2006 07:26:55 +0000 (07:26 +0000)
src/Qtx/Qtx.cxx
src/Qtx/Qtx.h
src/Qtx/QtxResourceMgr.cxx

index 41231fbe8523068566d8681ba00906ef0a1cc8cc..ac512c146e18587c61d7d7875644b79cc9d2286e 100755 (executable)
 #include "Qtx.h"
 
 #include <qdir.h>
+#include <qimage.h>
+#include <qcolor.h>
 #include <qstring.h>
 #include <qwidget.h>
 #include <qlayout.h>
+#include <qbitmap.h>
+#include <qpainter.h>
 #include <qtoolbar.h>
 #include <qgroupbox.h>
 #include <qfileinfo.h>
@@ -556,3 +560,119 @@ void Qtx::scaleColors( const int num, QValueList<QColor>& lst )
   for ( int i = 0; i < num; i++ )
     lst.append( scaleColor( i, 0, num - 1 ) );
 }
+
+/*!
+       Name: grayscale [static public]
+       Desc: Convert color image to grayscale image.
+*/
+QImage Qtx::grayscale( const QImage& img )
+{
+  QImage res = img;
+
+  int colNum = res.numColors();
+  if ( colNum )
+  {
+    for ( int i = 0; i < colNum; i++ )
+      res.setColor( i, qGray( res.color( i ) ) );
+  }
+  else
+  {
+    for ( int y = 0; y < res.height(); y++ )
+    {
+      for ( int x = 0; x < res.width(); x++ )
+      {
+        QRgb pix = res.pixel( x, y );
+        res.setPixel( x, y, qRgba( qGray( pix ), qGray( pix ), qGray( pix ), qAlpha( pix ) ) );
+      }
+    }
+  }
+
+  return res;
+}
+
+/*!
+       Name: grayscale [static public]
+       Desc: Convert color pixmap to grayscale pixmap.
+*/
+QPixmap Qtx::grayscale( const QPixmap& pix )
+{
+  QPixmap res;
+  res.convertFromImage( grayscale( pix.convertToImage() ) );
+  return res;
+}
+
+/*!
+       Name: composite [static public]
+       Desc: Create composite pixmap. Pixmap 'pix' draws over pixmap 'dest' with coordinates
+        specified relative upper left corner of 'dest'. If 'dest' not given then new empty
+        pixmap with appropriate size created.
+*/
+QPixmap Qtx::composite( const QPixmap& pix, const int x, const int y, const QPixmap& dest )
+{
+  if ( pix.isNull() )
+    return dest;
+
+  int width = QMAX( pix.width() + x, dest.width() );
+  int height = QMAX( pix.height() + y, dest.height() );
+
+  QPixmap res( width, height );
+
+  QImage img( width, height, 32 );
+  img.setAlphaBuffer( true );
+  for ( int i = 0; i < img.height(); i++ )
+    for ( int j = 0; j < img.width(); j++ )
+      img.setPixel( j, i, qRgba( 0, 0, 0, 0 ) );
+
+  QPainter p;
+  p.begin( &res );
+  p.fillRect( 0, 0, width, height, QBrush( white ) );
+
+  if ( !dest.isNull() )
+  {
+    p.drawPixmap( 0, 0, dest );
+    QImage temp = dest.convertToImage();
+    for ( int i = 0; i < temp.width() && i < img.width(); i++ )
+    {
+      for ( int j = 0; j < temp.height() && j < img.height(); j++ )
+      {
+        if ( temp.hasAlphaBuffer() )
+          img.setPixel( i, j, temp.pixel( i, j ) );
+        else
+        {
+          QRgb p = temp.pixel( i, j );
+          img.setPixel( i, j, qRgba( qRed( p ), qGreen( p ), qBlue( p ), 255 ) );
+        }
+      }
+    }
+  }
+
+  p.drawPixmap( x, y, pix );
+  QImage temp = pix.convertToImage();
+  for ( int c = x; c < temp.width() + x && c < img.width(); c++ )
+  {
+    for ( int r = y; r < temp.height() + y && r < img.height(); r++ )
+    {
+      if ( qAlpha( temp.pixel( c - x, r - y ) ) > 0 )
+        img.setPixel( c, r, temp.pixel( c - x, r - y ) );
+    }
+  }
+
+  p.end();
+
+  for ( int ai = 0; ai < img.width(); ai++ )
+  {
+    for ( int aj = 0; aj < img.height(); aj++ )
+    {
+      if ( qAlpha( img.pixel( ai, aj ) ) < 1 )
+        img.setPixel( ai, aj, qRgba( 255, 255, 255, 255 ) );
+      else
+        img.setPixel( ai, aj, qRgba( 0, 0, 0, 0 ) );
+    }
+  }
+
+  QBitmap bmp( width, height );
+  bmp.convertFromImage( img, Qt::ColorMode_Mask | Qt::ThresholdDither );
+  res.setMask( bmp );
+
+  return res;
+}
index c16bd7b231b907cf30755369a484099ed4a906bc..45933d112ade47438dbc0847cf003b38f5c77f20 100755 (executable)
@@ -46,6 +46,7 @@
 #define INCLUDE_MENUITEM_DEF
 #endif
 
+#include <qpixmap.h>
 #include <qnamespace.h>
 
 #ifndef QT_VERSION
@@ -68,6 +69,7 @@
 #endif
 #endif
 
+class QImage;
 class QObject;
 class QString;
 class QWidget;
@@ -127,6 +129,11 @@ public:
 
   static QColor  scaleColor( const int, const int, const int );
   static void    scaleColors( const int, QValueList<QColor>& );
+
+  static QImage  grayscale( const QImage& );
+  static QPixmap grayscale( const QPixmap& );
+  static QPixmap composite( const QPixmap&, const int, const int,
+                            const QPixmap& = QPixmap() );
 };
 
 #endif
index 1e4e6223f973661a1c2e8aa8300c04c949cb3b2a..c4ff62142818f6de24204f48d91bef18bb4f40b4 100644 (file)
@@ -175,16 +175,19 @@ QString QtxResourceMgr::Resources::fileName( const QString& sect, const QString&
 
 QPixmap QtxResourceMgr::Resources::loadPixmap( const QString& sect, const QString& prefix, const QString& name ) const
 {
-  QString fname = fileName( sect, prefix, name );
-  bool toCache = resMgr() ? resMgr()->isPixmapCached() : false;
   QPixmap p;
-  if( toCache && myPixmapCache.contains( fname ) )
+  QString fname = fileName( sect, prefix, name );
+  bool toCache = resMgr() && resMgr()->isPixmapCached();
+  if ( toCache && myPixmapCache.contains( fname ) )
     p = myPixmapCache[fname];
   else
   {
     p.load( fname );
-    if( toCache )
-      ( ( QMap<QString,QPixmap>& )myPixmapCache ).insert( fname, p );
+    if ( toCache )
+    {
+      Resources* that = (Resources*)this;
+      that->myPixmapCache.insert( fname, p );
+    }
   }
   return p;
 }