From 59bf168e55d1a8d2be79f0c73ea0f324e385dfe5 Mon Sep 17 00:00:00 2001 From: nick black Date: Sun, 14 Jun 2020 05:11:11 -0400 Subject: [PATCH] =?UTF-8?q?quadblitter:=20emit=20=E2=96=8C,=20not=20?= =?UTF-8?q?=E2=96=8B,=20you=20fool=20#667?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/blit.c | 2 +- tests/visual.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/lib/blit.c b/src/lib/blit.c index 9acb502a9..4423f1d34 100644 --- a/src/lib/blit.c +++ b/src/lib/blit.c @@ -183,7 +183,7 @@ static const struct qdriver { const char* oth1egc; // EGC upon absorbing others[1] } quadrant_drivers[6] = { { .pair = { 0, 1 }, .others = { 2, 3 }, .egc = "▀", .oth0egc = "▛", .oth1egc = "▜", }, - { .pair = { 0, 2 }, .others = { 1, 3 }, .egc = "▋", .oth0egc = "▛", .oth1egc = "▙", }, + { .pair = { 0, 2 }, .others = { 1, 3 }, .egc = "▌", .oth0egc = "▛", .oth1egc = "▙", }, { .pair = { 0, 3 }, .others = { 1, 2 }, .egc = "▚", .oth0egc = "▜", .oth1egc = "▙", }, { .pair = { 1, 2 }, .others = { 0, 3 }, .egc = "▞", .oth0egc = "▛", .oth1egc = "▟", }, { .pair = { 1, 3 }, .others = { 0, 2 }, .egc = "▐", .oth0egc = "▜", .oth1egc = "▟", }, diff --git a/tests/visual.cpp b/tests/visual.cpp index 4ae94bcd6..5c0779c83 100644 --- a/tests/visual.cpp +++ b/tests/visual.cpp @@ -241,5 +241,77 @@ TEST_CASE("Visual") { delete[] rgba; } + // close-in verification of each quadblitter output EGC + SUBCASE("QuadblitterEGCs") { + // there are 16 configurations, each mapping four (2x2) pixels + int DIMX = 32; + int DIMY = 2; + auto rgba = new uint32_t[DIMY * DIMX]; + memset(rgba, 0, sizeof(*rgba) * DIMY * DIMX); + // the top has 4 configurations of 4 each, each being 2 columns + for(int top = 0 ; top < 4 ; ++top){ + for(int idx = 0 ; idx < 4 ; ++idx){ + const int itop = (top * 4 + idx) * 2; // index of first column + CHECK(0 == ncpixel_set_a(&rgba[itop], 0xff)); + CHECK(0 == ncpixel_set_a(&rgba[itop + 1], 0xff)); + if(top == 1 || top == 3){ + CHECK(0 == ncpixel_set_r(&rgba[itop], 0xff)); + } + if(top == 2 || top == 3){ + CHECK(0 == ncpixel_set_r(&rgba[itop + 1], 0xff)); + } + } + } + for(int bot = 0 ; bot < 4 ; ++bot){ + for(int idx = 0 ; idx < 4 ; ++idx){ + const int ibot = (bot * 4 + idx) * 2 + DIMX; + CHECK(0 == ncpixel_set_a(&rgba[ibot], 0xff)); + CHECK(0 == ncpixel_set_a(&rgba[ibot + 1], 0xff)); + if(idx == 1 || idx == 3){ + CHECK(0 == ncpixel_set_r(&rgba[ibot], 0xff)); + } + if(idx == 2 || idx == 3){ + CHECK(0 == ncpixel_set_r(&rgba[ibot + 1], 0xff)); + } + } + } + auto ncv = ncvisual_from_rgba(rgba, DIMY, DIMX * sizeof(uint32_t), DIMX); + REQUIRE(nullptr != ncv); + struct ncvisual_options vopts{}; + vopts.n = n_; + vopts.blitter = NCBLIT_2x2; + vopts.flags = NCVISUAL_OPTION_NODEGRADE; + CHECK(n_ == ncvisual_render(nc_, ncv, &vopts)); + CHECK(0 == notcurses_render(nc_)); + for(int y = 0 ; y < DIMY / 2 ; ++y){ + for(int x = 0 ; x < DIMX / 2 ; ++x){ + uint32_t attrword; + uint64_t channels; + char* egc = notcurses_at_yx(nc_, y, x, &attrword, &channels); + REQUIRE(nullptr != egc); +/* FIXME need to match + [▀] 00000000 00000000 + [▜] 00000000 00ff0000 + [▛] 00000000 00ff0000 + [▀] 00000000 00ff0000 + [▟] 00000000 00ff0000 + [▋] 00ff0000 00000000 + [▚] 00ff0000 00000000 + [▙] 00ff0000 00000000 + [▙] 00000000 00ff0000 + [▚] 00000000 00ff0000 + [▋] 00000000 00ff0000 + [▟] 00ff0000 00000000 + [▀] 00ff0000 00000000 + [▛] 00ff0000 00000000 + [▜] 00ff0000 00000000 + [▀] 00ff0000 00ff0000 + */ + free(egc); + } + } + delete[] rgba; + } + CHECK(!notcurses_stop(nc_)); }