From 47e808023f98f74673906ef7de34e774cd26f52b Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Tue, 16 Oct 2018 11:35:44 +0300 Subject: Add AR12 & AR15 support Signed-off-by: Tomi Valkeinen --- kms++/inc/kms++/pixelformats.h | 3 +++ kms++/src/pixelformats.cpp | 3 +++ kms++util/inc/kms++util/color.h | 2 ++ kms++util/src/color.cpp | 10 ++++++++++ kms++util/src/drawing.cpp | 16 ++++++++++++++++ kms++util/src/testpat.cpp | 2 ++ 6 files changed, 36 insertions(+) diff --git a/kms++/inc/kms++/pixelformats.h b/kms++/inc/kms++/pixelformats.h index 6392de1..1e273ef 100644 --- a/kms++/inc/kms++/pixelformats.h +++ b/kms++/inc/kms++/pixelformats.h @@ -32,6 +32,9 @@ enum class PixelFormat : uint32_t RGB565 = MakeFourCC("RG16"), BGR565 = MakeFourCC("BG16"), + + ARGB4444 = MakeFourCC("AR12"), + ARGB1555 = MakeFourCC("AR15"), }; static inline PixelFormat FourCCToPixelFormat(const std::string& fourcc) diff --git a/kms++/src/pixelformats.cpp b/kms++/src/pixelformats.cpp index 84ea924..819853b 100644 --- a/kms++/src/pixelformats.cpp +++ b/kms++/src/pixelformats.cpp @@ -26,6 +26,9 @@ static const map format_info_array = { { PixelFormat::XBGR8888, { 1, { { 32, 1, 1 } }, } }, { PixelFormat::ARGB8888, { 1, { { 32, 1, 1 } }, } }, { PixelFormat::ABGR8888, { 1, { { 32, 1, 1 } }, } }, + + { PixelFormat::ARGB4444, { 1, { { 16, 1, 1 } }, } }, + { PixelFormat::ARGB1555, { 1, { { 16, 1, 1 } }, } }, }; const struct PixelFormatInfo& get_pixel_format_info(PixelFormat format) diff --git a/kms++util/inc/kms++util/color.h b/kms++util/inc/kms++util/color.h index f378433..21eae66 100644 --- a/kms++util/inc/kms++util/color.h +++ b/kms++util/inc/kms++util/color.h @@ -27,6 +27,8 @@ struct RGB uint32_t abgr8888() const; uint16_t rgb565() const; uint16_t bgr565() const; + uint16_t argb4444() const; + uint16_t argb1555() const; YUV yuv(YUVType type = YUVType::BT601_Lim) const; uint8_t b; diff --git a/kms++util/src/color.cpp b/kms++util/src/color.cpp index 2e6f217..2a41502 100644 --- a/kms++util/src/color.cpp +++ b/kms++util/src/color.cpp @@ -59,6 +59,16 @@ uint16_t RGB::bgr565() const return ((b >> 3) << 11) | ((g >> 2) << 5) | ((r >> 3) << 0); } +uint16_t RGB::argb4444() const +{ + return ((a >> 4) << 12) | ((r >> 4) << 8) | ((g >> 4) << 4) | ((b >> 4) << 0); +} + +uint16_t RGB::argb1555() const +{ + return ((!!a) << 15) | ((r >> 3) << 10) | ((g >> 3) << 5) | ((b >> 3) << 0); +} + YUV RGB::yuv(YUVType type) const { return YUV(*this, type); diff --git a/kms++util/src/drawing.cpp b/kms++util/src/drawing.cpp index 8885112..9da7a77 100644 --- a/kms++util/src/drawing.cpp +++ b/kms++util/src/drawing.cpp @@ -56,6 +56,18 @@ void draw_rgb_pixel(IFramebuffer& buf, unsigned x, unsigned y, RGB color) *p = color.bgr565(); break; } + case PixelFormat::ARGB4444: + { + uint16_t *p = (uint16_t*)(buf.map(0) + buf.stride(0) * y + x * 2); + *p = color.argb4444(); + break; + } + case PixelFormat::ARGB1555: + { + uint16_t *p = (uint16_t*)(buf.map(0) + buf.stride(0) * y + x * 2); + *p = color.argb1555(); + break; + } default: throw std::invalid_argument("invalid pixelformat"); } @@ -168,6 +180,8 @@ void draw_rect(IFramebuffer &fb, uint32_t x, uint32_t y, uint32_t w, uint32_t h, case PixelFormat::BGR888: case PixelFormat::RGB565: case PixelFormat::BGR565: + case PixelFormat::ARGB4444: + case PixelFormat::ARGB1555: for (j = 0; j < h; j++) { for (i = 0; i < w; i++) { draw_rgb_pixel(fb, x + i, y + j, color); @@ -240,6 +254,8 @@ static void draw_char(IFramebuffer& buf, uint32_t xpos, uint32_t ypos, char c, R case PixelFormat::BGR888: case PixelFormat::RGB565: case PixelFormat::BGR565: + case PixelFormat::ARGB4444: + case PixelFormat::ARGB1555: for (y = 0; y < 8; y++) { for (x = 0; x < 8; x++) { bool b = get_char_pixel(c, x, y); diff --git a/kms++util/src/testpat.cpp b/kms++util/src/testpat.cpp index 8795cc6..ab197dc 100644 --- a/kms++util/src/testpat.cpp +++ b/kms++util/src/testpat.cpp @@ -114,6 +114,8 @@ static void draw_test_pattern_part(IFramebuffer& fb, unsigned start_y, unsigned case PixelFormat::BGR888: case PixelFormat::RGB565: case PixelFormat::BGR565: + case PixelFormat::ARGB4444: + case PixelFormat::ARGB1555: for (y = start_y; y < end_y; y++) { for (x = 0; x < w; x++) { RGB pixel = get_test_pattern_pixel(fb, x, y); -- cgit v1.2.3