cdrom: attempt to deal with broken subq :(
[pcsx_rearmed.git] / plugins / gpulib / cspace.c
index 8e3bee9..f0c4912 100644 (file)
@@ -91,6 +91,35 @@ void bgr_to_uyvy_init(void)
   }
 }
 
+void rgb565_to_uyvy(void *d, const void *s, int pixels)
+{
+  unsigned int *dst = d;
+  const unsigned short *src = s;
+  const unsigned char *yu = yuv_u + 32;
+  const unsigned char *yv = yuv_v + 32;
+  int r0, g0, b0, r1, g1, b1;
+  int y0, y1, u, v;
+
+  for (; pixels > 0; src += 2, dst++, pixels -= 2)
+  {
+    r0 = (src[0] >> 11) & 0x1f;
+    g0 = (src[0] >> 6) & 0x1f;
+    b0 =  src[0] & 0x1f;
+    r1 = (src[1] >> 11) & 0x1f;
+    g1 = (src[1] >> 6) & 0x1f;
+    b1 =  src[1] & 0x1f;
+    y0 = (yuv_ry[r0] + yuv_gy[g0] + yuv_by[b0]) >> 16;
+    y1 = (yuv_ry[r1] + yuv_gy[g1] + yuv_by[b1]) >> 16;
+    u = yu[b0 - y0];
+    v = yv[r0 - y0];
+    // valid Y range seems to be 16..235
+    y0 = 16 + 219 * y0 / 31;
+    y1 = 16 + 219 * y1 / 31;
+
+    *dst = (y1 << 24) | (v << 16) | (y0 << 8) | u;
+  }
+}
+
 void bgr555_to_uyvy(void *d, const void *s, int pixels)
 {
   unsigned int *dst = d;
@@ -112,7 +141,6 @@ void bgr555_to_uyvy(void *d, const void *s, int pixels)
     y1 = (yuv_ry[r1] + yuv_gy[g1] + yuv_by[b1]) >> 16;
     u = yu[b0 - y0];
     v = yv[r0 - y0];
-    // valid Y range seems to be 16..235
     y0 = 16 + 219 * y0 / 31;
     y1 = 16 + 219 * y1 / 31;