shithub: treason

Download patch

ref: 14e6292060224eaab98ecd331b7ac3c309beb2e2
parent: 2320b8e811830601ad68e6c84ab138a20b5e4d79
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Mon Feb 8 16:15:31 EST 2021

use yuv to xrgb32 conversion instead of rgb24

--- a/main.c
+++ b/main.c
@@ -94,11 +94,11 @@
 		loadimage(curim, r, curpx, f->w*f->h);
 	}else{
 		if(curim == nil)
-			curim = allocimage(display, r, RGB24, 0, DNofill);
+			curim = allocimage(display, r, XRGB32, 0, DNofill);
 		if(curpx == nil)
-			curpx = malloc(f->w*f->h*3);
-		yuv420_rgb24(f->w, f->h, f->yuv[0], f->yuv[1], f->yuv[2], f->ystride, f->uvstride, curpx, f->w*3);
-		loadimage(curim, r, curpx, f->w*f->h*3);
+			curpx = malloc(f->w*f->h*4);
+		yuv420_xrgb32(f->w, f->h, f->yuv[0], f->yuv[1], f->yuv[2], f->ystride, f->uvstride, curpx, f->w*4);
+		loadimage(curim, r, curpx, f->w*f->h*4);
 	}
 
 	dispdelay = nanosec() - x;
--- a/misc.h
+++ b/misc.h
@@ -4,7 +4,7 @@
 int str2fmt(char *s);
 char *fmt2str(int fmt);
 uvlong nanosec(void);
-void yuv420_rgb24(int width, int height, u8int *y, u8int *u, u8int *v, u32int ystride, u32int uvstride, u8int *rgb, u32int rgbstride);
+void yuv420_xrgb32(int width, int height, u8int *y, u8int *u, u8int *v, u32int ystride, u32int uvstride, u8int *rgb, u32int rgbstride);
 
 extern int nproc;
 extern int debug;
--- a/yuv.c
+++ b/yuv.c
@@ -3,7 +3,7 @@
 
 uvlong yuv→rgb;
 
-void yuv420_rgb24(
+void yuv420_xrgb32(
 	int width, int height,
 	u8int *y, u8int *u, u8int *v,
 	u32int ystride, u32int uvstride,
@@ -21,20 +21,23 @@
 			cr = *v - 0x80;
 			go = 22554*cb + 46802*cr;
 
+			cb *= 116130;
+			cr *= 91881;
+
 #define ONE do{ \
 			yy = *y * 0x10101; \
-			b = yy + 116130*cb; \
+			b = yy + cb; \
 			rgb[0] = (b >> 24) ? ~(b >> 31) : (b>>16); \
 			g = yy - go; \
 			rgb[1] = (g >> 24) ? ~(g >> 31) : (g>>16); \
-			r = yy + 91881*cr; \
+			r = yy + cr; \
 			rgb[2] = (r >> 24) ? ~(r >> 31) : (r>>16); \
 }while(0)
-
-			ONE; y += 1;       rgb += 3;
+			ONE; y += 1;       rgb += 4;
 			ONE; y += ystride; rgb += rgbstride;
-			ONE; y -= 1;       rgb -= 3;
-			ONE; y -= ystride; rgb -= rgbstride - 6;
+			ONE; y -= 1;       rgb -= 4;
+			ONE; y -= ystride; rgb -= rgbstride - 8;
+#undef ONE
 
 			y += 2;
 			u += 1;
@@ -44,7 +47,7 @@
 		y += ystride*2 - w;
 		u += uvstride - w/2;
 		v += uvstride - w/2;
-		rgb += rgbstride*2 - 3*w;
+		rgb += rgbstride*2 - 4*w;
 	}
 	yuv→rgb = nanosec() - start;
 }