OK, that wasn't so clever...

The rest of the patch is attached... :)

/August.
-- 
Bj|rn Augustsson      DCE/DFS Sysadmin     IT Systems & Services
Chalmers tekniska h|gskola     Chalmers University of Technology
         "Damn spooky analog crap." -- John Carmack.
--- /dev/null   2003-01-11 23:38:27.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/common/xvconv.c      2003-02-24 03:17:20.000000000 
+0100
@@ -0,0 +1,79 @@
+/* $XFree86:  $ */
+
+/*
+** File: 
+**
+**   xvconv.c --- Xv color conversion routine.
+**
+** Author: 
+**
+**   Bjorn Augustsson <[EMAIL PROTECTED]>
+**
+** Revisions:
+**
+**   11.feb.2003 august
+**     - centralize XXXXCopyMungedData from many drivers
+**
+*/
+
+#include "Xmd.h"       /* For CARDXX */
+#include "Xarch.h"     /* For endianness macros */
+#include "xvconv.h"
+
+void
+YV12toUYVY(
+   const unsigned char *src1,
+   const unsigned char *src2,
+   const unsigned char *src3,
+   unsigned char *dst1,
+   int srcPitch,
+   int srcPitch2,
+   int dstPitch,
+   int h,
+   int w
+){
+   CARD32 *dst;
+   const CARD8 *s1, *s2, *s3;
+   int i, j;
+
+   w >>= 1;
+
+   for(j = 0; j < h; j++) {
+        dst = (CARD32*)dst1;
+        s1 = src1;  s2 = src2;  s3 = src3;
+        i = w;
+        while(i > 4) {
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+           dst[0] = (s1[0] << 24) | (s1[1] << 8) | (s3[0] << 16) | s2[0];
+           dst[1] = (s1[2] << 24) | (s1[3] << 8) | (s3[1] << 16) | s2[1];
+           dst[2] = (s1[4] << 24) | (s1[5] << 8) | (s3[2] << 16) | s2[2];
+           dst[3] = (s1[6] << 24) | (s1[7] << 8) | (s3[3] << 16) | s2[3];
+#else
+           dst[0] = s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24);
+           dst[1] = s1[2] | (s1[3] << 16) | (s3[1] << 8) | (s2[1] << 24);
+           dst[2] = s1[4] | (s1[5] << 16) | (s3[2] << 8) | (s2[2] << 24);
+           dst[3] = s1[6] | (s1[7] << 16) | (s3[3] << 8) | (s2[3] << 24);
+#endif
+           dst += 4; s2 += 4; s3 += 4; s1 += 8;
+           i -= 4;
+        }
+
+        while(i--) {
+#if X_BYTE_ORDER == X_BIG_ENDIAN
+           dst[0] = (s1[0] << 24) | (s1[1] << 8) | (s3[0] << 16) | s2[0];
+#else
+           dst[0] = s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24);
+#endif
+           dst++; s2++; s3++;
+           s1 += 2;
+        }
+
+        dst1 += dstPitch;
+        src1 += srcPitch;
+        if(j & 1) {
+            src2 += srcPitch2;
+            src3 += srcPitch2;
+        }
+   }
+}
+
--- /dev/null   2003-01-11 23:38:27.000000000 +0100
+++ xc/programs/Xserver/hw/xfree86/common/xvconv.h      2003-02-24 03:19:02.000000000 
+0100
@@ -0,0 +1,20 @@
+/* $XFree86:  $ */
+
+#ifndef _XVCONV_H
+#define _XVCONV_H
+
+
+void YV12toUYVY(
+   const unsigned char *src1,
+   const unsigned char *src2,
+   const unsigned char *src3,
+   unsigned char *dst1,
+   int srcPitch,
+   int srcPitch2,
+   int dstPitch,
+   int h,
+   int w);
+
+
+#endif /* _XVCONV_H */
+

Reply via email to