127 lines
No EOL
3.4 KiB
C++
127 lines
No EOL
3.4 KiB
C++
|
|
// g++ --std=c++11 test.cpp
|
|
|
|
#include "test.h"
|
|
|
|
#include "fl/downscale.h"
|
|
#include "fl/dbg.h"
|
|
#include "test.h"
|
|
|
|
using namespace fl;
|
|
|
|
TEST_CASE("downscale 2x2 to 1x1") {
|
|
|
|
CRGB red = CRGB(255, 0, 0);
|
|
CRGB black = CRGB(0, 0, 0);
|
|
|
|
// We are going to simulate a 4x4 image with a 2x2 image. The source
|
|
// image is square-cartesian while the dst image is square-serpentine.
|
|
CRGB src[4] = {black, red, black, red};
|
|
|
|
SUBCASE("downscaleHalf from 2x2 to 1x1") {
|
|
CRGB dst[1];
|
|
downscaleHalf(src, 2, 2, dst);
|
|
INFO("Src: " << src);
|
|
INFO("Dst: " << dst);
|
|
CHECK(dst[0].r == 128);
|
|
CHECK(dst[0].g == 0);
|
|
CHECK(dst[0].b == 0);
|
|
}
|
|
|
|
SUBCASE("downscale from 2x2 to 1x1") {
|
|
CRGB dst[1];
|
|
XYMap srcMap = XYMap::constructRectangularGrid(2, 2);
|
|
XYMap dstMap = XYMap::constructRectangularGrid(1, 1);
|
|
|
|
downscale(src, srcMap, dst, dstMap);
|
|
INFO("Src: " << src);
|
|
INFO("Dst: " << dst);
|
|
CHECK(dst[0].r == 128);
|
|
CHECK(dst[0].g == 0);
|
|
CHECK(dst[0].b == 0);
|
|
}
|
|
|
|
|
|
SUBCASE("4x4 rectangle to 2x2 serpentine") {
|
|
// We are going to simulate a 4x4 image with a 2x2 image. The source
|
|
// image is square-cartesian while the dst image is square-serpentine.
|
|
|
|
CRGB src[16] = {// Upper left red, lower right red, upper right black,
|
|
// lower left black
|
|
red, red, black, black, red, red, black, black,
|
|
black, black, red, red, black, black, red, red};
|
|
|
|
CRGB dst[4];
|
|
|
|
XYMap srcMap = XYMap::constructRectangularGrid(4, 4);
|
|
XYMap dstMap = XYMap::constructSerpentine(2, 2);
|
|
|
|
downscale(src, srcMap, dst, dstMap);
|
|
INFO("Src: " << src);
|
|
INFO("Dst: " << dst);
|
|
|
|
CRGB lowerLeft = dst[dstMap.mapToIndex(0, 0)];
|
|
CRGB lowerRight = dst[dstMap.mapToIndex(1, 0)];
|
|
CRGB upperLeft = dst[dstMap.mapToIndex(0, 1)];
|
|
CRGB upperRight = dst[dstMap.mapToIndex(1, 1)];
|
|
|
|
REQUIRE(lowerLeft == red);
|
|
REQUIRE(lowerRight == black);
|
|
REQUIRE(upperLeft == black);
|
|
REQUIRE(upperRight == red);
|
|
}
|
|
|
|
}
|
|
|
|
TEST_CASE("downscale 3x3 to 2x2") {
|
|
CRGB red = CRGB(255, 0, 0);
|
|
CRGB black = CRGB(0, 0, 0);
|
|
|
|
// Create a 3x3 checkerboard pattern:
|
|
CRGB src[9];
|
|
src[0] = red;
|
|
src[1] = black;
|
|
src[2] = red;
|
|
src[3] = black;
|
|
src[4] = red;
|
|
src[5] = black;
|
|
src[6] = red;
|
|
src[7] = black;
|
|
src[8] = red;
|
|
|
|
CRGB dst[4]; // 2x2 result
|
|
|
|
XYMap srcMap = XYMap::constructRectangularGrid(3, 3);
|
|
XYMap dstMap = XYMap::constructRectangularGrid(2, 2);
|
|
|
|
downscale(src, srcMap, dst, dstMap);
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
INFO("Dst[" << i << "]: " << dst[i]);
|
|
CHECK(dst[i] == CRGB(142, 0, 0)); // Averaged color
|
|
}
|
|
}
|
|
|
|
|
|
TEST_CASE("downscale 11x11 to 2x2") {
|
|
CRGB red = CRGB(255, 0, 0);
|
|
CRGB black = CRGB(0, 0, 0);
|
|
|
|
// Create a 3x3 checkerboard pattern:
|
|
CRGB src[11*11];
|
|
for (int i = 0; i < 11*11; ++i) {
|
|
src[i] = (i % 2 == 0) ? red : black;
|
|
}
|
|
|
|
CRGB dst[4]; // 2x2 result
|
|
|
|
XYMap srcMap = XYMap::constructRectangularGrid(11, 11);
|
|
XYMap dstMap = XYMap::constructRectangularGrid(2, 2);
|
|
|
|
downscale(src, srcMap, dst, dstMap);
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
INFO("Dst[" << i << "]: " << dst[i]);
|
|
CHECK(dst[i] == CRGB(129, 0, 0)); // Averaged color
|
|
}
|
|
} |