From 9124b05c3e3746f2103801c70944d8f0159c71f3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sun, 23 Mar 2025 16:55:59 +0100 Subject: [PATCH] unit tests wip --- CMakeLists.txt | 76 ++++++------- gunit_tests/CMakeLists.txt | 3 + gunit_tests/context.cpp | 2 +- gunit_tests/device.cpp | 2 +- gunit_tests/imageDraw.cpp | 133 +++++++++++++++++++++++ gunit_tests/matrices.cpp | 70 ++++++++++++ gunit_tests/patternDraw.cpp | 88 +++++++++++++++ gunit_tests/surface.cpp | 74 +++++++++++-- tests/data/compassion-chineese-small.gif | Bin 0 -> 920 bytes tests/data/miroir2-64.png | Bin 0 -> 12090 bytes tests/data/miroir2.png | Bin 0 -> 50769 bytes 11 files changed, 398 insertions(+), 50 deletions(-) create mode 100644 gunit_tests/imageDraw.cpp create mode 100644 gunit_tests/matrices.cpp create mode 100644 gunit_tests/patternDraw.cpp create mode 100644 tests/data/compassion-chineese-small.gif create mode 100644 tests/data/miroir2-64.png create mode 100644 tests/data/miroir2.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 9049b54..8fe84d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,9 +12,9 @@ SET(CMAKE_CXX_STANDARD 11) PROJECT(vkvg VERSION 0.3.0 DESCRIPTION "Vulkan Vector Graphic") ADD_COMPILE_DEFINITIONS( - "VKVG_VERSION_MAJOR=${vkvg_VERSION_MAJOR}" - "VKVG_VERSION_MINOR=${vkvg_VERSION_MINOR}" - "VKVG_VERSION_REVISION=${vkvg_VERSION_PATCH}" + "VKVG_VERSION_MAJOR=${vkvg_VERSION_MAJOR}" + "VKVG_VERSION_MINOR=${vkvg_VERSION_MINOR}" + "VKVG_VERSION_REVISION=${vkvg_VERSION_PATCH}" ) INCLUDE(CheckSymbolExists) @@ -233,26 +233,27 @@ IF(GLSLC AND XXD) ENDIF() IF (VKVG_USE_GLUTESS) - ADD_DEFINITIONS (-DVKVG_FILL_NZ_GLUTESS) - ADD_SUBDIRECTORY (external/glutess) + ADD_DEFINITIONS (-DVKVG_FILL_NZ_GLUTESS) + ADD_SUBDIRECTORY (external/glutess) ENDIF () FILE(GLOB VKVG_SRC src/*.c src/deps/*.c) +FILE(GLOB VKVG_HEADERS src/*.h) SET (VKVG_PUBLIC_HEADERS "include/vkvg.h;include/vkvg-svg.h") IF (VKVG_SVG) - ADD_DEFINITIONS (-DVKVG_SVG) - FILE(GLOB SVG_SRC external/vkvg-svg/src/*.c) + ADD_DEFINITIONS (-DVKVG_SVG) + FILE(GLOB SVG_SRC external/vkvg-svg/src/*.c) ELSE() - FILE(GLOB SVG_SRC src/nsvg/*.c) + FILE(GLOB SVG_SRC src/nsvg/*.c) ENDIF() LIST (APPEND VKVG_SRC ${SVG_SRC}) IF (VKVG_RECORDING) - ADD_DEFINITIONS (-DVKVG_RECORDING) - FILE(GLOB RECORDING_SRC src/recording/*.c) - LIST (APPEND VKVG_SRC ${RECORDING_SRC}) + ADD_DEFINITIONS (-DVKVG_RECORDING) + FILE(GLOB RECORDING_SRC src/recording/*.c) + LIST (APPEND VKVG_SRC ${RECORDING_SRC}) ENDIF() CONFIGURE_FILE(vkvg.pc.in vkvg.pc @ONLY) @@ -265,7 +266,8 @@ LIST(APPEND VKVG_SRC ${SHADERS} ${SHADERS_H}) SOURCE_GROUP(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${VKVG_SRC}) -ADD_LIBRARY("${PROJECT_NAME}" ${VKVG_SRC}) + +ADD_LIBRARY("${PROJECT_NAME}" ${VKVG_SRC} ${VKVG_HEADERS}) SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME} @@ -291,51 +293,51 @@ TARGET_INCLUDE_DIRECTORIES("${PROJECT_NAME}" ) IF (UNIX AND BUILD_SHARED_LIBS) - #make libm public for shared build to solve libm missing for common_test object lib linking even - #if -lm present on cc command. - TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PUBLIC m) + #make libm public for shared build to solve libm missing for common_test object lib linking even + #if -lm present on cc command. + TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PUBLIC m) ENDIF() IF(VKVG_USE_FREETYPE) - TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PUBLIC ${FREETYPE_LIBRARY}) + TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PUBLIC ${FREETYPE_LIBRARY}) ENDIF() IF(VKVG_USE_FONTCONFIG) - TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PRIVATE ${Fontconfig_LIBRARIES}) + TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PRIVATE ${Fontconfig_LIBRARIES}) ENDIF() IF(VKVG_USE_HARFBUZZ) - TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PRIVATE ${HarfBuzz_LIBRARIES}) + TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PRIVATE ${HarfBuzz_LIBRARIES}) ENDIF() IF(VKVG_USE_GLUTESS) - TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PRIVATE glutess) + TARGET_LINK_LIBRARIES("${PROJECT_NAME}" PRIVATE glutess) ENDIF() TARGET_LINK_LIBRARIES("${PROJECT_NAME}" - PUBLIC - ${Vulkan_LIBRARIES} - vkh + PUBLIC + ${Vulkan_LIBRARIES} + vkh ) IF (SHADERS_H) - ADD_DEPENDENCIES("${PROJECT_NAME}" BuildShadersHeader) + ADD_DEPENDENCIES("${PROJECT_NAME}" BuildShadersHeader) ENDIF() INSTALL(TARGETS "${PROJECT_NAME}" "${PROJECT_NAME}" - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) IF (VKVG_BUILD_TESTS) - ADD_SUBDIRECTORY(tests) + ADD_SUBDIRECTORY(tests) ELSEIF (VKVG_BUILD_OFFSCREEN_TEST) - ADD_EXECUTABLE(test_offscreen "${CMAKE_CURRENT_SOURCE_DIR}/tests/offscreen.c") - TARGET_INCLUDE_DIRECTORIES(test_offscreen PRIVATE - ${Vulkan_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ) - TARGET_LINK_LIBRARIES(test_offscreen - vkvg - ${Vulkan_LIBRARIES} - ) + ADD_EXECUTABLE(test_offscreen "${CMAKE_CURRENT_SOURCE_DIR}/tests/offscreen.c") + TARGET_INCLUDE_DIRECTORIES(test_offscreen PRIVATE + ${Vulkan_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ) + TARGET_LINK_LIBRARIES(test_offscreen + vkvg + ${Vulkan_LIBRARIES} + ) ENDIF (VKVG_BUILD_TESTS) IF (VKVG_BUILD_DOCS) diff --git a/gunit_tests/CMakeLists.txt b/gunit_tests/CMakeLists.txt index 6e45efe..bc24a21 100644 --- a/gunit_tests/CMakeLists.txt +++ b/gunit_tests/CMakeLists.txt @@ -28,6 +28,9 @@ add_executable("${PROJECT_NAME}" basicDraw.cpp drawTestBase.cpp drawTestBase.h + imageDraw.cpp + matrices.cpp + patternDraw.cpp ) target_compile_definitions("${PROJECT_NAME}" PUBLIC GTEST_PNG_ROOT="${GTEST_PNG_ROOT}" diff --git a/gunit_tests/context.cpp b/gunit_tests/context.cpp index 0c02146..ef2e185 100644 --- a/gunit_tests/context.cpp +++ b/gunit_tests/context.cpp @@ -65,7 +65,7 @@ TEST_F(ContextTest, CtxReference) { vkvg_destroy(ctx); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); - EXPECT_EQ(0, vkvg_get_reference_count(ctx)); + //EXPECT_EQ(0, vkvg_get_reference_count(ctx)); EXPECT_EQ(1, vkvg_surface_get_reference_count(surf)); EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); } diff --git a/gunit_tests/device.cpp b/gunit_tests/device.cpp index bce3fea..1365bb7 100644 --- a/gunit_tests/device.cpp +++ b/gunit_tests/device.cpp @@ -37,7 +37,7 @@ TEST(Device, Reference) { EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); vkvg_device_destroy(dev); - EXPECT_EQ(0, vkvg_device_get_reference_count(dev)); + //EXPECT_EQ(0, vkvg_device_get_reference_count(dev)); } /*TEST(Device, GetVulkanRequirements) diff --git a/gunit_tests/imageDraw.cpp b/gunit_tests/imageDraw.cpp new file mode 100644 index 0000000..3f0a93f --- /dev/null +++ b/gunit_tests/imageDraw.cpp @@ -0,0 +1,133 @@ +#include "drawTestBase.h" + +class ImageDrawTest : public DrawTestBase { + + protected: + fs::path imgPath = fs::path(GTEST_DATA_ROOT) / "miroir2.png"; + VkvgSurface imgSurf; + + void SetUp() override { + surf = vkvg_surface_create(dev, 512, 512); + imgSurf = vkvg_surface_create_from_image(dev, (char*)imgPath.c_str()); + } + void TearDown() override { + vkvg_surface_destroy(imgSurf); + DrawTestBase::TearDown(); + } +}; +TEST_F(ImageDrawTest, References) { + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_surface_status(NULL)); + EXPECT_EQ(0, vkvg_surface_get_reference_count(NULL)); + EXPECT_NO_FATAL_FAILURE(vkvg_surface_reference(NULL)); + + VkvgSurface surf2 = vkvg_surface_create_from_image(NULL, NULL); + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_surface_status(surf2)); + surf2 = vkvg_surface_create_from_image(dev, NULL); + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_surface_status(surf2)); + + uint32_t devRefCntInit = vkvg_device_get_reference_count(dev); + + surf2 = vkvg_surface_create_from_image(dev, (char*)imgPath.c_str()); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf2)); + EXPECT_EQ(1, vkvg_surface_get_reference_count(surf2)); + EXPECT_EQ(devRefCntInit + 1, vkvg_device_get_reference_count(dev)); + EXPECT_EQ(285, vkvg_surface_get_width(surf2)); + EXPECT_EQ(285, vkvg_surface_get_height(surf2)); + + vkvg_surface_reference(surf2); + EXPECT_EQ(2, vkvg_surface_get_reference_count(surf2)); + + vkvg_surface_destroy(surf2); + + EXPECT_EQ(1, vkvg_surface_get_reference_count(surf2)); + vkvg_surface_destroy(surf2); + //EXPECT_EQ(NULL, surf2); + EXPECT_EQ(devRefCntInit, vkvg_device_get_reference_count(dev)); +} + +TEST_F(ImageDrawTest, PaintImage) { + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_surface(ctx, imgSurf, 0, 0); + EXPECT_EQ(2, vkvg_surface_get_reference_count(imgSurf)); + vkvg_paint(ctx); + vkvg_destroy(ctx); + EXPECT_EQ(1, vkvg_surface_get_reference_count(imgSurf)); + + compareWithRefImage(); +} +TEST_F(ImageDrawTest, PaintImageOffset) { + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_rgb(ctx, 0.5f, 0.5f, 0.5f); + vkvg_paint(ctx); + + vkvg_set_source_surface(ctx, imgSurf, 50, 50); + vkvg_paint(ctx); + vkvg_destroy(ctx); + + compareWithRefImage(); +} +TEST_F(ImageDrawTest, PaintImageRotateOffset) { + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_rgb(ctx, 0.5f, 0.5f, 0.5f); + vkvg_paint(ctx); + + vkvg_rotate(ctx, 1.2f); + vkvg_set_source_surface(ctx, imgSurf, 100, 100); + vkvg_paint(ctx); + vkvg_destroy(ctx); + + compareWithRefImage(); +} +TEST_F(ImageDrawTest, PaintImageRotateInPlace) { + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_rgb(ctx, 0.5f, 0.5f, 0.5f); + vkvg_paint(ctx); + vkvg_matrix_t mat; + vkvg_matrix_init_translate(&mat, 142,142); + vkvg_matrix_rotate(&mat,0.1f); + vkvg_matrix_init_translate(&mat, -142,-142); + + vkvg_set_source_surface(ctx, imgSurf, 50, 50); + vkvg_set_matrix(ctx, &mat); + vkvg_paint(ctx); + vkvg_destroy(ctx); + + compareWithRefImage(); +} + +TEST_F(ImageDrawTest, PaintImageTransform) { + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_rgb(ctx, 0.5f, 0.5f, 0.5f); + vkvg_paint(ctx); + + fs::path imgPath = fs::path(GTEST_DATA_ROOT) / "miroir2-64.png"; + VkvgSurface imgSurf = vkvg_surface_create_from_image(dev, (char*)imgPath.c_str()); + + vkvg_translate(ctx, 10, 10); + vkvg_set_source_surface(ctx, imgSurf, 0, 0); + vkvg_paint(ctx); + + vkvg_identity_matrix(ctx); + vkvg_translate(ctx, 80, 0); + vkvg_scale(ctx, 2.f, 1.f); + vkvg_paint(ctx); + + vkvg_identity_matrix(ctx); + vkvg_translate(ctx, 240, 0); + vkvg_scale(ctx, 2.f, 2.f); + vkvg_paint(ctx); + + vkvg_identity_matrix(ctx); + vkvg_translate(ctx, 0, 80); + vkvg_translate(ctx, -32, -32); + vkvg_rotate(ctx, 1.2f); + vkvg_translate(ctx, 32, 32); + + vkvg_paint(ctx); + + vkvg_destroy(ctx); + + compareWithRefImage(); +} + + diff --git a/gunit_tests/matrices.cpp b/gunit_tests/matrices.cpp new file mode 100644 index 0000000..040ce61 --- /dev/null +++ b/gunit_tests/matrices.cpp @@ -0,0 +1,70 @@ +#include "vkvg.h" +#include + +#define CHECK_MAT(_xx,_yx,_xy,_yy,_x0,_y0) \ +EXPECT_FLOAT_EQ (mat.xx, _xx);EXPECT_FLOAT_EQ (mat.yx, _yx);\ +EXPECT_FLOAT_EQ (mat.xy, _xy);EXPECT_FLOAT_EQ (mat.yy, _yy);\ +EXPECT_FLOAT_EQ (mat.x0, _x0);EXPECT_FLOAT_EQ (mat.y0, _y0); + + +TEST(MatrixTest, MatixInit) { + vkvg_matrix_t mat = VKVG_IDENTITY_MATRIX; + CHECK_MAT(1,0,0,1,0,0); + + vkvg_matrix_init_identity(&mat); + CHECK_MAT(1,0,0,1,0,0); + + vkvg_matrix_init(&mat, 1.3f, 2.5f, 0.3f, 0.7f, 1.2f, 1.7f); + CHECK_MAT(1.3f, 2.5f, 0.3f, 0.7f, 1.2f, 1.7f); + + float a,b; + + vkvg_matrix_init_translate(&mat, 1.3f, 2.5f); + CHECK_MAT(1,0,0,1,1.3f,2.5f); + + vkvg_matrix_init_scale(&mat, 2.1f, 1.5f); + CHECK_MAT(2.1f,0,0,1.5f,0,0); + vkvg_matrix_get_scale(&mat, &a, &b); + EXPECT_FLOAT_EQ(a,2.1f); + EXPECT_FLOAT_EQ(b,1.5f); + + vkvg_matrix_init_rotate(&mat, 2.f); + CHECK_MAT(cosf(2.f),sinf(2.f),-sinf(2.f),cosf(2.f),0,0); +} + +TEST(MatrixTest, MatixOperation) { + vkvg_matrix_t mat = {0,0,0,0,0,0}; + //TODO + +} +TEST(MatrixTest, MatixIvert) { + vkvg_matrix_t mat = {0,0,0,0,0,0}; + vkvg_status_t res = vkvg_matrix_invert(&mat); + EXPECT_EQ(res,VKVG_STATUS_INVALID_MATRIX); + + mat = {1,1,0,0,0,0}; + res = vkvg_matrix_invert(&mat); + EXPECT_EQ(res,VKVG_STATUS_INVALID_MATRIX); + + mat = {1,0,0,1,0,0}; + res = vkvg_matrix_invert(&mat); + EXPECT_EQ(res,VKVG_STATUS_SUCCESS); + CHECK_MAT(1,0,0,1,0,0); + + vkvg_matrix_init_scale(&mat, 2.1f, 1.5f); + res = vkvg_matrix_invert(&mat); + EXPECT_EQ(res,VKVG_STATUS_SUCCESS); + CHECK_MAT(1.f/2.1f,0,0,1.f/1.5f,0,0); + + vkvg_matrix_init_translate(&mat, 2.1f, 1.5f); + res = vkvg_matrix_invert(&mat); + EXPECT_EQ(res,VKVG_STATUS_SUCCESS); + CHECK_MAT(1,0,0,1,-2.1f,-1.5f); + + vkvg_matrix_init_rotate(&mat, 2.f); + res = vkvg_matrix_invert(&mat); + EXPECT_EQ(res,VKVG_STATUS_SUCCESS); + CHECK_MAT(cosf(2.f),-sinf(2.f),sinf(2.f),cosf(2.f),0,0); + + +} diff --git a/gunit_tests/patternDraw.cpp b/gunit_tests/patternDraw.cpp new file mode 100644 index 0000000..e550340 --- /dev/null +++ b/gunit_tests/patternDraw.cpp @@ -0,0 +1,88 @@ +#include "drawTestBase.h" + +class PatternDrawTest : public DrawTestBase { + + protected: + fs::path imgPath = fs::path(GTEST_DATA_ROOT) / "miroir2.png"; + VkvgSurface imgSurf; + + void SetUp() override { + surf = vkvg_surface_create(dev, 512, 512); + imgSurf = vkvg_surface_create_from_image(dev, (char*)imgPath.c_str()); + } + void TearDown() override { + vkvg_surface_destroy(imgSurf); + DrawTestBase::TearDown(); + } +}; +TEST_F(PatternDrawTest, References) { + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_pattern_status(NULL)); + EXPECT_EQ(0, vkvg_pattern_get_reference_count(NULL)); + EXPECT_NO_FATAL_FAILURE(vkvg_pattern_reference(NULL)); + + VkvgPattern pat = vkvg_pattern_create_for_surface(NULL); + EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_pattern_status(pat)); + + pat = vkvg_pattern_create_linear(0,0,0,0); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_pattern_status(pat)); + EXPECT_EQ(1, vkvg_pattern_get_reference_count(pat)); + vkvg_pattern_reference(pat); + EXPECT_EQ(2, vkvg_pattern_get_reference_count(pat)); + + EXPECT_NO_FATAL_FAILURE(vkvg_pattern_destroy(NULL)); + vkvg_pattern_destroy(pat); + EXPECT_EQ(1, vkvg_pattern_get_reference_count(pat)); + vkvg_pattern_destroy(pat); + //EXPECT_EQ(NULL, pat); +} + +TEST_F(PatternDrawTest, PaintPattern) { + + VkvgContext ctx = vkvg_create(surf); + VkvgPattern pat = vkvg_pattern_create_for_surface(imgSurf); + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_pattern_status(pat)); + EXPECT_EQ(1, vkvg_pattern_get_reference_count(pat)); + EXPECT_EQ(2, vkvg_surface_get_reference_count(imgSurf)); + vkvg_set_source(ctx, pat); + EXPECT_EQ(2, vkvg_pattern_get_reference_count(pat)); + vkvg_paint(ctx); + vkvg_pattern_destroy(pat); + EXPECT_EQ(1, vkvg_pattern_get_reference_count(pat)); + vkvg_destroy(ctx); + + compareWithRefImage(); +} +TEST_F(PatternDrawTest, PaintPatternRepeat) { + VkvgContext ctx = vkvg_create(surf); + VkvgPattern pat = vkvg_pattern_create_for_surface(imgSurf); + vkvg_pattern_set_extend(pat, VKVG_EXTEND_REPEAT); + vkvg_set_source(ctx, pat); + vkvg_paint(ctx); + vkvg_pattern_destroy(pat); + vkvg_destroy(ctx); + + compareWithRefImage(); +} +TEST_F(PatternDrawTest, PaintPatternRepeatScaled) { + VkvgContext ctx = vkvg_create(surf); + vkvg_scale(ctx, 0.2f, 0.2f); + VkvgPattern pat = vkvg_pattern_create_for_surface(imgSurf); + vkvg_pattern_set_extend(pat, VKVG_EXTEND_REPEAT); + vkvg_set_source(ctx, pat); + vkvg_paint(ctx); + vkvg_pattern_destroy(pat); + vkvg_destroy(ctx); + + compareWithRefImage(); +} +TEST_F(PatternDrawTest, PaintPatternPad) { + VkvgContext ctx = vkvg_create(surf); + VkvgPattern pat = vkvg_pattern_create_for_surface(imgSurf); + vkvg_pattern_set_extend(pat, VKVG_EXTEND_PAD); + vkvg_set_source(ctx, pat); + vkvg_paint(ctx); + vkvg_pattern_destroy(pat); + vkvg_destroy(ctx); + + compareWithRefImage(); +} diff --git a/gunit_tests/surface.cpp b/gunit_tests/surface.cpp index f4284d7..91d3f4a 100644 --- a/gunit_tests/surface.cpp +++ b/gunit_tests/surface.cpp @@ -20,14 +20,27 @@ class SurfaceTest : public testing::Test { void SetUp() override {} void TearDown() override {} + + void checkPixels(VkvgSurface surf, uint32_t expectedPixelValue) { + uint32_t w = vkvg_surface_get_width(surf); + uint32_t h = vkvg_surface_get_height(surf); + uint32_t* buff = (uint32_t*)malloc(w * h * sizeof(uint32_t)); + vkvg_surface_write_to_memory(surf, (unsigned char*)buff); + + for (int i = 0; i < w * h; ++i) { + EXPECT_EQ(expectedPixelValue, buff[i]); + } + free(buff); + } }; TEST_F(SurfaceTest, SurfCreate) { EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_surface_status(NULL)); + EXPECT_NO_FATAL_FAILURE(vkvg_surface_destroy(NULL)); VkvgSurface surf = vkvg_surface_create(NULL, 0, 0); - EXPECT_EQ(VKVG_STATUS_DEVICE_ERROR, vkvg_surface_status(surf)); + EXPECT_NO_FATAL_FAILURE(vkvg_surface_reference(surf)); surf = vkvg_surface_create(dev, 512, 512); @@ -38,30 +51,69 @@ TEST_F(SurfaceTest, SurfCreate) { } TEST_F(SurfaceTest, SurfReference) { + EXPECT_EQ(0, vkvg_surface_get_reference_count(NULL)); + EXPECT_NO_FATAL_FAILURE(vkvg_surface_reference(NULL)); + VkvgSurface surf = vkvg_surface_create(NULL, 0, 0); EXPECT_EQ(0, vkvg_surface_get_reference_count(surf)); - vkvg_surface_reference(surf); - EXPECT_EQ(VKVG_STATUS_DEVICE_ERROR, vkvg_surface_status(surf)); + EXPECT_NO_FATAL_FAILURE(vkvg_surface_reference(surf)); + + uint32_t devRefCntInit = vkvg_device_get_reference_count(dev); surf = vkvg_surface_create(dev, 512, 512); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_device_status(dev)); EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); - EXPECT_EQ(2, vkvg_device_get_reference_count(dev)); + EXPECT_EQ(devRefCntInit + 1, vkvg_device_get_reference_count(dev)); EXPECT_EQ(1, vkvg_surface_get_reference_count(surf)); vkvg_surface_reference(surf); - - EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); EXPECT_EQ(2, vkvg_surface_get_reference_count(surf)); - EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); vkvg_surface_destroy(surf); - - EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); EXPECT_EQ(1, vkvg_surface_get_reference_count(surf)); - EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_status(surf)); vkvg_surface_destroy(surf); - EXPECT_EQ(0, vkvg_surface_get_reference_count(surf)); + EXPECT_EQ(devRefCntInit, vkvg_device_get_reference_count(dev)); + //EXPECT_EQ(0, vkvg_surface_get_reference_count(surf)); +} +TEST_F(SurfaceTest, SurfProperties) { + EXPECT_EQ(0, vkvg_surface_get_width(NULL)); + EXPECT_EQ(0, vkvg_surface_get_height(NULL)); + EXPECT_EQ(NULL, vkvg_surface_get_vk_image(NULL)); + EXPECT_EQ(VK_FORMAT_UNDEFINED, vkvg_surface_get_vk_format(NULL)); + + VkvgSurface surf = vkvg_surface_create(dev, 512, 256); + EXPECT_EQ(512, vkvg_surface_get_width(surf)); + EXPECT_EQ(256, vkvg_surface_get_height(surf)); + EXPECT_EQ(VK_FORMAT_B8G8R8A8_UNORM, vkvg_surface_get_vk_format(surf)); + EXPECT_NE(nullptr, vkvg_surface_get_vk_image(surf)); + + vkvg_surface_destroy(surf); +} +TEST_F(SurfaceTest, SurfWrite) { + EXPECT_EQ(VKVG_STATUS_INVALID_STATUS, vkvg_surface_write_to_memory(NULL, NULL)); + EXPECT_EQ(VKVG_STATUS_INVALID_STATUS, vkvg_surface_write_to_png(NULL, NULL)); + const uint32_t imgSize = 8; + VkvgSurface surf = vkvg_surface_create(dev, imgSize, imgSize); + EXPECT_EQ(VKVG_STATUS_WRITE_ERROR, vkvg_surface_write_to_memory(surf, NULL)); + EXPECT_EQ(VKVG_STATUS_WRITE_ERROR, vkvg_surface_write_to_png(surf, NULL)); + uint32_t buff[imgSize*imgSize]; + EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_surface_write_to_memory(surf, (unsigned char*)buff)); + + vkvg_surface_destroy(surf); +} + +TEST_F(SurfaceTest, SurfClear) { + const uint32_t imgSize = 8; + VkvgSurface surf = vkvg_surface_create(dev, imgSize, imgSize); + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_rgb(ctx, 1, 0, 0); + vkvg_paint(ctx); + vkvg_destroy(ctx); + + vkvg_surface_clear(surf); + + checkPixels(surf, 0x00000000); + vkvg_surface_destroy(surf); } diff --git a/tests/data/compassion-chineese-small.gif b/tests/data/compassion-chineese-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..431a6def1c9c6fd4f90e3cf0c7ab4a814613b10b GIT binary patch literal 920 zcmV;J184k4Nk%w1VL$*<0OJqqxKwhj#m0_(_1)~gM!iVGSO0(@c!yOj$yDFj_f z29tFO$)F4;9s_Gs2cUlnA^s6Va%Ew3Wn>_CX>@2HM@dak04x9i002M$QUCx1{xHZ% ztGzhu&Ab0#D2`-lo@lC41j4MawFtsN#P~zkIC)>X9ikT^Bo432VJBD+K?PbPIRP*q z&(D(PpfH#QYF2|V>RaCZVzS#SPO^}1fC3_3z4w#Z61qs0o&cHMP3oev&I{=gx476e*3=TBS3kBp1*E?Mk1l#QB zIHHvS41-ej?%`830f9Vr0E}&kL+uWNb@K{TLPkRYf)K$z`uV2o5YD;7=umofRMCb3@>t1CJ9JG+;xJ z#h|B9C1@1zCqU4litMp_a7h5Ce!9BWOu({-HFl$xh3OO0!9M{@VJujNvseJ6!Sbpg zAWXqBCrt$aI6(HFU=<5-dJC{El^B-|aS)hVgIdkZTA6^3LDN^Kb*3w!!Dc{PY(n|Dkkh{6^MSg^$u5{Qz|I@XodUJ5~^W}g6ZOo9toT1hh(3Ir@*AO#?e zqX9&bu+Se2Qk}5}24CzzQdMv;(M>*)!8F@wKFSkhL2 zG|4o;;%=Q3uz&&pB%me$&OC4tnHqSqBb;>BY3H3BDA3$)Gh_hG%E<>P^-$Yq uKeK{hC?C_}87(#8-sz@>ffDp+TjkOjn+xAe(5|@j)@$#*_~r{k1OPk1Kx`oZ literal 0 HcmV?d00001 diff --git a/tests/data/miroir2-64.png b/tests/data/miroir2-64.png new file mode 100644 index 0000000000000000000000000000000000000000..8e32479d6bf4c2568a16c5f6c2bb4f8340aede03 GIT binary patch literal 12090 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 O2T|5mDpz>w|9=2*G6+Th literal 0 HcmV?d00001 diff --git a/tests/data/miroir2.png b/tests/data/miroir2.png new file mode 100644 index 0000000000000000000000000000000000000000..67ca2093184f90048e2c2c6d0f69b65761029d82 GIT binary patch literal 50769 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

rghI_sXSx|B>lu_^+e7~dD*10HSs--v|t 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