Update the trunk to the OpenCV's CVS (2008-07-14)
[opencv] / otherlibs / highgui / utils.cpp
index 383abda..c5b48ff 100644 (file)
 #include "_highgui.h"
 #include "utils.h"
 
+#if defined WIN32 && defined _MSC_VER && _MSC_VER >= 1200
+#if defined WIN64 && defined EM64T
+    #ifdef _DEBUG
+        #pragma comment(lib, "libjasperd_64.lib")
+        #pragma comment(lib, "libjpegd_64.lib")
+        #pragma comment(lib, "libpngd_64.lib")
+        #pragma comment(lib, "libtiffd_64.lib")
+        #pragma comment(lib, "zlibd_64.lib")
+    #else
+        #pragma comment(lib, "libjasper_64.lib")
+        #pragma comment(lib, "libjpeg_64.lib")
+        #pragma comment(lib, "libpng_64.lib")
+        #pragma comment(lib, "libtiff_64.lib")
+        #pragma comment(lib, "zlib_64.lib")
+    #endif
+#elif !defined WIN64
+    #ifdef _DEBUG
+        #pragma comment(lib, "libjasperd.lib")
+        #pragma comment(lib, "libjpegd.lib")
+        #pragma comment(lib, "libpngd.lib")
+        #pragma comment(lib, "libtiffd.lib")
+        #pragma comment(lib, "zlibd.lib")
+    #else
+        #pragma comment(lib, "libjasper.lib")
+        #pragma comment(lib, "libjpeg.lib")
+        #pragma comment(lib, "libpng.lib")
+        #pragma comment(lib, "libtiff.lib")
+        #pragma comment(lib, "zlib.lib")
+    #endif
+#endif
+#endif
+
 #define  SCALE  14
 #define  cR  (int)(0.299*(1 << SCALE) + 0.5)
 #define  cG  (int)(0.587*(1 << SCALE) + 0.5)
@@ -546,12 +578,13 @@ cvConvertImage( const CvArr* srcarr, CvArr* dstarr, int flags )
 
     CvMat srcstub, *src;
     CvMat dststub, *dst;
-    int src_cn, swap_rb = flags & CV_CVTIMG_SWAP_RB;
+    int src_cn, dst_cn, swap_rb = flags & CV_CVTIMG_SWAP_RB;
 
     CV_CALL( src = cvGetMat( srcarr, &srcstub ));
     CV_CALL( dst = cvGetMat( dstarr, &dststub ));
 
     src_cn = CV_MAT_CN( src->type );
+    dst_cn = CV_MAT_CN( dst->type );
 
     if( src_cn != 1 && src_cn != 3 && src_cn != 4 )
         CV_ERROR( CV_BadNumChannels, "Source image must have 1, 3 or 4 channels" );
@@ -564,20 +597,29 @@ cvConvertImage( const CvArr* srcarr, CvArr* dstarr, int flags )
     
     if( !CV_ARE_DEPTHS_EQ( src, dst ))
     {
-        double scale = 0, shift = 0;
         int src_depth = CV_MAT_DEPTH(src->type);
-        temp = cvCreateMat( src->height, src->width,
-                            (src->type & CV_MAT_CN_MASK)|(dst->type & CV_MAT_DEPTH_MASK));
-        scale = src_depth <= CV_8S ? 1 : src_depth <= CV_32S ? 1./256 : 255;
-        shift = src_depth == CV_8S || src_depth == CV_16S ? 128 : 0;
-        cvConvertScale( src, temp, scale, shift );
-        src = temp;
+        double scale = src_depth <= CV_8S ? 1 : src_depth <= CV_32S ? 1./256 : 255;
+        double shift = src_depth == CV_8S || src_depth == CV_16S ? 128 : 0;
+        
+        if( !CV_ARE_CNS_EQ( src, dst ))
+        {
+            temp = cvCreateMat( src->height, src->width,
+                (src->type & CV_MAT_CN_MASK)|(dst->type & CV_MAT_DEPTH_MASK));
+            cvConvertScale( src, temp, scale, shift );
+            src = temp;
+        }
+        else
+        {
+            cvConvertScale( src, dst, scale, shift );
+            src = dst;
+        }
     }
 
+    if( src_cn != dst_cn || src_cn == 3 && swap_rb )
     {
         uchar *s = src->data.ptr, *d = dst->data.ptr;
         int s_step = src->step, d_step = dst->step;
-        int code = src_cn*10 + CV_MAT_CN(dst->type);
+        int code = src_cn*10 + dst_cn;
         CvSize size = { src->cols, src->rows };
 
         if( CV_IS_MAT_CONT(src->type & dst->type) )
@@ -596,8 +638,8 @@ cvConvertImage( const CvArr* srcarr, CvArr* dstarr, int flags )
             icvCvt_BGR2Gray_8u_C3C1R( s, s_step, d, d_step, size, swap_rb );
             break;
         case 33:
-            if( swap_rb )
-                icvCvt_RGB2BGR_8u_C3R( s, s_step, d, d_step, size );
+            assert( swap_rb );
+            icvCvt_RGB2BGR_8u_C3R( s, s_step, d, d_step, size );
             break;
         case 41:
             icvCvt_BGRA2Gray_8u_C4C1R( s, s_step, d, d_step, size, swap_rb );
@@ -608,9 +650,7 @@ cvConvertImage( const CvArr* srcarr, CvArr* dstarr, int flags )
         default:
             CV_ERROR( CV_StsUnsupportedFormat, "Unsupported combination of input/output formats" );
         }
-
-        if( code != 33 || swap_rb )
-            src = dst;
+        src = dst;
     }
 
     if( flags & CV_CVTIMG_FLIP )