diff options
-rw-r--r-- | libkmstest/testpat.cpp | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/libkmstest/testpat.cpp b/libkmstest/testpat.cpp index 5c67660..f65a1f8 100644 --- a/libkmstest/testpat.cpp +++ b/libkmstest/testpat.cpp @@ -18,8 +18,6 @@ namespace kms { static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color) { - static RGB c1; - switch (buf.format()) { case PixelFormat::XRGB8888: { @@ -44,43 +42,55 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color) case PixelFormat::YVYU: case PixelFormat::VYUY: { + // HACK. we store the even pixels to c1, and only draw when at the odd pixel. + + static RGB c1; + if ((x & 1) == 0) { c1 = color; return; } + // adjust X back to the even pixel + x--; + uint8_t *p = (uint8_t*)(buf.map(0) + buf.stride(0) * y + x * 2); YUV yuv1 = c1.yuv(); YUV yuv2 = color.yuv(); + uint8_t y0 = yuv1.y; + uint8_t y1 = yuv2.y; + uint8_t u = (yuv1.u + yuv2.u) / 2; + uint8_t v = (yuv1.v + yuv2.v) / 2; + 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; + p[0] = u; + p[1] = y0; + p[2] = v; + p[3] = y1; 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; + p[0] = y0; + p[1] = u; + p[2] = y1; + p[3] = v; 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; + p[0] = y0; + p[1] = v; + p[2] = y1; + p[3] = u; 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; + p[0] = v; + p[1] = y0; + p[2] = u; + p[3] = y1; break; default: break; |