From f0897c4946a1263bddde6cd8abe04bc5a291577d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Tue, 19 Mar 2019 19:42:25 +0100 Subject: [PATCH] split tests in several exe --- CMakeLists.txt | 49 +- tests/clip.c | 27 + tests/colinear.c | 25 + {include => tests/common}/nanosvg.h | 0 tests/common/test.c | 117 ++++ tests/common/test.h | 77 +++ tests/{ => common}/vkengine.c | 0 tests/{ => common}/vkengine.h | 0 tests/curve.c | 38 ++ tests/curve2.c | 27 + tests/data/miroir.jpg | Bin 0 -> 24740 bytes tests/data/tiger.svg | 725 ++++++++++++++++++++++ tests/fill.c | 29 + tests/fill_and_stroke.c | 31 + tests/gradient.c | 25 + tests/gradient_transform.c | 30 + tests/img_surf.c | 34 + tests/line_caps.c | 57 ++ tests/line_join.c | 74 +++ tests/multi.c | 14 + tests/painting.c | 40 ++ tests/random_rects.c | 33 + tests/rect_fill.c | 23 + tests/simple_paint.c | 15 + tests/stroke.c | 52 ++ tests/svg.c | 103 +++ tests/test1.c | 929 +--------------------------- tests/text.c | 96 +++ 28 files changed, 1739 insertions(+), 931 deletions(-) create mode 100644 tests/clip.c create mode 100644 tests/colinear.c rename {include => tests/common}/nanosvg.h (100%) create mode 100644 tests/common/test.c create mode 100644 tests/common/test.h rename tests/{ => common}/vkengine.c (100%) rename tests/{ => common}/vkengine.h (100%) create mode 100644 tests/curve.c create mode 100644 tests/curve2.c create mode 100755 tests/data/miroir.jpg create mode 100644 tests/data/tiger.svg create mode 100644 tests/fill.c create mode 100644 tests/fill_and_stroke.c create mode 100644 tests/gradient.c create mode 100644 tests/gradient_transform.c create mode 100644 tests/img_surf.c create mode 100644 tests/line_caps.c create mode 100644 tests/line_join.c create mode 100644 tests/multi.c create mode 100644 tests/painting.c create mode 100644 tests/random_rects.c create mode 100644 tests/rect_fill.c create mode 100644 tests/simple_paint.c create mode 100644 tests/stroke.c create mode 100644 tests/svg.c create mode 100644 tests/text.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e5e45c..fbea596 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,22 +145,62 @@ INSTALL(TARGETS vkvg LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 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 + ${Vulkan_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/tests/common + ${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 + tests_common + ) +ENDFUNCTION (buildtest) + if (GLFW3_FOUND) - #build test app - ADD_EXECUTABLE(${PROJECT_NAME}_test tests/test1.c tests/vkengine.c) - TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}_test PRIVATE + ADD_LIBRARY("tests_common" STATIC tests/common/vkengine.c tests/common/test.c) + TARGET_INCLUDE_DIRECTORIES(tests_common PRIVATE ${Vulkan_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/tests/common ${CMAKE_CURRENT_SOURCE_DIR}/vkh/include ${CMAKE_CURRENT_SOURCE_DIR}/vkh/src ) - TARGET_LINK_LIBRARIES(${PROJECT_NAME}_test + TARGET_LINK_LIBRARIES(tests_common ${Vulkan_LIBRARIES} ${GLFW3_LIBRARIES} vkh_static vkvg ) + file(GLOB_RECURSE DATAS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/tests" "tests/data/*") + FOREACH(DATA_FILE ${DATAS}) + GET_FILENAME_COMPONENT(copy-dest-dir ${CMAKE_CURRENT_BINARY_DIR}/${DATA_FILE} DIRECTORY) + SET(copy-output ${CMAKE_CURRENT_BINARY_DIR}/${DATA_FILE}) + ADD_CUSTOM_COMMAND( + OUTPUT ${copy-output} + COMMAND ${CMAKE_COMMAND} -E make_directory ${copy-dest-dir} + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/tests/${DATA_FILE}" "${copy-output}" + COMMENT "Copying ${DATA_FILE} to ${copy-output}" + #DEPENDS ${DATA_FILE} + VERBATIM + ) + ENDFOREACH() + add_custom_target("${PROJECT_NAME}_DataCopy" ALL DEPENDS ${DATAS}) + + #build test apps + file(GLOB TESTS "tests/*.c") + FOREACH(TEST ${TESTS}) + GET_FILENAME_COMPONENT(testname ${TEST} NAME_WE) + buildtest(${testname}) + ENDFOREACH() endif () MESSAGE(STATUS "\n\n--------------------------------------------------------------------------") @@ -178,3 +218,4 @@ ELSE () MESSAGE(STATUS "Surface tiling\t= VK_IMAGE_TILING_LINEAR.") ENDIF () MESSAGE(STATUS "---------------------------------------------------------------------------\n\n") + diff --git a/tests/clip.c b/tests/clip.c new file mode 100644 index 0000000..8a39502 --- /dev/null +++ b/tests/clip.c @@ -0,0 +1,27 @@ +#include "test.h" + +void test_clip(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_move_to(ctx,10,10); + vkvg_line_to(ctx,400,150); + vkvg_line_to(ctx,900,10); + vkvg_line_to(ctx,700,450); + vkvg_line_to(ctx,900,750); + vkvg_line_to(ctx,500,650); + vkvg_line_to(ctx,100,800); + vkvg_line_to(ctx,150,400); + vkvg_clip(ctx); + + vkvg_set_source_rgb(ctx,1,0,0); + vkvg_paint(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test_clip, 1024, 768); + + return 0; +} diff --git a/tests/colinear.c b/tests/colinear.c new file mode 100644 index 0000000..7f426ad --- /dev/null +++ b/tests/colinear.c @@ -0,0 +1,25 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_set_source_rgba(ctx,0.7,0.7,0.7,1); + vkvg_paint(ctx); + + vkvg_set_source_rgba(ctx,0,1,0,1); + vkvg_set_line_width(ctx,10); + + vkvg_move_to(ctx,100,100); + vkvg_line_to(ctx,100,200); + vkvg_line_to(ctx,100,100); + vkvg_stroke(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/include/nanosvg.h b/tests/common/nanosvg.h similarity index 100% rename from include/nanosvg.h rename to tests/common/nanosvg.h diff --git a/tests/common/test.c b/tests/common/test.c new file mode 100644 index 0000000..19acddc --- /dev/null +++ b/tests/common/test.c @@ -0,0 +1,117 @@ +#include "test.h" + +float panX = 0.f; +float panY = 0.f; +float lastX = 0.f; +float lastY = 0.f; +float zoom = 1.0f; +bool mouseDown = false; + +VkvgDevice device = NULL; +VkvgSurface surf = NULL; + +static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { + if (action != GLFW_PRESS) + return; + switch (key) { + case GLFW_KEY_ESCAPE : + glfwSetWindowShouldClose(window, GLFW_TRUE); + break; + } +} +static void char_callback (GLFWwindow* window, uint32_t c){} +static void mouse_move_callback(GLFWwindow* window, double x, double y){ + if (mouseDown) { + panX += ((float)x-lastX); + panY += ((float)y-lastY); + } + lastX = (float)x; + lastY = (float)y; +} +static void scroll_callback(GLFWwindow* window, double x, double y){ + if (y<0.f) + zoom *= 0.5f; + else + zoom *= 2.0f; +} +static void mouse_button_callback(GLFWwindow* window, int but, int state, int modif){ + if (but != GLFW_MOUSE_BUTTON_1) + return; + if (state == GLFW_TRUE) + mouseDown = true; + else + mouseDown = false; +} + +double time_diff(struct timeval x , struct timeval y) +{ + double x_ms , y_ms , diff; + + x_ms = (double)x.tv_sec*1000000 + (double)x.tv_usec; + y_ms = (double)y.tv_sec*1000000 + (double)y.tv_usec; + + diff = (double)y_ms - (double)x_ms; + + return diff; +} + +void randomize_color (VkvgContext ctx) { + vkvg_set_source_rgba(ctx, + (float)rand()/RAND_MAX, + (float)rand()/RAND_MAX, + (float)rand()/RAND_MAX, + (float)rand()/RAND_MAX + ); +} + +void perform_test (void(*testfunc)(void),uint width, uint height) { + //dumpLayerExts(); + + vk_engine_t* e = vkengine_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_PRESENT_MODE_MAILBOX_KHR, width, height); + VkhPresenter r = e->renderer; + vkengine_set_key_callback (e, key_callback); + vkengine_set_mouse_but_callback(e, mouse_button_callback); + vkengine_set_cursor_pos_callback(e, mouse_move_callback); + vkengine_set_scroll_callback(e, scroll_callback); + + bool deferredResolve = false; + + device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_4_BIT, deferredResolve); + surf = vkvg_surface_create(device, width, height); + + vkvg_surface_clear(surf); + + vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), width, height); + + struct timeval before , after; + double frameTime = 0, frameTimeAccum = 0, frameCount = 0; + + while (!vkengine_should_close (e)) { + glfwPollEvents(); + + gettimeofday(&before , NULL); + + testfunc(); + + if (deferredResolve) + vkvg_multisample_surface_resolve(surf); + if (!vkh_presenter_draw (r)) + vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), width, height); + + gettimeofday(&after , NULL); + + frameTimeAccum += time_diff(before , after); + frameCount++; + } + + frameTime = frameTimeAccum / frameCount; + printf ("frame (µs): %.0lf\nfps: %lf\n", frameTime, floor(1000000 / frameTime)); + + vkDeviceWaitIdle(e->dev->dev); + + vkvg_surface_destroy (surf); + vkvg_device_destroy (device); + + vkengine_destroy (e); + +} diff --git a/tests/common/test.h b/tests/common/test.h new file mode 100644 index 0000000..dc83464 --- /dev/null +++ b/tests/common/test.h @@ -0,0 +1,77 @@ +#include "vkengine.h" +#include "stdio.h" +#include "stdlib.h" +#include "time.h" +#include "vkvg.h" + +#include "vkh_device.h" +#include "vkh_presenter.h" + +#ifdef _WIN32 // MSC_VER + #define WIN32_LEAN_AND_MEAN + #define NOMINMAX + #include // Windows.h -> WinDef.h defines min() max() + + /* + typedef uint16_t WORD ; + typedef uint32_t DWORD; + + typedef struct _FILETIME { + DWORD dwLowDateTime; + DWORD dwHighDateTime; + } FILETIME; + + typedef struct _SYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; + } SYSTEMTIME, *PSYSTEMTIME; + */ + + // *sigh* Microsoft has this in winsock2.h because they are too lazy to put it in the standard location ... !?!? + typedef struct timeval { + long tv_sec; + long tv_usec; + } timeval; + + // *sigh* no gettimeofday on Win32/Win64 + int gettimeofday(struct timeval * tp, struct timezone * tzp) + { + // FILETIME Jan 1 1970 00:00:00 + // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's + static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); + + SYSTEMTIME nSystemTime; + FILETIME nFileTime; + uint64_t nTime; + + GetSystemTime( &nSystemTime ); + SystemTimeToFileTime( &nSystemTime, &nFileTime ); + nTime = ((uint64_t)nFileTime.dwLowDateTime ) ; + nTime += ((uint64_t)nFileTime.dwHighDateTime) << 32; + + tp->tv_sec = (long) ((nTime - EPOCH) / 10000000L); + tp->tv_usec = (long) (nSystemTime.wMilliseconds * 1000); + return 0; + } +#else + #include +#endif // _WIN32 + +extern float panX; +extern float panY; +extern float lastX; +extern float lastY; +extern float zoom; +extern bool mouseDown; + +extern VkvgDevice device; +extern VkvgSurface surf; + +void perform_test (void(*testfunc)(void),uint width, uint height); +void randomize_color (VkvgContext ctx); diff --git a/tests/vkengine.c b/tests/common/vkengine.c similarity index 100% rename from tests/vkengine.c rename to tests/common/vkengine.c diff --git a/tests/vkengine.h b/tests/common/vkengine.h similarity index 100% rename from tests/vkengine.h rename to tests/common/vkengine.h diff --git a/tests/curve.c b/tests/curve.c new file mode 100644 index 0000000..11e44d4 --- /dev/null +++ b/tests/curve.c @@ -0,0 +1,38 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_set_line_width(ctx, 10); + vkvg_set_source_rgb (ctx, 0,0,0); + + vkvg_arc(ctx, 150, 100, 10, 0, M_PI*2); + vkvg_fill(ctx); + vkvg_arc(ctx, 200, 200, 10, 0, M_PI*2); + vkvg_fill(ctx); + + vkvg_set_source_rgba (ctx, 0.5,0.0,1.0,0.5); + vkvg_move_to(ctx,100,100); + vkvg_line_to(ctx,200,100); + vkvg_curve_to(ctx,250,100,300,150,300,200); + vkvg_line_to(ctx,300,300); + vkvg_curve_to(ctx,300,350,250,400,200,400); + vkvg_line_to(ctx,100,400); + vkvg_curve_to(ctx,50,400,10,350,10,300); + vkvg_line_to(ctx,10,200); + vkvg_curve_to(ctx,10,150,50,100,100,100); + vkvg_close_path(ctx); + //vkvg_curve_to(ctx, 150,100,200,150,200,200); + vkvg_fill_preserve(ctx); + vkvg_set_source_rgba (ctx, 1,1,1.0,0.5); + vkvg_stroke(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/curve2.c b/tests/curve2.c new file mode 100644 index 0000000..683c29b --- /dev/null +++ b/tests/curve2.c @@ -0,0 +1,27 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_move_to (ctx, 100, 400); + vkvg_curve_to (ctx, 100, 100, 600,700,600,400); + vkvg_curve_to (ctx, 1000, 100, 100, 800, 1000, 800); + vkvg_curve_to (ctx, 1000, 500, 700, 500, 700, 100); + vkvg_close_path(ctx); + + //vkvg_set_source_rgba (ctx, 0.5,0.0,1.0,0.5); + //vkvg_fill_preserve(ctx); + + vkvg_set_source_rgba (ctx, 1,0,0,1); + vkvg_set_line_width(ctx, 40); + vkvg_stroke(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/data/miroir.jpg b/tests/data/miroir.jpg new file mode 100755 index 0000000000000000000000000000000000000000..03240fa1413c21ae9278b01677f24938bc0428b5 GIT binary patch literal 24740 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 literal 0 HcmV?d00001 diff --git a/tests/data/tiger.svg b/tests/data/tiger.svg new file mode 100644 index 0000000..67ba636 --- /dev/null +++ b/tests/data/tiger.svg @@ -0,0 +1,725 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fill.c b/tests/fill.c new file mode 100644 index 0000000..0986a45 --- /dev/null +++ b/tests/fill.c @@ -0,0 +1,29 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_set_source_rgba(ctx,0.1,0.9,0.1,1.0); + vkvg_move_to(ctx,10,10); + vkvg_rel_line_to(ctx,100,100); + vkvg_rel_line_to(ctx,100,-100); + vkvg_rel_line_to(ctx,100,400); +// vkvg_line_to(ctx,400,350); +// vkvg_line_to(ctx,900,150); +// vkvg_line_to(ctx,700,450); +// vkvg_line_to(ctx,900,750); +// vkvg_line_to(ctx,500,650); +// vkvg_line_to(ctx,100,800); +// vkvg_line_to(ctx,150,400); + vkvg_close_path(ctx); + vkvg_fill(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/fill_and_stroke.c b/tests/fill_and_stroke.c new file mode 100644 index 0000000..1174884 --- /dev/null +++ b/tests/fill_and_stroke.c @@ -0,0 +1,31 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_move_to (ctx, 100, 100); + vkvg_rel_line_to (ctx, 50, -80); + vkvg_rel_line_to (ctx, 50, 80); + //vkvg_close_path (ctx); + + vkvg_move_to (ctx, 300, 100); + vkvg_rel_line_to (ctx, 50, -80); + vkvg_rel_line_to (ctx, 50, 80); + vkvg_close_path (ctx); + + vkvg_set_line_width (ctx, 10.0); + vkvg_set_source_rgb (ctx, 0, 0, 1); + vkvg_fill_preserve (ctx); + //vkvg_fill(ctx); + vkvg_set_source_rgb (ctx, 0, 0, 0); + vkvg_stroke (ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/gradient.c b/tests/gradient.c new file mode 100644 index 0000000..b1a36cd --- /dev/null +++ b/tests/gradient.c @@ -0,0 +1,25 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + VkvgPattern pat = vkvg_pattern_create_linear(100,0,300,0); + vkvg_set_line_width(ctx, 20); + vkvg_patter_add_color_stop(pat, 0, 1, 0, 0, 1); + vkvg_patter_add_color_stop(pat, 0.5, 0, 1, 0, 1); + vkvg_patter_add_color_stop(pat, 1, 0, 0, 1, 1); + vkvg_set_source (ctx, pat); + vkvg_rectangle(ctx,100,100,200,200); + vkvg_fill (ctx); + //vkvg_stroke (ctx); + vkvg_pattern_destroy (pat); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/gradient_transform.c b/tests/gradient_transform.c new file mode 100644 index 0000000..7f6ef55 --- /dev/null +++ b/tests/gradient_transform.c @@ -0,0 +1,30 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + //vkvg_translate(ctx,-100,-100); + //vkvg_rotate(ctx,1.5); + //vkvg_translate(ctx,100,100); + + vkvg_scale(ctx,2,2); + VkvgPattern pat = vkvg_pattern_create_linear(0,0,200,0); + vkvg_set_line_width(ctx, 20); + vkvg_patter_add_color_stop(pat, 0, 1, 0, 0, 1); + vkvg_patter_add_color_stop(pat, 0.5, 0, 1, 0, 1); + vkvg_patter_add_color_stop(pat, 1, 0, 0, 1, 1); + vkvg_set_source (ctx, pat); + vkvg_rectangle(ctx,0,0,200,200); + vkvg_fill (ctx); + //vkvg_stroke (ctx); + vkvg_pattern_destroy (pat); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/img_surf.c b/tests/img_surf.c new file mode 100644 index 0000000..be9bb05 --- /dev/null +++ b/tests/img_surf.c @@ -0,0 +1,34 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + VkvgSurface imgSurf;// = vkvg_surface_create_from_image(device, "/mnt/data/images/blason.png"); + //VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/2000px-Tux.svg.png"); + //VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/path2674.png"); + //VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/horse-black-head-shape-of-a-chess-piece_318-52446.jpg"); + /*vkvg_set_source_surface(ctx, imgSurf, 200, 200); + vkvg_paint(ctx); + vkvg_set_source_surface(ctx, imgSurf, 400, 400); + vkvg_paint(ctx); + vkvg_flush(ctx); + vkvg_surface_destroy(imgSurf);*/ + + imgSurf = vkvg_surface_create_from_image(device, "data/miroir.jpg"); + fflush(stdout); + vkvg_set_source_surface(ctx, imgSurf, 0, 0); + vkvg_paint(ctx); + //vkvg_flush(ctx); + //vkvg_set_source_rgba(ctx,1,0,0,1); + + vkvg_surface_destroy(imgSurf); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/line_caps.c b/tests/line_caps.c new file mode 100644 index 0000000..c348d4a --- /dev/null +++ b/tests/line_caps.c @@ -0,0 +1,57 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + float x = 20, y = 20, dx = 30, dy = 60; + + //vkvg_scale(ctx,5,5); + vkvg_set_line_width(ctx,26); + vkvg_set_source_rgba(ctx,0,0,0,1); + vkvg_move_to(ctx,x,y); + vkvg_rel_line_to(ctx,0,dy); + vkvg_stroke(ctx); + vkvg_set_line_cap(ctx,VKVG_LINE_CAP_SQUARE); + vkvg_move_to(ctx,x+dx,y); + vkvg_rel_line_to(ctx,0,dy); + vkvg_stroke(ctx); + vkvg_set_line_cap(ctx,VKVG_LINE_CAP_ROUND); + vkvg_move_to(ctx,x+2*dx,y); + vkvg_rel_line_to(ctx,0,dy); + vkvg_rel_move_to(ctx,dx,-dy); + vkvg_rel_line_to(ctx,dx,dy); + vkvg_rel_move_to(ctx,dx,-dy/2); + vkvg_rel_line_to(ctx,dx,0); + vkvg_rel_move_to(ctx,dx,dy/2); + vkvg_rel_line_to(ctx,dx,-dy); + vkvg_rel_move_to(ctx,dx,dy); + vkvg_rel_line_to(ctx,0,-dy); + vkvg_rel_move_to(ctx,2*dx,dy); + vkvg_rel_line_to(ctx,-dx,-dy); + vkvg_rel_move_to(ctx,3*dx,dy/2); + vkvg_rel_line_to(ctx,-dx,0); + //vkvg_rel_line_to(ctx,0,-dy); + //vkvg_rel_move_to(ctx,dx,dy/2); + //vkvg_rel_line_to(ctx,dx,0); + vkvg_stroke(ctx); + + vkvg_set_line_cap(ctx,VKVG_LINE_CAP_BUTT); + vkvg_set_line_width(ctx,1); + vkvg_set_source_rgba(ctx,1,0,0,1); + vkvg_move_to(ctx,x,y); + vkvg_rel_line_to(ctx,0,dy); + vkvg_rel_move_to(ctx,dx,-dy); + vkvg_rel_line_to(ctx,0,dy); + vkvg_rel_move_to(ctx,dx,-dy); + vkvg_rel_line_to(ctx,0,dy); + vkvg_stroke(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/line_join.c b/tests/line_join.c new file mode 100644 index 0000000..03c9d25 --- /dev/null +++ b/tests/line_join.c @@ -0,0 +1,74 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + float x = 50, y = 150, dx = 150, dy = 140; + + vkvg_scale(ctx,2,2); + + vkvg_set_line_width(ctx,40); + vkvg_set_source_rgba(ctx,0,0,0,1); + + + vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); + //vkvg_rectangle(ctx,x,y,dx,dy); + + vkvg_move_to(ctx,x,y); + vkvg_rel_line_to(ctx,50,-30); + vkvg_rel_line_to(ctx,50,0); + vkvg_rel_line_to(ctx,50,30); + vkvg_rel_line_to(ctx,0,60); + vkvg_rel_line_to(ctx,-50,70); + vkvg_rel_line_to(ctx,-50,0); + vkvg_rel_line_to(ctx,-50,-70); + vkvg_close_path(ctx); + vkvg_stroke(ctx); + + vkvg_set_source_rgba(ctx,1,0,0,1); + vkvg_move_to(ctx,x+200,y); + vkvg_rel_line_to(ctx,50,70); + vkvg_rel_line_to(ctx,50,0); + vkvg_rel_line_to(ctx,50,-70); + vkvg_rel_line_to(ctx,0,-60); + vkvg_rel_line_to(ctx,-50,-30); + vkvg_rel_line_to(ctx,-50,0); + vkvg_rel_line_to(ctx,-50,30); + vkvg_close_path(ctx); + vkvg_stroke(ctx); + + vkvg_move_to(ctx,x,y); + vkvg_rel_line_to(ctx,50,-30); + vkvg_rel_line_to(ctx,50,0); + vkvg_rel_line_to(ctx,50,30); + vkvg_rel_line_to(ctx,0,60); + vkvg_rel_line_to(ctx,-50,70); + vkvg_rel_line_to(ctx,-50,0); + vkvg_rel_line_to(ctx,-50,-70); + vkvg_close_path(ctx); + vkvg_stroke(ctx); + +// vkvg_rel_line_to(ctx,dx,-dy); +// vkvg_rel_line_to(ctx,dx,dy); +// vkvg_stroke(ctx); +// vkvg_set_line_join(ctx,VKVG_LINE_JOIN_BEVEL); +// vkvg_rel_move_to(ctx,-dx*2,abs(dy*1.5)); +// vkvg_rel_line_to(ctx,dx,-dy); +// vkvg_rel_line_to(ctx,dx,dy); +// vkvg_stroke(ctx); +// vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); +// vkvg_rel_move_to(ctx,-dx*2,abs(dy*1.5)); +// vkvg_rel_line_to(ctx,dx,-dy); +// vkvg_rel_line_to(ctx,dx,dy); +// vkvg_stroke(ctx); +// vkvg_set_line_join(ctx,VKVG_LINE_JOIN_MITER); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/multi.c b/tests/multi.c new file mode 100644 index 0000000..be0f55a --- /dev/null +++ b/tests/multi.c @@ -0,0 +1,14 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/painting.c b/tests/painting.c new file mode 100644 index 0000000..8b8e225 --- /dev/null +++ b/tests/painting.c @@ -0,0 +1,40 @@ +#include "test.h" + +void test(){ + + VkvgSurface surf2 = vkvg_surface_create (device,400,400);; + VkvgContext ctx = vkvg_create (surf2); + + vkvg_set_source_rgba(ctx,1.0,0.,0.,1.0); + vkvg_paint (ctx); + + vkvg_destroy (ctx); + ctx = vkvg_create (surf); + + vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0); + vkvg_paint (ctx); + + //vkvg_set_source_surface(ctx,surf2,0,0); + + //VkvgPattern pat = vkvg_get_source (ctx); + VkvgPattern pat = vkvg_pattern_create_for_surface(surf2); + vkvg_pattern_set_extend (pat,VKVG_EXTEND_REFLECT); + vkvg_set_source(ctx,pat); + //vkvg_paint (ctx); + //vkvg_set_source_rgba(ctx,0,1,0,1.0); + vkvg_rectangle(ctx,100,100,200,200); + vkvg_fill(ctx); + + vkvg_destroy (ctx); + vkvg_surface_destroy (surf2); + vkvg_pattern_destroy (pat); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/random_rects.c b/tests/random_rects.c new file mode 100644 index 0000000..6c3edd0 --- /dev/null +++ b/tests/random_rects.c @@ -0,0 +1,33 @@ +#include "test.h" + +void test(){ + vkvg_surface_clear(surf); + struct timeval currentTime; + gettimeofday(¤tTime, NULL); + + srand((unsigned) currentTime.tv_usec); + const float w = 1024.f; + + VkvgContext ctx = vkvg_create(surf); + vkvg_set_line_width(ctx,1); + for (int i=0; i<5000; i++) { + randomize_color(ctx); + float x = trunc( (0.5*(float)w*rand())/RAND_MAX ); + float y = trunc( (0.5*(float)w*rand())/RAND_MAX ); + float z = trunc( (0.5*(float)w*rand())/RAND_MAX ) + 1; + float v = trunc( (0.5*(float)w*rand())/RAND_MAX ) + 1; + + vkvg_rectangle(ctx, x+1, y+1, z, v); + vkvg_fill_preserve(ctx); + randomize_color(ctx); + vkvg_stroke(ctx); + } + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/rect_fill.c b/tests/rect_fill.c new file mode 100644 index 0000000..9453a3c --- /dev/null +++ b/tests/rect_fill.c @@ -0,0 +1,23 @@ +#include "test.h" + +void test(){ + vkvg_surface_clear(surf); + VkvgContext ctx = vkvg_create(surf); + + vkvg_set_line_width(ctx,10); + vkvg_set_source_rgba(ctx,0,0,1,0.5); + vkvg_rectangle(ctx,100,100,200,200); + vkvg_fill(ctx); + vkvg_rectangle(ctx,200,200,200,200); + vkvg_set_source_rgba(ctx,1,0,0,0.5); + vkvg_fill(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/simple_paint.c b/tests/simple_paint.c new file mode 100644 index 0000000..f3c1161 --- /dev/null +++ b/tests/simple_paint.c @@ -0,0 +1,15 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_rgba(ctx,1,0,0,1); + vkvg_paint(ctx); + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/stroke.c b/tests/stroke.c new file mode 100644 index 0000000..3f6d1d5 --- /dev/null +++ b/tests/stroke.c @@ -0,0 +1,52 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_set_line_width(ctx, 2); + vkvg_set_source_rgba(ctx,1,0,0,1); + vkvg_move_to(ctx,200.5,200.5); + vkvg_line_to(ctx,400.5,200.5); + vkvg_line_to(ctx,400.5,400.5); + vkvg_line_to(ctx,200.5,400.5); + vkvg_close_path(ctx); + vkvg_stroke_preserve(ctx); + vkvg_set_source_rgba(ctx,0,0.2,0.35,1); + vkvg_fill(ctx); + vkvg_set_source_rgba(ctx,0.5,1,0,1); + vkvg_move_to(ctx,300.5,300.5); + vkvg_line_to(ctx,500.5,300.5); + vkvg_line_to(ctx,500.5,500.5); + vkvg_line_to(ctx,300.5,500.5); + vkvg_close_path(ctx); + vkvg_stroke(ctx); + vkvg_set_line_width(ctx, 40); + vkvg_set_source_rgba(ctx,0.5,0.6,1,1.0); + vkvg_move_to(ctx,700,475); + vkvg_line_to(ctx,400,475); + vkvg_stroke(ctx); + vkvg_set_source_rgba(ctx,0,0.5,0.5,0.5); + vkvg_move_to(ctx,300,200); + vkvg_arc(ctx, 200,200,100,0, M_PI); + vkvg_stroke(ctx); + + vkvg_set_line_width(ctx, 20); + vkvg_set_source_rgba(ctx,0.1,0.1,0.1,0.5); + vkvg_move_to(ctx,100,60); + vkvg_line_to(ctx,400,600); + vkvg_stroke(ctx); + + vkvg_set_source_rgba(ctx,1,1,1,1); + vkvg_set_line_width(ctx, 1); + vkvg_rectangle(ctx,600.5,200.5,100,60); + vkvg_stroke(ctx); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} diff --git a/tests/svg.c b/tests/svg.c new file mode 100644 index 0000000..3dbec1b --- /dev/null +++ b/tests/svg.c @@ -0,0 +1,103 @@ +#include "test.h" + +#include "string.h" //for nanosvg +#define NANOSVG_IMPLEMENTATION // Expands implementation +#include "nanosvg.h" + +void svg_set_color (VkvgContext ctx, uint32_t c, float alpha) { + float a = (c >> 24 & 255) / 255.f; + float b = (c >> 16 & 255) / 255.f; + float g = (c >> 8 & 255) / 255.f; + float r = (c & 255) / 255.f; + vkvg_set_source_rgba(ctx,r,g,b,a*alpha); +} + +static float rotation = 0.f; + +void test_svg () { + rotation+=0.01f; + + vkvg_matrix_t mat; + vkvg_matrix_init_translate (&mat, 512,400); + vkvg_matrix_rotate(&mat,rotation); + vkvg_matrix_translate(&mat,-512,-400); + + VkvgContext ctx = vkvg_create(surf); + vkvg_set_source_rgba(ctx,1.0,1.0,1.0,1); + vkvg_paint(ctx); + + vkvg_set_matrix(ctx,&mat); + + NSVGimage* svg; + NSVGshape* shape; + NSVGpath* path; + //svg = nsvgParseFromFile("/mnt/data/images/svg/tux.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/world.svg", "px", 96); + svg = nsvgParseFromFile("data/tiger.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/koch_curve.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/diamond1.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/diamond2.svg", "px", 96); + //svg = nsvgParseFromFile("/home/jp/yahweh-protosinaitic.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/WMD-biological.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/Skull_and_crossbones.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/IconAlerte.svg", "px", 96); + //svg = nsvgParseFromFile("/mnt/data/images/svg/Svg_example4.svg", "px", 96); + + //vkvg_scale(ctx, 3,3); + vkvg_set_source_rgba(ctx,0.0,0.0,0.0,1); + + for (shape = svg->shapes; shape != NULL; shape = shape->next) { + + vkvg_new_path(ctx); + + float o = shape->opacity; + + vkvg_set_line_width(ctx, shape->strokeWidth); + + for (path = shape->paths; path != NULL; path = path->next) { + float* p = path->pts; + vkvg_move_to(ctx, p[0],p[1]); + for (int i = 1; i < path->npts-2; i += 3) { + p = &path->pts[i*2]; + vkvg_curve_to(ctx, p[0],p[1], p[2],p[3], p[4],p[5]); + } + if (path->closed) + vkvg_close_path(ctx); + } + + if (shape->fill.type == NSVG_PAINT_COLOR) + svg_set_color(ctx, shape->fill.color, o); + else if (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT){ + NSVGgradient* g = shape->fill.gradient; + svg_set_color(ctx, g->stops[0].color, o); + } + + if (shape->fill.type != NSVG_PAINT_NONE){ + if (shape->stroke.type == NSVG_PAINT_NONE){ + vkvg_fill(ctx); + continue; + } + vkvg_fill_preserve (ctx); + } + + if (shape->stroke.type == NSVG_PAINT_COLOR) + svg_set_color(ctx, shape->stroke.color, o); + else if (shape->stroke.type == NSVG_PAINT_LINEAR_GRADIENT){ + NSVGgradient* g = shape->stroke.gradient; + svg_set_color(ctx, g->stops[0].color, o); + } + + vkvg_stroke(ctx); + } + + nsvgDelete(svg); + + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test_svg, 1024, 768); + return 0; +} diff --git a/tests/test1.c b/tests/test1.c index 82aa694..d7235cb 100644 --- a/tests/test1.c +++ b/tests/test1.c @@ -19,634 +19,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include "vkengine.h" -#include "stdio.h" -#include "stdlib.h" -#include "time.h" -#include "vkvg.h" -#include "string.h" //for nanosvg -#define NANOSVG_IMPLEMENTATION // Expands implementation -#include "nanosvg.h" -#include "vkh_device.h" -#include "vkh_presenter.h" - -#ifdef _WIN32 // MSC_VER - #define WIN32_LEAN_AND_MEAN - #define NOMINMAX - #include // Windows.h -> WinDef.h defines min() max() - - /* - typedef uint16_t WORD ; - typedef uint32_t DWORD; - - typedef struct _FILETIME { - DWORD dwLowDateTime; - DWORD dwHighDateTime; - } FILETIME; - - typedef struct _SYSTEMTIME { - WORD wYear; - WORD wMonth; - WORD wDayOfWeek; - WORD wDay; - WORD wHour; - WORD wMinute; - WORD wSecond; - WORD wMilliseconds; - } SYSTEMTIME, *PSYSTEMTIME; - */ - - // *sigh* Microsoft has this in winsock2.h because they are too lazy to put it in the standard location ... !?!? - typedef struct timeval { - long tv_sec; - long tv_usec; - } timeval; - - // *sigh* no gettimeofday on Win32/Win64 - int gettimeofday(struct timeval * tp, struct timezone * tzp) - { - // FILETIME Jan 1 1970 00:00:00 - // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's - static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); - - SYSTEMTIME nSystemTime; - FILETIME nFileTime; - uint64_t nTime; - - GetSystemTime( &nSystemTime ); - SystemTimeToFileTime( &nSystemTime, &nFileTime ); - nTime = ((uint64_t)nFileTime.dwLowDateTime ) ; - nTime += ((uint64_t)nFileTime.dwHighDateTime) << 32; - - tp->tv_sec = (long) ((nTime - EPOCH) / 10000000L); - tp->tv_usec = (long) (nSystemTime.wMilliseconds * 1000); - return 0; - } -#else - #include -#endif // _WIN32 - -VkvgDevice device; -VkvgSurface surf = NULL; - -static float panX = 0.f; -static float panY = 0.f; -static float lastX = 0.f; -static float lastY = 0.f; -static float zoom = 1.0f; -static bool mouseDown = false; - -static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { - if (action != GLFW_PRESS) - return; - switch (key) { - case GLFW_KEY_ESCAPE : - glfwSetWindowShouldClose(window, GLFW_TRUE); - break; - } -} -static void char_callback (GLFWwindow* window, uint32_t c){} -static void mouse_move_callback(GLFWwindow* window, double x, double y){ - if (mouseDown) { - panX += ((float)x-lastX); - panY += ((float)y-lastY); - } - lastX = (float)x; - lastY = (float)y; -} -static void scroll_callback(GLFWwindow* window, double x, double y){ - if (y<0.f) - zoom *= 0.5f; - else - zoom *= 2.0f; -} -static void mouse_button_callback(GLFWwindow* window, int but, int state, int modif){ - if (but != GLFW_MOUSE_BUTTON_1) - return; - if (state == GLFW_TRUE) - mouseDown = true; - else - mouseDown = false; -} - -double time_diff(struct timeval x , struct timeval y) -{ - double x_ms , y_ms , diff; - - x_ms = (double)x.tv_sec*1000000 + (double)x.tv_usec; - y_ms = (double)y.tv_sec*1000000 + (double)y.tv_usec; - - diff = (double)y_ms - (double)x_ms; - - return diff; -} - -void randomize_color (VkvgContext ctx) { - vkvg_set_source_rgba(ctx, - (float)rand()/RAND_MAX, - (float)rand()/RAND_MAX, - (float)rand()/RAND_MAX, - (float)rand()/RAND_MAX - ); -} -void vkvg_test_gradient (VkvgContext ctx) { - VkvgPattern pat = vkvg_pattern_create_linear(100,0,300,0); - vkvg_set_line_width(ctx, 20); - vkvg_patter_add_color_stop(pat, 0, 1, 0, 0, 1); - vkvg_patter_add_color_stop(pat, 0.5, 0, 1, 0, 1); - vkvg_patter_add_color_stop(pat, 1, 0, 0, 1, 1); - vkvg_set_source (ctx, pat); - vkvg_rectangle(ctx,100,100,200,200); - vkvg_fill (ctx); - //vkvg_stroke (ctx); - vkvg_pattern_destroy (pat); -} - -void vkvg_test_clip(VkvgContext ctx){ - vkvg_move_to(ctx,10,10); - vkvg_line_to(ctx,400,150); - vkvg_line_to(ctx,900,10); - vkvg_line_to(ctx,700,450); - vkvg_line_to(ctx,900,750); - vkvg_line_to(ctx,500,650); - vkvg_line_to(ctx,100,800); - vkvg_line_to(ctx,150,400); - vkvg_clip(ctx); -} -void vkvg_test_fill(VkvgContext ctx){ - vkvg_set_source_rgba(ctx,0.1,0.9,0.1,1.0); - vkvg_move_to(ctx,10,10); - vkvg_rel_line_to(ctx,100,100); - vkvg_rel_line_to(ctx,100,-100); - vkvg_rel_line_to(ctx,100,400); -// vkvg_line_to(ctx,400,350); -// vkvg_line_to(ctx,900,150); -// vkvg_line_to(ctx,700,450); -// vkvg_line_to(ctx,900,750); -// vkvg_line_to(ctx,500,650); -// vkvg_line_to(ctx,100,800); -// vkvg_line_to(ctx,150,400); - vkvg_close_path(ctx); - vkvg_fill(ctx); -} -void vkvg_test_fill_and_stroke (VkvgContext ctx){ - vkvg_move_to (ctx, 100, 100); - vkvg_rel_line_to (ctx, 50, -80); - vkvg_rel_line_to (ctx, 50, 80); - //vkvg_close_path (ctx); - - vkvg_move_to (ctx, 300, 100); - vkvg_rel_line_to (ctx, 50, -80); - vkvg_rel_line_to (ctx, 50, 80); - vkvg_close_path (ctx); - - vkvg_set_line_width (ctx, 10.0); - vkvg_set_source_rgb (ctx, 0, 0, 1); - vkvg_fill_preserve (ctx); - //vkvg_fill(ctx); - vkvg_set_source_rgb (ctx, 0, 0, 0); - vkvg_stroke (ctx); -} -void vkvg_test_curves2 (VkvgContext ctx) { - - vkvg_move_to (ctx, 100, 400); - vkvg_curve_to (ctx, 100, 100, 600,700,600,400); - vkvg_curve_to (ctx, 1000, 100, 100, 800, 1000, 800); - vkvg_curve_to (ctx, 1000, 500, 700, 500, 700, 100); - vkvg_close_path(ctx); - - //vkvg_set_source_rgba (ctx, 0.5,0.0,1.0,0.5); - //vkvg_fill_preserve(ctx); - - vkvg_set_source_rgba (ctx, 0,0,0,1); - vkvg_set_line_width(ctx, 40); - vkvg_stroke(ctx); -} -void vkvg_test_curves (VkvgContext ctx){ - - vkvg_set_line_width(ctx, 10); - vkvg_set_source_rgb (ctx, 0,0,0); - - vkvg_arc(ctx, 150, 100, 10, 0, M_PI*2); - vkvg_fill(ctx); - vkvg_arc(ctx, 200, 200, 10, 0, M_PI*2); - vkvg_fill(ctx); - - vkvg_set_source_rgba (ctx, 0.5,0.0,1.0,0.5); - vkvg_move_to(ctx,100,100); - vkvg_line_to(ctx,200,100); - vkvg_curve_to(ctx,250,100,300,150,300,200); - vkvg_line_to(ctx,300,300); - vkvg_curve_to(ctx,300,350,250,400,200,400); - vkvg_line_to(ctx,100,400); - vkvg_curve_to(ctx,50,400,10,350,10,300); - vkvg_line_to(ctx,10,200); - vkvg_curve_to(ctx,10,150,50,100,100,100); - vkvg_close_path(ctx); - //vkvg_curve_to(ctx, 150,100,200,150,200,200); - vkvg_fill_preserve(ctx); - vkvg_set_source_rgba (ctx, 1,1,1.0,0.5); - vkvg_stroke(ctx); -} -void vkvg_test_stroke(VkvgContext ctx){ - vkvg_set_line_width(ctx, 2); - vkvg_set_source_rgba(ctx,1,0,0,1); - vkvg_move_to(ctx,200.5,200.5); - vkvg_line_to(ctx,400.5,200.5); - vkvg_line_to(ctx,400.5,400.5); - vkvg_line_to(ctx,200.5,400.5); - vkvg_close_path(ctx); - vkvg_stroke_preserve(ctx); - vkvg_set_source_rgba(ctx,0,0.2,0.35,1); - vkvg_fill(ctx); - vkvg_set_source_rgba(ctx,0.5,1,0,1); - vkvg_move_to(ctx,300.5,300.5); - vkvg_line_to(ctx,500.5,300.5); - vkvg_line_to(ctx,500.5,500.5); - vkvg_line_to(ctx,300.5,500.5); - vkvg_close_path(ctx); - vkvg_stroke(ctx); - vkvg_set_line_width(ctx, 40); - vkvg_set_source_rgba(ctx,0.5,0.6,1,1.0); - vkvg_move_to(ctx,700,475); - vkvg_line_to(ctx,400,475); - vkvg_stroke(ctx); - vkvg_set_source_rgba(ctx,0,0.5,0.5,0.5); - vkvg_move_to(ctx,300,200); - vkvg_arc(ctx, 200,200,100,0, M_PI); - vkvg_stroke(ctx); - - vkvg_set_line_width(ctx, 20); - vkvg_set_source_rgba(ctx,0.1,0.1,0.1,0.5); - vkvg_move_to(ctx,100,60); - vkvg_line_to(ctx,400,600); - vkvg_stroke(ctx); -} -void test_text (VkvgContext ctx) { - int size = 19; - int penY = 50; - int penX = 10; - - /*vkvg_rectangle(ctx,30,0,100,400); - vkvg_clip(ctx);*/ - - //vkvg_select_font_face(ctx, "/usr/local/share/fonts/DroidSansMono.ttf"); - //vkvg_select_font_face(ctx, "/usr/share/fonts/truetype/unifont/unifont.ttf"); - - vkvg_set_font_size(ctx,12); - vkvg_select_font_face(ctx, "droid"); - vkvg_font_extents_t fe; - vkvg_font_extents (ctx,&fe); - vkvg_move_to(ctx, penX,penY); - vkvg_set_source_rgba(ctx,0.7,0.7,0.7,1); - vkvg_text_extents_t te; - vkvg_text_extents(ctx,"abcdefghijk",&te); - vkvg_show_text (ctx,"abcdefghijk"); - penX+= te.x_advance; - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"*abcdefghijk2"); - penY+=2*size; - - - vkvg_select_font_face(ctx, "times"); - vkvg_set_source_rgba(ctx,0.9,0.7,0.7,1); - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"abcdefghijklmnopqrstuvwxyz"); - penY+=size; - - - - vkvg_select_font_face(ctx, "droid"); - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"lmnopqrstuvwxyz123456789"); - penY+=size; - - - - vkvg_select_font_face(ctx, "times:bold"); - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"abcdefghijklmnopqrstuvwxyz"); - penY+=size; - - - vkvg_select_font_face(ctx, "droid"); - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - penY+=size; - - - - vkvg_select_font_face(ctx, "arial:italic"); - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"abcdefghijklmnopqrstuvwxyz"); - penY+=size; - - - vkvg_select_font_face(ctx, "arial"); - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - penY+=size; - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"this is a test"); - penY+=size; - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"this is another test to see if label is working"); - penY+=size; - - vkvg_select_font_face(ctx, "mono"); - vkvg_move_to(ctx, penX,penY); - vkvg_show_text (ctx,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); - penY+=size; - - vkvg_move_to(ctx, 80,400); - vkvg_show_text (ctx,"Ленивый рыжий кот"); - - - /*vkvg_move_to(ctx, 150,250); - vkvg_show_text (ctx,"test string é€"); - vkvg_move_to(ctx, 150,300); - vkvg_show_text (ctx,"كسول الزنجبيل القط"); - vkvg_move_to(ctx, 150,350); - vkvg_show_text (ctx,"懶惰的姜貓");*/ - - //vkvg_show_text (ctx,"ABCDABCD"); - //vkvg_show_text (ctx,"j"); -} -void vkvg_test_stroke2(VkvgContext ctx){ - vkvg_set_line_width(ctx,20); - vkvg_set_source_rgba(ctx,1,0,0,1); - vkvg_move_to(ctx,200,200); - vkvg_line_to(ctx,400,200); - vkvg_line_to(ctx,400,400); - vkvg_line_to(ctx,200,400); - vkvg_close_path(ctx); - vkvg_stroke(ctx); - vkvg_set_source_rgba(ctx,0.5,1,0,1); - vkvg_move_to(ctx,300,300); - vkvg_line_to(ctx,500,300); - vkvg_line_to(ctx,500,500); - vkvg_line_to(ctx,300,500); - vkvg_close_path(ctx); - vkvg_stroke(ctx); - vkvg_set_line_width(ctx,10); - vkvg_set_source_rgba(ctx,0.5,0.6,1,1); - vkvg_move_to(ctx,700,475); - vkvg_line_to(ctx,400,475); - vkvg_stroke(ctx); - vkvg_set_source_rgba(ctx,1,0,1,1); - vkvg_move_to(ctx,700,500); - - vkvg_arc(ctx, 600,500,100,M_PI, 2.0*M_PI); - vkvg_stroke(ctx); - - - vkvg_set_line_width(ctx,20); - vkvg_set_source_rgba(ctx,1,1,0,1); - vkvg_move_to(ctx,100,50); - vkvg_line_to(ctx,400,50); - vkvg_stroke(ctx); -} -void vkvg_test_fill2(VkvgContext ctx){ - vkvg_set_source_rgba(ctx,1,0,0,1); - vkvg_move_to(ctx,200,200); - vkvg_line_to(ctx,250,150); - vkvg_line_to(ctx,200,100); - vkvg_line_to(ctx,300,150); - vkvg_line_to(ctx,700,100); - vkvg_line_to(ctx,400,200); - vkvg_line_to(ctx,400,400); - vkvg_line_to(ctx,200,400); - vkvg_line_to(ctx,300,300); - vkvg_close_path(ctx); - vkvg_fill(ctx); -} -void test_img_surface () { - VkvgContext ctx = vkvg_create(surf); - VkvgSurface imgSurf;// = vkvg_surface_create_from_image(device, "/mnt/data/images/blason.png"); - //VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/2000px-Tux.svg.png"); - //VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/path2674.png"); - //VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/horse-black-head-shape-of-a-chess-piece_318-52446.jpg"); - /*vkvg_set_source_surface(ctx, imgSurf, 200, 200); - vkvg_paint(ctx); - vkvg_set_source_surface(ctx, imgSurf, 400, 400); - vkvg_paint(ctx); - vkvg_flush(ctx); - vkvg_surface_destroy(imgSurf);*/ - - imgSurf = vkvg_surface_create_from_image(device, "/mnt/data/images/miroir.jpg"); - fflush(stdout); - vkvg_set_source_surface(ctx, imgSurf, 0, 0); - vkvg_paint(ctx); - //vkvg_flush(ctx); - //vkvg_set_source_rgba(ctx,1,0,0,1); - - vkvg_surface_destroy(imgSurf); - vkvg_destroy(ctx); -} -void test_line_caps (VkvgContext ctx) { - - float x = 20, y = 20, dx = 30, dy = 60; - - //vkvg_scale(ctx,5,5); - vkvg_set_line_width(ctx,26); - vkvg_set_source_rgba(ctx,0,0,0,1); - vkvg_move_to(ctx,x,y); - vkvg_rel_line_to(ctx,0,dy); - vkvg_stroke(ctx); - vkvg_set_line_cap(ctx,VKVG_LINE_CAP_SQUARE); - vkvg_move_to(ctx,x+dx,y); - vkvg_rel_line_to(ctx,0,dy); - vkvg_stroke(ctx); - vkvg_set_line_cap(ctx,VKVG_LINE_CAP_ROUND); - vkvg_move_to(ctx,x+2*dx,y); - vkvg_rel_line_to(ctx,0,dy); - vkvg_rel_move_to(ctx,dx,-dy); - vkvg_rel_line_to(ctx,dx,dy); - vkvg_rel_move_to(ctx,dx,-dy/2); - vkvg_rel_line_to(ctx,dx,0); - vkvg_rel_move_to(ctx,dx,dy/2); - vkvg_rel_line_to(ctx,dx,-dy); - vkvg_rel_move_to(ctx,dx,dy); - vkvg_rel_line_to(ctx,0,-dy); - vkvg_rel_move_to(ctx,2*dx,dy); - vkvg_rel_line_to(ctx,-dx,-dy); - vkvg_rel_move_to(ctx,3*dx,dy/2); - vkvg_rel_line_to(ctx,-dx,0); - //vkvg_rel_line_to(ctx,0,-dy); - //vkvg_rel_move_to(ctx,dx,dy/2); - //vkvg_rel_line_to(ctx,dx,0); - vkvg_stroke(ctx); - - vkvg_set_line_cap(ctx,VKVG_LINE_CAP_BUTT); - vkvg_set_line_width(ctx,1); - vkvg_set_source_rgba(ctx,1,0,0,1); - vkvg_move_to(ctx,x,y); - vkvg_rel_line_to(ctx,0,dy); - vkvg_rel_move_to(ctx,dx,-dy); - vkvg_rel_line_to(ctx,0,dy); - vkvg_rel_move_to(ctx,dx,-dy); - vkvg_rel_line_to(ctx,0,dy); - vkvg_stroke(ctx); -} -void test_line_join (VkvgContext ctx){ - float x = 50, y = 150, dx = 150, dy = 140; - - vkvg_scale(ctx,2,2); - - vkvg_set_line_width(ctx,40); - vkvg_set_source_rgba(ctx,0,0,0,1); - - - vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); - //vkvg_rectangle(ctx,x,y,dx,dy); - - vkvg_move_to(ctx,x,y); - vkvg_rel_line_to(ctx,50,-30); - vkvg_rel_line_to(ctx,50,0); - vkvg_rel_line_to(ctx,50,30); - vkvg_rel_line_to(ctx,0,60); - vkvg_rel_line_to(ctx,-50,70); - vkvg_rel_line_to(ctx,-50,0); - vkvg_rel_line_to(ctx,-50,-70); - vkvg_close_path(ctx); - vkvg_stroke(ctx); - - vkvg_set_source_rgba(ctx,1,0,0,1); - vkvg_move_to(ctx,x+200,y); - vkvg_rel_line_to(ctx,50,70); - vkvg_rel_line_to(ctx,50,0); - vkvg_rel_line_to(ctx,50,-70); - vkvg_rel_line_to(ctx,0,-60); - vkvg_rel_line_to(ctx,-50,-30); - vkvg_rel_line_to(ctx,-50,0); - vkvg_rel_line_to(ctx,-50,30); - vkvg_close_path(ctx); - vkvg_stroke(ctx); - - vkvg_move_to(ctx,x,y); - vkvg_rel_line_to(ctx,50,-30); - vkvg_rel_line_to(ctx,50,0); - vkvg_rel_line_to(ctx,50,30); - vkvg_rel_line_to(ctx,0,60); - vkvg_rel_line_to(ctx,-50,70); - vkvg_rel_line_to(ctx,-50,0); - vkvg_rel_line_to(ctx,-50,-70); - vkvg_close_path(ctx); - vkvg_stroke(ctx); - -// vkvg_rel_line_to(ctx,dx,-dy); -// vkvg_rel_line_to(ctx,dx,dy); -// vkvg_stroke(ctx); -// vkvg_set_line_join(ctx,VKVG_LINE_JOIN_BEVEL); -// vkvg_rel_move_to(ctx,-dx*2,abs(dy*1.5)); -// vkvg_rel_line_to(ctx,dx,-dy); -// vkvg_rel_line_to(ctx,dx,dy); -// vkvg_stroke(ctx); -// vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); -// vkvg_rel_move_to(ctx,-dx*2,abs(dy*1.5)); -// vkvg_rel_line_to(ctx,dx,-dy); -// vkvg_rel_line_to(ctx,dx,dy); -// vkvg_stroke(ctx); -// vkvg_set_line_join(ctx,VKVG_LINE_JOIN_MITER); -} -void test_colinear () { - VkvgContext ctx = vkvg_create(surf); - vkvg_set_source_rgba(ctx,0.7,0.7,0.7,1); - vkvg_paint(ctx); - - vkvg_set_source_rgba(ctx,0,0,0,1); - vkvg_set_line_width(ctx,10); - - vkvg_move_to(ctx,100,100); - vkvg_line_to(ctx,100,200); - vkvg_line_to(ctx,100,100); - vkvg_stroke(ctx); - - vkvg_destroy(ctx); -} - -void multi_test1 () { - VkvgSurface surf2 = vkvg_surface_create (device,800,800);; - VkvgContext ctx = vkvg_create (surf2); - - vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1); - vkvg_paint(ctx); - - vkvg_test_fill(ctx); - vkvg_test_fill2(ctx); - -// vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); - - - //test_line_join(ctx); -// vkvg_set_source_rgba(ctx,0.0,1.0,0.0,1.0); - -// vkvg_move_to(ctx,50,50); -// vkvg_rel_line_to(ctx,400,-10); -// vkvg_rel_line_to(ctx,-200,300); -// vkvg_close_path(ctx); -// vkvg_fill(ctx); - -// vkvg_set_source_rgba(ctx,1.0,1.0,0.0,1.0); -// vkvg_move_to(ctx,100,100); -// vkvg_line_to(ctx,100,200); -// vkvg_stroke(ctx); - - //vkvg_test_clip(ctx); - -// vkvg_set_source_rgba (ctx,0.02,0.8,0.3,1.0); -// vkvg_rectangle (ctx,200,200,300,300); -// vkvg_fill (ctx); - - - test_text(ctx); - - - vkvg_test_stroke(ctx); - - vkvg_translate(ctx, 100,50); -// vkvg_rotate(ctx, 0.2); - //vkvg_scale(ctx, 2,2); - - - //vkvg_test_gradient (ctx); - - vkvg_test_curves(ctx); - vkvg_test_curves2(ctx); - - /*vkvg_set_operator(ctx, VKVG_OPERATOR_CLEAR); - vkvg_rectangle(ctx,100,100,300,300); - vkvg_fill(ctx); - vkvg_set_operator(ctx, VKVG_OPERATOR_OVER);*/ - - //test_img_surface(ctx); - //test_line_caps(ctx); - - vkvg_destroy(ctx); - ctx = vkvg_create(surf); - - vkvg_set_source_rgba(ctx,1.0,0.0,0.0,1); - vkvg_paint(ctx); -// vkvg_set_source_rgba(ctx,0.0,0.0,1.0,1); -// vkvg_rectangle(ctx,100,100,500,500); -// vkvg_fill(ctx); - - VkvgPattern pat = vkvg_pattern_create_for_surface(surf2); - vkvg_pattern_set_extend(pat, VKVG_EXTEND_REFLECT); - vkvg_pattern_set_filter(pat, VKVG_FILTER_BEST); - vkvg_set_source (ctx, pat); - //vkvg_rectangle(ctx,100,100,400,400); - //vkvg_fill(ctx); - vkvg_paint(ctx); - vkvg_translate(ctx,200,200); - vkvg_paint(ctx); - vkvg_rotate(ctx,0.7); - vkvg_paint(ctx); - vkvg_pattern_destroy (pat); - vkvg_destroy(ctx); - vkvg_surface_destroy(surf2); -} +#include "test.h" void cairo_test_fill_rule (VkvgContext cr){ vkvg_set_line_width (cr, 6); @@ -970,308 +344,9 @@ void cairo_tests () { vkvg_destroy(ctx); } -void test_grad_transforms () { - VkvgContext ctx = vkvg_create(surf); - - vkvg_translate(ctx,-100,-100); - vkvg_rotate(ctx,1.5); - //vkvg_translate(ctx,100,100); - - //vkvg_scale(ctx,0.2,0.2); - VkvgPattern pat = vkvg_pattern_create_linear(0,0,200,0); - vkvg_set_line_width(ctx, 20); - vkvg_patter_add_color_stop(pat, 0, 1, 0, 0, 1); - vkvg_patter_add_color_stop(pat, 0.5, 0, 1, 0, 1); - vkvg_patter_add_color_stop(pat, 1, 0, 0, 1, 1); - vkvg_set_source (ctx, pat); - vkvg_rectangle(ctx,0,0,200,200); - vkvg_fill (ctx); - //vkvg_stroke (ctx); - vkvg_pattern_destroy (pat); - - vkvg_destroy(ctx); -} - -void svg_set_color (VkvgContext ctx, uint32_t c, float alpha) { - float a = (c >> 24 & 255) / 255.f; - float b = (c >> 16 & 255) / 255.f; - float g = (c >> 8 & 255) / 255.f; - float r = (c & 255) / 255.f; - vkvg_set_source_rgba(ctx,r,g,b,a*alpha); -} - -void test_svg () { - rotation+=0.01f; - - vkvg_matrix_t mat; - vkvg_matrix_init_translate (&mat, 512,400); - vkvg_matrix_rotate(&mat,rotation); - vkvg_matrix_translate(&mat,-512,-400); - - VkvgContext ctx = vkvg_create(surf); - vkvg_set_source_rgba(ctx,1.0,1.0,1.0,1); - vkvg_paint(ctx); - - vkvg_set_matrix(ctx,&mat); - - NSVGimage* svg; - NSVGshape* shape; - NSVGpath* path; - //svg = nsvgParseFromFile("/mnt/data/images/svg/tux.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/world.svg", "px", 96); - svg = nsvgParseFromFile("/mnt/data/images/svg/tiger.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/koch_curve.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/diamond1.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/diamond2.svg", "px", 96); - //svg = nsvgParseFromFile("/home/jp/yahweh-protosinaitic.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/WMD-biological.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/Skull_and_crossbones.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/IconAlerte.svg", "px", 96); - //svg = nsvgParseFromFile("/mnt/data/images/svg/Svg_example4.svg", "px", 96); - - //vkvg_scale(ctx, 3,3); - vkvg_set_source_rgba(ctx,0.0,0.0,0.0,1); - - for (shape = svg->shapes; shape != NULL; shape = shape->next) { - - vkvg_new_path(ctx); - - float o = shape->opacity; - - vkvg_set_line_width(ctx, shape->strokeWidth); - - for (path = shape->paths; path != NULL; path = path->next) { - float* p = path->pts; - vkvg_move_to(ctx, p[0],p[1]); - for (int i = 1; i < path->npts-2; i += 3) { - p = &path->pts[i*2]; - vkvg_curve_to(ctx, p[0],p[1], p[2],p[3], p[4],p[5]); - } - if (path->closed) - vkvg_close_path(ctx); - } - - if (shape->fill.type == NSVG_PAINT_COLOR) - svg_set_color(ctx, shape->fill.color, o); - else if (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT){ - NSVGgradient* g = shape->fill.gradient; - svg_set_color(ctx, g->stops[0].color, o); - } - - if (shape->fill.type != NSVG_PAINT_NONE){ - if (shape->stroke.type == NSVG_PAINT_NONE){ - vkvg_fill(ctx); - continue; - } - vkvg_fill_preserve (ctx); - } - - if (shape->stroke.type == NSVG_PAINT_COLOR) - svg_set_color(ctx, shape->stroke.color, o); - else if (shape->stroke.type == NSVG_PAINT_LINEAR_GRADIENT){ - NSVGgradient* g = shape->stroke.gradient; - svg_set_color(ctx, g->stops[0].color, o); - } - - vkvg_stroke(ctx); - } - - nsvgDelete(svg); - - - vkvg_destroy(ctx); -} -void test_1 () { - const char* text = "This is a petit test {}"; - - VkvgContext ctx = vkvg_create (surf); - - vkvg_set_source_rgba(ctx,0,0,0,1.0); - vkvg_paint (ctx); - vkvg_set_source_rgba(ctx,1,1,1,1.0); - - vkvg_select_font_face(ctx, "mono"); - vkvg_set_font_size(ctx, 12); - - vkvg_font_extents_t f = {}; - vkvg_font_extents(ctx, &f); - - vkvg_text_extents_t t = {}; - vkvg_text_extents(ctx, text, &t); - - vkvg_move_to(ctx,100,100); - vkvg_show_text(ctx, text); - - vkvg_move_to(ctx,100,100.5 - f.ascent); - vkvg_line_to(ctx,100+t.width,100.5 - f.ascent); - - vkvg_move_to(ctx,100,100.5 - f.descent); - vkvg_line_to(ctx,100+t.width,100.5 - f.descent); - - vkvg_stroke(ctx); - - vkvg_flush(ctx); - vkvg_destroy (ctx); -} -void test_painting () { - VkvgSurface surf2 = vkvg_surface_create (device,400,400);; - VkvgContext ctx = vkvg_create (surf2); - - vkvg_set_source_rgba(ctx,1.0,0.,0.,1.0); - vkvg_paint (ctx); - - vkvg_destroy (ctx); - ctx = vkvg_create (surf); - - vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0); - vkvg_paint (ctx); - - //vkvg_set_source_surface(ctx,surf2,0,0); - - //VkvgPattern pat = vkvg_get_source (ctx); - VkvgPattern pat = vkvg_pattern_create_for_surface(surf2); - vkvg_pattern_set_extend (pat,VKVG_EXTEND_REFLECT); - vkvg_set_source(ctx,pat); - //vkvg_paint (ctx); - //vkvg_set_source_rgba(ctx,0,1,0,1.0); - vkvg_rectangle(ctx,100,100,200,200); - vkvg_fill(ctx); - - vkvg_destroy (ctx); - vkvg_surface_destroy (surf2); - vkvg_pattern_destroy (pat); -} - -void simple_paint () { - VkvgContext ctx = vkvg_create(surf); - vkvg_set_source_rgba(ctx,1,0,0,1); - vkvg_paint(ctx); - vkvg_destroy(ctx); -} -void random_rectangles () { - vkvg_surface_clear(surf); - struct timeval currentTime; - gettimeofday(¤tTime, NULL); - - srand((unsigned) currentTime.tv_usec); - const float w = 1024.f; - - VkvgContext ctx = vkvg_create(surf); - vkvg_set_line_width(ctx,1); - for (int i=0; i<5000; i++) { - randomize_color(ctx); - float x = trunc( (0.5*(float)w*rand())/RAND_MAX ); - float y = trunc( (0.5*(float)w*rand())/RAND_MAX ); - float z = trunc( (0.5*(float)w*rand())/RAND_MAX ) + 1; - float v = trunc( (0.5*(float)w*rand())/RAND_MAX ) + 1; - - vkvg_rectangle(ctx, x+1, y+1, z, v); - vkvg_fill_preserve(ctx); - randomize_color(ctx); - vkvg_stroke(ctx); - } - vkvg_destroy(ctx); -} - -void simple_rectangle_fill () { - vkvg_surface_clear(surf); - VkvgContext ctx = vkvg_create(surf); - vkvg_set_line_width(ctx,10); - vkvg_set_source_rgba(ctx,0,0,1,0.5); - vkvg_rectangle(ctx,100,100,200,200); - vkvg_fill(ctx); - vkvg_rectangle(ctx,200,200,200,200); - vkvg_set_source_rgba(ctx,1,0,0,0.5); - vkvg_fill(ctx); - vkvg_destroy(ctx); -} -void simple_rectangle_stroke () { - VkvgContext ctx = vkvg_create(surf); - vkvg_clear(ctx); - vkvg_set_line_width(ctx,100.f); - vkvg_arc (ctx, 300, 300, 200, 0, M_PI*2.0); - vkvg_set_source_rgba(ctx,0,0,1,1); - vkvg_fill_preserve(ctx); - vkvg_set_source_rgba(ctx,1,0,1,1); - vkvg_stroke(ctx); - vkvg_destroy(ctx); -} -void lines_stroke () { - VkvgContext ctx = vkvg_create(surf); - vkvg_set_source_rgba(ctx,1,1,1,1); - vkvg_paint(ctx); - vkvg_set_source_rgba(ctx,0,0,0,0.9f); - vkvg_set_line_width(ctx,10.f); - vkvg_move_to(ctx,50,50); - vkvg_line_to(ctx,300,250); - vkvg_stroke(ctx); - vkvg_destroy(ctx); -} int main(int argc, char *argv[]) { - //dumpLayerExts(); - uint width=1024, height=768; - - vk_engine_t* e = vkengine_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_PRESENT_MODE_MAILBOX_KHR, width, height); - VkhPresenter r = e->renderer; - vkengine_set_key_callback (e, key_callback); - vkengine_set_mouse_but_callback(e, mouse_button_callback); - vkengine_set_cursor_pos_callback(e, mouse_move_callback); - vkengine_set_scroll_callback(e, scroll_callback); - - bool deferredResolve = false; - - device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_4_BIT, deferredResolve); - surf = vkvg_surface_create(device, width, height); - - //test_grad_transforms(); - //test_colinear(); - //simple_rectangle_stroke(); - - vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), width, height); - - struct timeval before , after; - double frameTime = 0, frameTimeAccum = 0, frameCount = 0; - - while (!vkengine_should_close (e)) { - glfwPollEvents(); - - gettimeofday(&before , NULL); - - //test_svg(); - cairo_tests(); - //random_rectangles(); - //simple_rectangle_stroke(); - //test_1(); - //vkvg_surface_clear(surf); - //simple_paint(); - - //simple_rectangle_fill(); - //test_img_surface(); - //multi_test1(); - //test_painting(); - //vkvg_surface_clear(surf); - //lines_stroke(); - if (deferredResolve) - vkvg_multisample_surface_resolve(surf); - if (!vkh_presenter_draw (r)) - vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), width, height); - - gettimeofday(&after , NULL); - - frameTimeAccum += time_diff(before , after); - frameCount++; - } - - frameTime = frameTimeAccum / frameCount; - printf ("frame (µs): %.0lf\nfps: %lf\n", frameTime, floor(1000000 / frameTime)); - - vkDeviceWaitIdle(e->dev->dev); - - vkvg_surface_destroy (surf); - vkvg_device_destroy (device); - - vkengine_destroy (e); + perform_test (cairo_tests, 1024, 768); return 0; } diff --git a/tests/text.c b/tests/text.c new file mode 100644 index 0000000..aad4afa --- /dev/null +++ b/tests/text.c @@ -0,0 +1,96 @@ +#include "test.h" + +void test(){ + VkvgContext ctx = vkvg_create(surf); + + vkvg_set_source_rgba(ctx,0.9,0.9,0.9,1); + vkvg_paint(ctx); + + int size = 19; + int penY = 50; + int penX = 10; + + /*vkvg_rectangle(ctx,30,0,100,400); + vkvg_clip(ctx);*/ + + //vkvg_select_font_face(ctx, "/usr/local/share/fonts/DroidSansMono.ttf"); + //vkvg_select_font_face(ctx, "/usr/share/fonts/truetype/unifont/unifont.ttf"); + + vkvg_set_font_size(ctx,12); + vkvg_select_font_face(ctx, "droid"); + vkvg_font_extents_t fe; + vkvg_font_extents (ctx,&fe); + vkvg_move_to(ctx, penX,penY); + vkvg_set_source_rgba(ctx,0.1,0.1,0.1,1); + vkvg_text_extents_t te; + vkvg_text_extents(ctx,"abcdefghijk",&te); + vkvg_show_text (ctx,"abcdefghijk"); + penX+= te.x_advance; + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"*abcdefghijk2"); + penY+=2*size; + + vkvg_select_font_face(ctx, "times"); + vkvg_set_source_rgba(ctx,0.1,0.1,0.2,1); + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"abcdefghijklmnopqrstuvwxyz"); + penY+=size; + + vkvg_select_font_face(ctx, "droid"); + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"lmnopqrstuvwxyz123456789"); + penY+=size; + + vkvg_select_font_face(ctx, "times:bold"); + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"abcdefghijklmnopqrstuvwxyz"); + penY+=size; + + vkvg_select_font_face(ctx, "droid"); + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + penY+=size; + + vkvg_select_font_face(ctx, "arial:italic"); + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"abcdefghijklmnopqrstuvwxyz"); + penY+=size; + + vkvg_select_font_face(ctx, "arial"); + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + penY+=size; + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"this is a test"); + penY+=size; + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"this is another test to see if label is working"); + penY+=size; + + vkvg_select_font_face(ctx, "mono"); + vkvg_move_to(ctx, penX,penY); + vkvg_show_text (ctx,"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + penY+=size; + + vkvg_move_to(ctx, 80,400); + vkvg_show_text (ctx,"Ленивый рыжий кот"); + + /*vkvg_move_to(ctx, 150,250); + vkvg_show_text (ctx,"test string é€"); + vkvg_move_to(ctx, 150,300); + vkvg_show_text (ctx,"كسول الزنجبيل القط"); + vkvg_move_to(ctx, 150,350); + vkvg_show_text (ctx,"懶惰的姜貓");*/ + + //vkvg_show_text (ctx,"ABCDABCD"); + //vkvg_show_text (ctx,"j"); + + vkvg_destroy(ctx); +} + +int main(int argc, char *argv[]) { + + perform_test (test, 1024, 768); + + return 0; +} -- 2.47.3