notcurses/tests/blit.cpp
nick black fb0beb19b6
ncblit_bgrx() improvements #1105
Add unit tests for ncblit_bgrx. Rewrite bgra_to_rgba() using
ncpixel_*() funtionality. Rewrite ncblit_bgrx() using
ncblit_rgba().
2020-11-11 00:58:42 -05:00

90 lines
2.4 KiB
C++

#include "main.h"
#include <vector>
TEST_CASE("Blitting") {
auto nc_ = testing_notcurses();
REQUIRE(nullptr != nc_);
ncplane* ncp_ = notcurses_stdplane(nc_);
REQUIRE(ncp_);
auto n_ = notcurses_stdplane(nc_);
REQUIRE(n_);
SUBCASE("BgraToRgba") {
const uint32_t data[8] = {
0xffffffff, 0xff0088ff, 0xffff8800, 0xff88ff00,
0xffff0088, 0xff8800ff, 0Xff00ff88, 0xff000000,
};
auto ncp = ncplane_new(n_, 2, 4, 0, 0, nullptr, nullptr);
REQUIRE(nullptr != ncp);
struct ncvisual_options vopts = {
.n = ncp,
.scaling = NCSCALE_NONE,
.y = 0,
.x = 0,
.begy = 0,
.begx = 0,
.leny = 2,
.lenx = 4,
.blitter = NCBLIT_1x1,
.flags = 0,
};
ncblit_bgrx(data, 16, &vopts);
for(int y = 0 ; y < 2 ; ++y){
for(int x = 0 ; x < 4 ; ++x){
uint32_t bgra = data[(y * 4) + x];
uint16_t stylemask;
uint64_t channels;
auto egc = ncplane_at_yx(ncp, y, x, &stylemask, &channels);
CHECK(0 == strcmp(" ", egc));
free(egc);
CHECK(0 == stylemask);
uint32_t rgb = channels_bg_rgb(channels);
CHECK(ncpixel_r(bgra) == ncpixel_r(rgb));
CHECK(ncpixel_g(bgra) == ncpixel_g(rgb));
CHECK(ncpixel_b(bgra) == ncpixel_b(rgb));
}
}
ncplane_destroy(ncp);
}
SUBCASE("BgraToRgbaWithStride") {
const uint32_t data[10] = {
0xffffffff, 0xff0088ff, 0xffff8800, 0xff88ff00, 0x00000000,
0xffff0088, 0xff8800ff, 0xff00ff88, 0xff000000, 0x00000000,
};
auto ncp = ncplane_new(n_, 2, 4, 0, 0, nullptr, nullptr);
REQUIRE(nullptr != ncp);
struct ncvisual_options vopts = {
.n = ncp,
.scaling = NCSCALE_NONE,
.y = 0,
.x = 0,
.begy = 0,
.begx = 0,
.leny = 2,
.lenx = 4,
.blitter = NCBLIT_1x1,
.flags = 0,
};
ncblit_bgrx(data, 20, &vopts);
for(int y = 0 ; y < 2 ; ++y){
for(int x = 0 ; x < 4 ; ++x){
uint32_t bgra = data[(y * 5) + x];
uint16_t stylemask;
uint64_t channels;
auto egc = ncplane_at_yx(ncp, y, x, &stylemask, &channels);
CHECK(0 == strcmp(" ", egc));
free(egc);
CHECK(0 == stylemask);
uint32_t rgb = channels_bg_rgb(channels);
CHECK(ncpixel_r(bgra) == ncpixel_r(rgb));
CHECK(ncpixel_g(bgra) == ncpixel_g(rgb));
CHECK(ncpixel_b(bgra) == ncpixel_b(rgb));
}
}
ncplane_destroy(ncp);
}
CHECK(!notcurses_stop(nc_));
}