From bb6008c995873b1cbd89f1f5a547b41b0015ae9f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Thu, 21 Mar 2019 11:16:49 +0100 Subject: [PATCH] get/set device dpy, premult alpha optional --- CMakeLists.txt | 43 ++- CMakeLists.txt.user.4.8-pre1 | 667 ----------------------------------- include/vkvg.h | 2 + src/vkvg_device.c | 26 +- src/vkvg_device_internal.c | 11 +- src/vkvg_pattern.c | 12 +- tests/common/vkengine.h | 2 - tests/compositing.c | 24 ++ 8 files changed, 100 insertions(+), 687 deletions(-) delete mode 100644 CMakeLists.txt.user.4.8-pre1 create mode 100644 tests/compositing.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 314b8f2..f66dcb0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,10 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.9) PROJECT(vkvg VERSION 0.1.0 DESCRIPTION "Vulkan Vector Graphic") +INCLUDE(CheckSymbolExists) +INCLUDE(CheckIncludeFile) +INCLUDE(GNUInstallDirs) + SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") SET(CMAKE_CXX_FLAGS "-W -Wall -Wno-extra") SET(CMAKE_EXE_LINKER_FLAGS "-lm") @@ -19,16 +23,16 @@ ELSE() UNSET(ENABLE_WIRED_FILL CACHE) ENDIF() +OPTION(VKVG_PREMULT_ALPHA "use premultiplied alpha for internal rendering" ON) +IF (VKVG_PREMULT_ALPHA) + ADD_DEFINITIONS (-DVKVG_PREMULT_ALPHA) +ENDIF () + OPTION(VKVG_TILING_OPTIMAL "use VK_IMAGE_TILING_OPTIMAL for surface backend texture" OFF) IF (VKVG_TILING_OPTIMAL) ADD_DEFINITIONS (-DVKVG_TILING_OPTIMAL) ENDIF () -OPTION(VKVG_LCD_FONT_FILTER "enable freetype lcd font filtering" ON) -IF (VKVG_LCD_FONT_FILTER) - ADD_DEFINITIONS (-DVKVG_LCD_FONT_FILTER) -ENDIF () - OPTION(VKVG_BUILD_TESTS "build tests with glfw" ON) set(VULKAN_SDK "$ENV{VULKAN_SDK}" CACHE STRING "LunarG Vulkan SDK path") @@ -57,7 +61,14 @@ FIND_PACKAGE(Freetype REQUIRED) FIND_PACKAGE(FontConfig REQUIRED) FIND_PACKAGE(HarfBuzz REQUIRED) -INCLUDE(GNUInstallDirs) +#Freetype lcd font filtering +#CHECK_SYMBOL_EXISTS (FT_CONFIG_OPTION_SUBPIXEL_RENDERING "${FREETYPE_INCLUDE_DIR_freetype2}/freetype/config/ftoption.h" FT_HAS_SUBPIXEL_RENDERING) +#IF (FT_HAS_SUBPIXEL_RENDERING) + OPTION(VKVG_LCD_FONT_FILTER "enable freetype lcd font filtering" ON) + IF (VKVG_LCD_FONT_FILTER) + ADD_DEFINITIONS (-DVKVG_LCD_FONT_FILTER) + ENDIF () +#ENDIF() # Find glslc shader compiler. # On Android, the NDK includes the binary, so no external dependency. @@ -150,8 +161,8 @@ INSTALL(TARGETS vkvg PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) FUNCTION (buildtest TEST_NAME) - ADD_EXECUTABLE(${PROJECT_NAME}_${TEST_NAME} "tests/${TEST_NAME}.c" ) - TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}_${TEST_NAME} PRIVATE + ADD_EXECUTABLE(test_${TEST_NAME} "tests/${TEST_NAME}.c" ) + TARGET_INCLUDE_DIRECTORIES(test_${TEST_NAME} PRIVATE ${Vulkan_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src @@ -159,11 +170,7 @@ FUNCTION (buildtest TEST_NAME) ${CMAKE_CURRENT_SOURCE_DIR}/vkh/include ${CMAKE_CURRENT_SOURCE_DIR}/vkh/src ) - TARGET_LINK_LIBRARIES(${PROJECT_NAME}_${TEST_NAME} - #${Vulkan_LIBRARIES} - #${GLFW3_LIBRARIES} - #vkh_static - #vkvg + TARGET_LINK_LIBRARIES(test_${TEST_NAME} tests_common ) ENDFUNCTION (buildtest) @@ -216,10 +223,20 @@ IF (ENABLE_VALIDATION) ELSE () MESSAGE(STATUS "Validation\t\t= disabled.") ENDIF () +IF (VKVG_PREMULT_ALPHA) +MESSAGE(STATUS "Premult Alpha\t= enabled.") +ELSE () +MESSAGE(STATUS "Premult Alpha\t= disabled.") +ENDIF () IF (VKVG_TILING_OPTIMAL) MESSAGE(STATUS "Surface tiling\t= VK_IMAGE_TILING_OPTIMAL.") ELSE () MESSAGE(STATUS "Surface tiling\t= VK_IMAGE_TILING_LINEAR.") ENDIF () +IF (VKVG_LCD_FONT_FILTER) +MESSAGE(STATUS "Font filtering\t= LCD.") +ELSE () +MESSAGE(STATUS "Font filtering\t= Grayscale.") +ENDIF () MESSAGE(STATUS "---------------------------------------------------------------------------\n\n") diff --git a/CMakeLists.txt.user.4.8-pre1 b/CMakeLists.txt.user.4.8-pre1 deleted file mode 100644 index f37959b..0000000 --- a/CMakeLists.txt.user.4.8-pre1 +++ /dev/null @@ -1,667 +0,0 @@ - - - - - - EnvironmentId - {961cb273-e1a2-4675-b40c-c0bceac9bf63} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 1 - true - true - 0 - 8 - true - 1 - true - true - true - true - - - - ProjectExplorer.Project.PluginSettings - - - true - - - - ProjectExplorer.Project.Target.0 - - Imported Kit - Imported Kit - {f19ccac4-98ac-4fd0-a51d-b683584e99fb} - 0 - 0 - 4 - - - CMAKE_BUILD_TYPE:STRING=Release - CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ - CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc - CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX} - ENABLE_VALIDATION:BOOL=OFF - QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable} - VKVG_TILING_OPTIMAL:BOOL=OFF - - /mnt/devel/gts/vkvg/build - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - 0 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Compilation - Compilation - CMakeProjectManager.CMakeBuildConfiguration - - 1 - - - 0 - Déploiement - - ProjectExplorer.BuildSteps.Deploy - - 1 - Configuration de déploiement - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - - 2 - - vkvg_test - - CMakeProjectManager.CMakeRunConfiguration.vkvg_test - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - - 2 - - vkvg_test1 - - CMakeProjectManager.CMakeRunConfiguration.vkvg_test1 - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - - 2 - - vkvg_test_curves - - CMakeProjectManager.CMakeRunConfiguration.vkvg_test_curves - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - - 2 - - vkvg_perf_test_0 - - CMakeProjectManager.CMakeRunConfiguration.vkvg_perf_test_0 - 3768 - false - true - false - false - true - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - /mnt/devel/gts/vkvg/build - 2 - - vkvg_test - vkvg_test2 - CMakeProjectManager.CMakeRunConfiguration.vkvg_test -/mnt/devel/gts/vkvg/ - 3768 - false - true - false - false - true - - 5 - - - - ProjectExplorer.Project.Target.1 - - Desktop - Desktop - {81275d56-2237-4c29-a364-8221c7c7c53e} - 0 - 0 - 0 - - - /mnt/devel/gts/build-vkvg-Desktop-Du00e9faut - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - 0 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Défaut - Défaut - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=Debug - - /mnt/devel/gts/build-vkvg-Desktop-Debug - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - 0 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Debug - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=Release - - /mnt/devel/gts/build-vkvg-Desktop-Release - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - 0 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - Release - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=RelWithDebInfo - - /mnt/devel/gts/build-vkvg-Desktop-Release with Debug Information - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - 0 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release with Debug Information - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - - - CMAKE_BUILD_TYPE:STRING=MinSizeRel - - /mnt/devel/gts/build-vkvg-Desktop-Minimum Size Release - - - - - all - - true - CMake Build - - CMakeProjectManager.MakeStep - - 1 - Build - - ProjectExplorer.BuildSteps.Build - - - 0 - Clean - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Minimum Size Release - Minimum Size Release - CMakeProjectManager.CMakeBuildConfiguration - - 5 - - - 0 - Déploiement - - ProjectExplorer.BuildSteps.Deploy - - 1 - Configuration de déploiement - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - false - false - 1000 - - true - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - - - - 2 - - vkvg_test - - CMakeProjectManager.CMakeRunConfiguration.vkvg_test - 3768 - false - true - false - false - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 2 - - - ProjectExplorer.Project.Updater.FileVersion - 18 - - - Version - 18 - - diff --git a/include/vkvg.h b/include/vkvg.h index 108461e..d4a47c7 100644 --- a/include/vkvg.h +++ b/include/vkvg.h @@ -165,6 +165,8 @@ VkvgDevice vkvg_device_create_multisample (VkInstance inst, VkPhysicalDevice p void vkvg_device_destroy (VkvgDevice dev); VkvgDevice vkvg_device_reference (VkvgDevice dev); uint32_t vkvg_device_get_reference_count (VkvgDevice dev); +void vkvg_device_set_dpy (VkvgDevice dev, int hdpy, int vdpy); +void vkvg_device_get_dpy (VkvgDevice dev, int* hdpy, int* vdpy); VkvgSurface vkvg_surface_create (VkvgDevice dev, uint32_t width, uint32_t height); VkvgSurface vkvg_surface_create_from_image (VkvgDevice dev, const char* filePath); diff --git a/src/vkvg_device.c b/src/vkvg_device.c index 1ea7e79..3d22fbf 100644 --- a/src/vkvg_device.c +++ b/src/vkvg_device.c @@ -57,8 +57,8 @@ VkvgDevice vkvg_device_create_multisample(VkInstance inst, VkPhysicalDevice phy, VkvgDevice dev = (vkvg_device*)malloc(sizeof(vkvg_device)); dev->instance = inst; - dev->hdpi = 72; - dev->vdpi = 72; + dev->hdpi = 96; + dev->vdpi = 96; dev->samples= samples; dev->deferredResolve = deferredResolve; dev->vkDev = vkdev; @@ -154,3 +154,25 @@ VkvgDevice vkvg_device_reference (VkvgDevice dev) { uint32_t vkvg_device_get_reference_count (VkvgDevice dev) { return dev->references; } +/** + * @brief set horizontal and vertical resolution of device in dot per inch + * @param vkvg device pointer + * @param horizontal device resolution in dot per inch + * @param vertical device resolution in dot per inch + */ +void vkvg_device_set_dpy (VkvgDevice dev, int hdpy, int vdpy) { + dev->hdpi = hdpy; + dev->vdpi = vdpy; + + //TODO: reset font cache +} +/** + * @brief get horizontal and vertical resolution of device in dot per inch + * @param vkvg device pointer + * @param return horizontal device resolution in dot per inch + * @param return vertical device resolution in dot per inch + */ +void vkvg_device_get_dpy (VkvgDevice dev, int* hdpy, int* vdpy) { + *hdpy = dev->hdpi; + *vdpy = dev->vdpi; +} diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index 42e1c88..0ccdbba 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -182,12 +182,21 @@ void _setupPipelines(VkvgDevice dev) VkPipelineColorBlendAttachmentState blendAttachmentState = { .colorWriteMask = 0x0, .blendEnable = VK_TRUE, +#ifdef VKVG_PREMULT_ALPHA .srcColorBlendFactor = VK_BLEND_FACTOR_ONE, + .dstColorBlendFactor= VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + .colorBlendOp = VK_BLEND_OP_ADD, .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, + .dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO, + .alphaBlendOp = VK_BLEND_OP_ADD, +#else + .srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA, .dstColorBlendFactor= VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, - .dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, .colorBlendOp = VK_BLEND_OP_ADD, + .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, + .dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO, .alphaBlendOp = VK_BLEND_OP_ADD, +#endif }; VkPipelineColorBlendStateCreateInfo colorBlendState = { .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, diff --git a/src/vkvg_pattern.c b/src/vkvg_pattern.c index ba74bf5..a7126d1 100644 --- a/src/vkvg_pattern.c +++ b/src/vkvg_pattern.c @@ -40,11 +40,19 @@ VkvgPattern vkvg_pattern_create_rgba (float r, float g, float b, float a){ pat->type = VKVG_PATTERN_TYPE_SOLID; pat->extend = VKVG_EXTEND_NONE; vkvg_color_t* c = (vkvg_color_t*)calloc(1,sizeof(vkvg_color_t)); - //premultiplied alpha + +#ifdef VKVG_PREMULT_ALPHA c->r = r * a; c->g = g * a; c->b = b * a; - c->a = a;// > 0.f ? 1.f : 0.f; + c->a = a; +#else + c->r = r; + c->g = g; + c->b = b; + c->a = a; +#endif + pat->data = c; pat->references = 1; diff --git a/tests/common/vkengine.h b/tests/common/vkengine.h index b4505f8..3f80c5e 100644 --- a/tests/common/vkengine.h +++ b/tests/common/vkengine.h @@ -32,8 +32,6 @@ #include "vkh.h" -/* Number of samples needs to be the same at image creation, */ -/* renderpass creation and pipeline creation. */ #define FENCE_TIMEOUT 100000000 typedef struct _vk_engine_t* VkEngine; diff --git a/tests/compositing.c b/tests/compositing.c new file mode 100644 index 0000000..56e3d45 --- /dev/null +++ b/tests/compositing.c @@ -0,0 +1,24 @@ +#include "test.h" + +void test(){ + vkvg_surface_clear(surf); + + VkvgContext ctx = vkvg_create(surf); + + vkvg_set_source_rgba(ctx, 1,0,0,0.5); + vkvg_rectangle(ctx,100,100,200,200); + vkvg_fill(ctx); + + vkvg_set_source_rgba(ctx, 0,0,1,0.5); + vkvg_rectangle(ctx,200,200,200,200); + vkvg_fill(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 600, 800); + + return 0; +} -- 2.47.3