diff options
| -rw-r--r-- | libkms++/dumbframebuffer.cpp | 2 | ||||
| -rw-r--r-- | libkms++/pixelformats.h | 4 | ||||
| -rw-r--r-- | libkmstest/testpat.cpp | 53 | 
3 files changed, 39 insertions, 20 deletions
diff --git a/libkms++/dumbframebuffer.cpp b/libkms++/dumbframebuffer.cpp index cb815da..f422081 100644 --- a/libkms++/dumbframebuffer.cpp +++ b/libkms++/dumbframebuffer.cpp @@ -55,6 +55,8 @@ static const map<PixelFormat, FormatInfo> format_info_array = {  	/* YUV packed */  	{ PixelFormat::UYVY, { 1, { { 32, 2, 1 } }, } },  	{ PixelFormat::YUYV, { 1, { { 32, 2, 1 } }, } }, +	{ PixelFormat::YVYU, { 1, { { 32, 2, 1 } }, } }, +	{ PixelFormat::VYUY, { 1, { { 32, 2, 1 } }, } },  	/* YUV semi-planar */  	{ PixelFormat::NV12, { 2, { { 8, 1, 1, }, { 16, 2, 2 } }, } },  	/* RGB16 */ diff --git a/libkms++/pixelformats.h b/libkms++/pixelformats.h index 6741ea4..4432cac 100644 --- a/libkms++/pixelformats.h +++ b/libkms++/pixelformats.h @@ -11,8 +11,12 @@ enum class PixelFormat : uint32_t  {  	NV12 = MakeFourCC("NV12"),  	NV21 = MakeFourCC("NV21"), +  	UYVY = MakeFourCC("UYVY"),  	YUYV = MakeFourCC("YUYV"), +	YVYU = MakeFourCC("YVYU"), +	VYUY = MakeFourCC("VYUY"), +  	XRGB8888 = MakeFourCC("XR24"),  	XBGR8888 = MakeFourCC("XB24"),  	RGB565 = MakeFourCC("RG16"), diff --git a/libkmstest/testpat.cpp b/libkmstest/testpat.cpp index f621b91..5c67660 100644 --- a/libkmstest/testpat.cpp +++ b/libkmstest/testpat.cpp @@ -40,6 +40,9 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color)  		break;  	}  	case PixelFormat::UYVY: +	case PixelFormat::YUYV: +	case PixelFormat::YVYU: +	case PixelFormat::VYUY:  	{  		if ((x & 1) == 0) {  			c1 = color; @@ -51,28 +54,38 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color)  		YUV yuv1 = c1.yuv();  		YUV yuv2 = color.yuv(); -		p[0] = (yuv1.u + yuv2.u) / 2; -		p[1] = yuv1.y; -		p[2] = (yuv1.v + yuv2.v) / 2; -		p[3] = yuv2.y; -		break; -	} -	case PixelFormat::YUYV: -	{ -		if ((x & 1) == 0) { -			c1 = color; -			return; +		switch (buf.format()) { +		case PixelFormat::UYVY: +			p[0] = (yuv1.u + yuv2.u) / 2; +			p[1] = yuv1.y; +			p[2] = (yuv1.v + yuv2.v) / 2; +			p[3] = yuv2.y; +			break; + +		case PixelFormat::YUYV: +			p[0] = yuv1.y; +			p[1] = (yuv1.u + yuv2.u) / 2; +			p[2] = yuv2.y; +			p[3] = (yuv1.v + yuv2.v) / 2; +			break; + +		case PixelFormat::YVYU: +			p[0] = yuv1.y; +			p[1] = (yuv1.v + yuv2.v) / 2; +			p[2] = yuv2.y; +			p[3] = (yuv1.u + yuv2.u) / 2; +			break; + +		case PixelFormat::VYUY: +			p[0] = (yuv1.v + yuv2.v) / 2; +			p[1] = yuv1.y; +			p[2] = (yuv1.u + yuv2.u) / 2; +			p[3] = yuv2.y; +			break; +		default: +			break;  		} -		uint8_t *p = (uint8_t*)(buf.map(0) + buf.stride(0) * y + x * 2); - -		YUV yuv1 = c1.yuv(); -		YUV yuv2 = color.yuv(); - -		p[0] = yuv1.y; -		p[1] = (yuv1.u + yuv2.u) / 2; -		p[2] = yuv2.y; -		p[3] = (yuv1.v + yuv2.v) / 2;  		break;  	}  	default:  | 
