1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#include "drawTestBase.h"
/*#define STBI_ASSERT(x) ((void)0)
#define STBIW_ASSERT(x) ((void)0)
*/
#define STB_IMAGE_IMPLEMENTATION
#define STBIDEF static inline
#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION
#define STB_IMAGE_WRITE_STATIC
#define STBIWDEF static inline
#include "stb_image_write.h"
DrawTestBase::DrawTestBase() {
targetDir = fs::path(GTEST_PNG_ROOT) / ::testing::UnitTest::GetInstance()->current_test_suite()->name();
if (!fs::is_directory(targetDir) || !fs::exists(targetDir))
fs::create_directories(targetDir);
diffDir = fs::path("DiffImages") / ::testing::UnitTest::GetInstance()->current_test_suite()->name();
if (!fs::is_directory(diffDir) || !fs::exists(diffDir))
fs::create_directories(diffDir);
vkvg_device_create_info_t info{};
fs::path fontDir = fs::path(GTEST_DATA_ROOT) / fs::path("fonts");
info.fontsDirectories = fontDir.string().c_str();
dev = vkvg_device_create(&info);
}
DrawTestBase::~DrawTestBase() { vkvg_device_destroy(dev); }
void DrawTestBase::SetUp() { surf = vkvg_surface_create(dev, 256, 256); }
void DrawTestBase::TearDown() { vkvg_surface_destroy(surf); }
void DrawTestBase::compareWithRefImage() {
fs::path targetPath = targetDir / ::testing::UnitTest::GetInstance()->current_test_info()->name();
targetPath.replace_extension(".png");
if (fs::exists(targetPath)) {
int w = 0, h = 0, channels = 0;
unsigned char* refImg =
stbi_load((char*)targetPath.c_str(), &w, &h, &channels, 4); // force 4 components per pixel
EXPECT_TRUE(refImg != nullptr) << "Could not load image from " << targetPath << stbi_failure_reason();
EXPECT_EQ(vkvg_surface_get_width(surf), w);
EXPECT_EQ(vkvg_surface_get_height(surf), h);
unsigned char* img = (unsigned char*)malloc(w * h * 4);
unsigned char* diffImg = (unsigned char*)malloc(w * h * 4);
vkvg_status_t result = vkvg_surface_write_to_memory(surf, img);
EXPECT_EQ(result, VKVG_STATUS_SUCCESS);
uint32_t totDiff = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
unsigned char* refPix = refImg + (y * w + x) * 4;
unsigned char* pix = img + (y * w + x) * 4;
unsigned char* diffPix = diffImg + (y * w + x) * 4;
if (*refPix < *pix)
*diffPix = *pix - *refPix;
else if (*refPix > *pix)
*diffPix = *refPix - *pix;
else
*diffPix = 0;
totDiff += (uint32_t)*diffPix;
}
}
EXPECT_EQ(totDiff, 0);
if (totDiff > 0) {
fs::path diffPath = diffDir / ::testing::UnitTest::GetInstance()->current_test_info()->name();
diffPath.replace_extension(".png");
stbi_write_png((char*)diffPath.c_str(), (int32_t)w, (int32_t)h, 4, diffImg, (int32_t)(4 * w));
}
free(img);
free(diffImg);
} else {
vkvg_status_t result = vkvg_surface_write_to_png(surf, (char*)targetPath.c_str());
EXPECT_EQ(result, VKVG_STATUS_SUCCESS);
GTEST_SKIP() << "Updating reference image: " << targetPath;
}
}
|