[Digikam-devel] extragear/graphics/digikam/libs/widgets/imageplugins

Gilles Caulier caulier.gilles at kdemail.net
Mon Jan 15 10:02:49 GMT 2007


SVN commit 623707 by cgilles:

digiKam from trunk : Image Editor : fix color managed view rendering in all pixels based correction plugins (like blur/sharepn tools).
CCMAIL: digikam-devel at kde.org

 M  +30 -33    imageregionwidget.cpp  
 M  +6 -7      imageregionwidget.h  


--- trunk/extragear/graphics/digikam/libs/widgets/imageplugins/imageregionwidget.cpp #623706:623707
@@ -55,7 +55,6 @@
     {
         iface            = 0;
         movingInProgress = false;
-        pixmap           = 0;
         pixmapRegion     = 0;
         zoomFactor       = 1.0;
         separateView     = ImageRegionWidget::SeparateViewVertical;
@@ -69,12 +68,12 @@
 
     double       zoomFactor;
 
-    QPixmap     *pixmap;                // Entire content widget pixmap.
+    QPixmap      pixmap;                // Entire content widget pixmap.
     QPixmap     *pixmapRegion;          // Pixmap of current region to render.
     
     QPointArray  hightlightPoints;
     
-    QImage       image;                // Entire content image to render pixmap.
+    DImg         image;                 // Entire content image to render pixmap.
     
     ImageIface  *iface;
 };
@@ -100,7 +99,6 @@
 ImageRegionWidget::~ImageRegionWidget()
 {
     if (d->iface)        delete d->iface;
-    if (d->pixmap)       delete d->pixmap;
     if (d->pixmapRegion) delete d->pixmapRegion;
     delete d;
 }
@@ -110,14 +108,14 @@
     QPoint currentPos((int)(contentsX() / d->zoomFactor), (int)(contentsY() / d->zoomFactor));
     kapp->setOverrideCursor( KCursor::waitCursor() );
     
-    d->image = d->iface->getOriginalImg()->copyQImage(); 
+    d->image = d->iface->getOriginalImg()->copy(); 
 
     d->zoomFactor = factor;
 
     if(d->zoomFactor != 1.0)
     {
-        QImage img = d->image.scale((uint)(d->image.width()  * d->zoomFactor), 
-                                    (uint)(d->image.height() * d->zoomFactor));
+        DImg img = d->image.smoothScale((uint)(d->image.width()  * d->zoomFactor), 
+                                        (uint)(d->image.height() * d->zoomFactor));
         d->image = img;
     }
     
@@ -160,7 +158,7 @@
     updatePixmap(d->image);
 }
 
-void ImageRegionWidget::updatePixmap(const QImage& img)
+void ImageRegionWidget::updatePixmap(DImg& img)
 {
     horizontalScrollBar()->setLineStep( 1 );
     horizontalScrollBar()->setPageStep( 1 );
@@ -170,38 +168,31 @@
     int w = img.width();
     int h = img.height();
     
-    if (d->pixmap)
-    {
-        delete d->pixmap;
-        d->pixmap = 0;
-    }
-    
     switch (d->separateView)
     {
         case SeparateViewVertical:
         case SeparateViewHorizontal:
         case SeparateViewNone:
         {
-            d->pixmap = new QPixmap(w, h);
-            d->pixmap->convertFromImage(img);
+            d->pixmap = d->iface->convertToPixmap(img);
             resizeContents(w, h);
             break;
         }
         case SeparateViewDuplicateVert:
         {
-            QPixmap pix(img);
-            d->pixmap = new QPixmap(w+visibleWidth()/2, h);
-            d->pixmap->fill(paletteBackgroundColor().rgb());
-            copyBlt( d->pixmap, 0, 0, &pix, 0, 0, w, h );
+            QPixmap pix = d->iface->convertToPixmap(img);
+            d->pixmap   = QPixmap(w+visibleWidth()/2, h);
+            d->pixmap.fill(paletteBackgroundColor().rgb());
+            copyBlt( &d->pixmap, 0, 0, &pix, 0, 0, w, h );
             resizeContents(w+visibleWidth()/2, h);
             break;
         }
         case SeparateViewDuplicateHorz:
         {
-            QPixmap pix(img);
-            d->pixmap = new QPixmap(w, h+visibleHeight()/2);
-            d->pixmap->fill(paletteBackgroundColor().rgb());
-            copyBlt( d->pixmap, 0, 0, &pix, 0, 0, w, h );
+            QPixmap pix = d->iface->convertToPixmap(img);
+            d->pixmap   = QPixmap(w, h+visibleHeight()/2);
+            d->pixmap.fill(paletteBackgroundColor().rgb());
+            copyBlt( &d->pixmap, 0, 0, &pix, 0, 0, w, h );
             resizeContents(w, h+visibleHeight()/2);
             break;
         }
@@ -214,8 +205,7 @@
 
 void ImageRegionWidget::drawContents(QPainter *p, int x, int y, int w, int h)
 {
-    if(!d->pixmap) return;
-    else p->drawPixmap(x, y, *d->pixmap, x, y, w, h);
+    p->drawPixmap(x, y, d->pixmap, x, y, w, h);
     
     if (!d->movingInProgress)
     {
@@ -354,25 +344,32 @@
 void ImageRegionWidget::backupPixmapRegion(void)
 {
     if (d->pixmapRegion) delete d->pixmapRegion;
-    QRect area = getLocalTargetImageRegion();
+    QRect area      = getLocalTargetImageRegion();
     d->pixmapRegion = new QPixmap(area.size());
-    copyBlt( d->pixmapRegion, 0, 0, d->pixmap, area.x(), area.y(), area.width(), area.height() );
+    copyBlt( d->pixmapRegion, 0, 0, &d->pixmap, area.x(), area.y(), area.width(), area.height() );
 }
 
 void ImageRegionWidget::restorePixmapRegion(void)
 {
     if (!d->pixmapRegion) return;
     QRect area = getLocalTargetImageRegion();
-    copyBlt( d->pixmap, area.x(), area.y(), d->pixmapRegion, 0, 0, area.width(), area.height() );
+    copyBlt( &d->pixmap, area.x(), area.y(), d->pixmapRegion, 0, 0, area.width(), area.height() );
 }
 
 void ImageRegionWidget::updatePreviewImage(DImg *img)
 {
-    QImage image = img->copyQImage();
-    QPixmap pix( image.scale((uint)(image.width()  * d->zoomFactor), 
-                             (uint)(image.height() * d->zoomFactor)));
+    DImg image = img->copy();
+
+    // Because image plugins are tool witch only work on image data, the DImg container
+    // do not contain metadata from original image. About Color Managed View, we need to 
+    // restore the embedded ICC color profile. 
+    image.setICCProfil(d->image.getICCProfil());
+
+    image.resize((uint)(image.width()  * d->zoomFactor), 
+                 (uint)(image.height() * d->zoomFactor));
+    QPixmap pix = d->iface->convertToPixmap(image);
     QRect area  = getLocalTargetImageRegion();
-    copyBlt( d->pixmap, area.x(), area.y(), &pix, 0, 0, area.width(), area.height() );
+    copyBlt( &d->pixmap, area.x(), area.y(), &pix, 0, 0, area.width(), area.height() );
 }
 
 DImg ImageRegionWidget::getImageRegionImage(void)
--- trunk/extragear/graphics/digikam/libs/widgets/imageplugins/imageregionwidget.h #623706:623707
@@ -25,7 +25,6 @@
 
 #include <qscrollview.h>
 #include <qrect.h>
-#include <qimage.h>
 
 // Local includes
 
@@ -83,16 +82,16 @@
     
 protected:
     
-    void viewportResizeEvent( QResizeEvent *e );
-    void contentsMousePressEvent ( QMouseEvent * e );
-    void contentsMouseReleaseEvent ( QMouseEvent * e );
-    void contentsMouseMoveEvent( QMouseEvent * e );
-    void contentsWheelEvent( QWheelEvent * e ){ e->accept(); };
+    void viewportResizeEvent(QResizeEvent*);
+    void contentsMousePressEvent(QMouseEvent*);
+    void contentsMouseReleaseEvent(QMouseEvent*);
+    void contentsMouseMoveEvent(QMouseEvent*);
+    void contentsWheelEvent(QWheelEvent *e){ e->accept(); };
 
 private:
     
     void  drawContents(QPainter *p, int x, int y, int w, int h);
-    void  updatePixmap(const QImage& img);
+    void  updatePixmap(DImg& img);
     QRect getLocalTargetImageRegion(void);
     QRect getLocalImageRegionToRender(void);
 



More information about the Digikam-devel mailing list