draw_text: support YUV modes
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 15 Jun 2016 07:37:43 +0000 (10:37 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 15 Jun 2016 10:49:32 +0000 (13:49 +0300)
kms++util/src/drawing.cpp

index a5377be5f1586f466cdd2b3884ec5d06bb60bd28..cb6fbf657bc5bb44b514fa3ea9753c8ca87a1d61 100644 (file)
@@ -80,7 +80,7 @@ void draw_yuv422_macropixel(IMappedFramebuffer& buf, unsigned x, unsigned y, YUV
 }
 
 void draw_yuv420_macropixel(IMappedFramebuffer& buf, unsigned x, unsigned y,
-                                  YUV yuv1, YUV yuv2, YUV yuv3, YUV yuv4)
+                           YUV yuv1, YUV yuv2, YUV yuv3, YUV yuv4)
 {
        ASSERT((x & 1) == 0);
        ASSERT((y & 1) == 0);
@@ -130,18 +130,68 @@ void draw_rect(IMappedFramebuffer &fb, uint32_t x, uint32_t y, uint32_t w, uint3
        }
 }
 
-static void draw_char(IMappedFramebuffer& buf, uint32_t xpos, uint32_t ypos, char c, RGB color)
+static bool get_char_pixel(char c, uint32_t x, uint32_t y)
 {
 #include "font_8x8.h"
 
-       for (uint32_t y = 0; y < 8; y++) {
-               uint8_t bits = fontdata_8x8[8 * c + y];
+       uint8_t bits = fontdata_8x8[8 * c + y];
+       bool bit = (bits >> (7 - x)) & 1;
+
+       return bit;
+}
+
+static void draw_char(IMappedFramebuffer& buf, uint32_t xpos, uint32_t ypos, char c, RGB color)
+{
+       unsigned x, y;
+       YUV yuvcolor = color.yuv();
+
+       switch (buf.format()) {
+       case PixelFormat::XRGB8888:
+       case PixelFormat::XBGR8888:
+       case PixelFormat::ARGB8888:
+       case PixelFormat::ABGR8888:
+       case PixelFormat::RGB565:
+               for (y = 0; y < 8; y++) {
+                       for (x = 0; x < 8; x++) {
+                               bool b = get_char_pixel(c, x, y);
+
+                               draw_rgb_pixel(buf, xpos + x, ypos + y, b ? color : RGB());
+                       }
+               }
+               break;
 
-               for (uint32_t x = 0; x < 8; x++) {
-                       bool bit = (bits >> (7 - x)) & 1;
+       case PixelFormat::UYVY:
+       case PixelFormat::YUYV:
+       case PixelFormat::YVYU:
+       case PixelFormat::VYUY:
+               for (y = 0; y < 8; y++) {
+                       for (x = 0; x < 8; x += 2) {
+                               bool b0 = get_char_pixel(c, x, y);
+                               bool b1 = get_char_pixel(c, x + 1, y);
+
+                               draw_yuv422_macropixel(buf, xpos + x, ypos + y,
+                                                      b0 ? yuvcolor : YUV(), b1 ? yuvcolor : YUV());
+                       }
+               }
+               break;
 
-                       draw_rgb_pixel(buf, xpos + x, ypos + y, bit ? color : RGB());
+       case PixelFormat::NV12:
+       case PixelFormat::NV21:
+               for (y = 0; y < 8; y += 2) {
+                       for (x = 0; x < 8; x += 2) {
+                               bool b00 = get_char_pixel(c, x, y);
+                               bool b10 = get_char_pixel(c, x + 1, y);
+                               bool b01 = get_char_pixel(c, x, y + 1);
+                               bool b11 = get_char_pixel(c, x + 1, y + 1);
+
+                               draw_yuv420_macropixel(buf, xpos + x, ypos + y,
+                                                      b00 ? yuvcolor : YUV(), b10 ? yuvcolor : YUV(),
+                                                      b01 ? yuvcolor : YUV(), b11 ? yuvcolor : YUV());
+                       }
                }
+               break;
+       default:
+               throw std::invalid_argument("unknown pixelformat");
        }
 }