[Digikam-devel] extragear/graphics/digikam

Gilles Caulier caulier.gilles at free.fr
Sat Apr 15 10:34:19 BST 2006


SVN commit 530066 by cgilles:

digikam from trunk : reverse RAW file generator source code about thumbnail rotation. I suspect a problem in this code witch broke CR2 file thumbs and don't rotate properly thumbs (certainly some camera tags orientation flags without respect TIFF/EP spec).

Alternative solutions for the future :

1 / using future libopenraw library from freedesktop.org (http://www.freedesktop.org/wiki/Software_2flibopenraw)
2 / using Exiv2 thumbs extractor when TIFF/EP will be finalized (my prefered way (:=)))

CCMAIL: digikam-devel at kde.org

 M  +1 -25     kioslave/digikamthumbnail.cpp  
 M  +1 -17     libs/dcraw/dcraw_parse.cpp  
 M  +1 -6      libs/dcraw/dcraw_parse.h  
 M  +1 -25     utilities/cameragui/umscamera.cpp  


--- trunk/extragear/graphics/digikam/kioslave/digikamthumbnail.cpp #530065:530066
@@ -623,39 +623,15 @@
     KTempFile thumbFile(QString::null, "rawthumb");
     thumbFile.setAutoDelete(true);
     Digikam::DcrawParse rawFileParser;
-    int orientation = 0;
 
     if (thumbFile.status() == 0)
     {
         if (rawFileParser.getThumbnail(QFile::encodeName(path),
-                                       QFile::encodeName(thumbFile.name()),
-                                       &orientation) == 0)
+                                       QFile::encodeName(thumbFile.name())) == 0)
         {
             image.load(thumbFile.name());
             if (!image.isNull())
-            {
-                if(orientation)
-                {
-                    QWMatrix M;
-                    QWMatrix flip = QWMatrix(-1, 0, 0, 1, 0, 0);
-
-                    switch(orientation+1)
-                    {  // notice intentional fallthroughs
-                        case 2: M = flip; break;
-                        case 4: M = flip;
-                        case 3: M.rotate(180); break;
-                        case 5: M = flip;
-                        case 6: M.rotate(90); break;
-                        case 7: M = flip;
-                        case 8: M.rotate(270); break;
-                        default: break; // should never happen
-                    }
-
-                    image = image.xForm(M);
-                }
-                
                 return true;
-            }
         }
     }
 
--- trunk/extragear/graphics/digikam/libs/dcraw/dcraw_parse.cpp #530065:530066
@@ -56,7 +56,6 @@
 DcrawParse::DcrawParse()
 {
     order = 0;
-    flip  = 0;
 }
     
 DcrawParse::~DcrawParse()
@@ -402,9 +401,6 @@
       case 0x111:           /* StripOffset */
     if (!offset || is_dng) offset = val;
     break;
-      case 0x112:           /* Orientation */
-    flip = flip_map[(val-1) & 7];                // From KFile-Plugins:parse.c to get thumb orientation.
-    break;    
       case 0x117:           /* StripByteCounts */
     if (!length || is_dng) length = val;
     if (offset > val && !strncmp(make,"KODAK",5) && !is_dng)
@@ -1210,7 +1206,7 @@
    Get embedded thumbnail in RAW file.  Return nonzero if the file cannot be decoded.
 */
 
-int DcrawParse::getThumbnail(const char* infile, const char* outfile, int* orientation)
+int DcrawParse::getThumbnail(const char* infile, const char* outfile)
 {
   char head[32], *thumb, *rgb, *cp;
   unsigned hlen, fsize, toff, tlen, lsize, i;
@@ -1318,18 +1314,6 @@
   free (thumb);
 done:
   fclose (tfp);
-  
-  // From KFile-Plugins:parse.c to get thumb orientation.
-  
-  /* Coffin's code has different meaning for orientation
-     values than TIFF, so we map them to TIFF values */
-  switch ((flip+3600) % 360) {
-  case 270:  flip = 5;  break;
-  case 180:  flip = 3;  break;
-  case  90:  flip = 6;
-  }
-  if( orientation ) *orientation = flip_map[flip%7];
-
   return 0;
 }
 
--- trunk/extragear/graphics/digikam/libs/dcraw/dcraw_parse.h #530065:530066
@@ -28,17 +28,14 @@
 namespace Digikam
 {
 
-static const int flip_map[] = { 0,1,3,2,4,7,5,6 };
-
 class DIGIKAM_EXPORT DcrawParse
 {
-
 public:
 
     DcrawParse();
     ~DcrawParse();
 
-    int getThumbnail(const char* infile, const char* outfile, int* orientation);
+    int getThumbnail(const char* infile, const char* outfile);
     int getCameraModel(const char* infile, char* cameraConstructor, char* cameraModel);
 
 private:
@@ -60,8 +57,6 @@
     int    width, height, offset, length, bps, is_dng;
     int    thumb_offset, thumb_length, thumb_layers;
 
-    int    flip;   // From KFile-Plugins:parse.c to get thumb orientation.
-
 private:
 
     ushort  sget2 (uchar *s);
--- trunk/extragear/graphics/digikam/utilities/cameragui/umscamera.cpp #530065:530066
@@ -194,39 +194,15 @@
     KTempFile thumbFile(QString::null, "camerarawthumb");
     thumbFile.setAutoDelete(true);
     DcrawParse rawFileParser;
-    int orientation = 0;
   
     if (thumbFile.status() == 0)
     {
         if (rawFileParser.getThumbnail(QFile::encodeName(folder + "/" + itemName),
-                                       QFile::encodeName(thumbFile.name()),
-                                       &orientation) == 0)
+                                       QFile::encodeName(thumbFile.name())) == 0)
         {
             thumbnail.load(thumbFile.name());
             if (!thumbnail.isNull())
-            {
-                if(orientation)
-                {
-                    QWMatrix M;
-                    QWMatrix flip = QWMatrix(-1, 0, 0, 1, 0, 0);
-
-                    switch(orientation+1)
-                    {  // notice intentional fallthroughs
-                        case 2: M = flip; break;
-                        case 4: M = flip;
-                        case 3: M.rotate(180); break;
-                        case 5: M = flip;
-                        case 6: M.rotate(90); break;
-                        case 7: M = flip;
-                        case 8: M.rotate(270); break;
-                        default: break; // should never happen
-                    }
-
-                    thumbnail = thumbnail.xForm(M);
-                }
-                
                 return true;
-            }
         }
     }
 



More information about the Digikam-devel mailing list