--- /dev/null
+/*
+ * Copyright (c) 2018 Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+ * Software, and to permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "vkengine.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"
+
+#include "vkvg_context_internal.h"
+#include <sys/time.h>
+
+VkvgDevice device;
+VkvgSurface surf = NULL;
+
+static float m_approximation_scale = 1.0;
+static float m_angle_tolerance = 0.07;
+static float m_distance_tolerance = 1.0;
+static float m_cusp_limit = 0.05;
+static float curve_recursion_limit = 10;
+static float curve_collinearity_epsilon = 1.68;
+static float curve_angle_tolerance_epsilon = 0.001;
+static double frameTime = 0;
+
+static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
+ if (action == GLFW_RELEASE)
+ return;
+ float step = 0.01;
+
+ if (mods & GLFW_MOD_SHIFT)
+ step = -step;
+ if (mods & GLFW_MOD_CONTROL)
+ step *= 0.1;
+ switch (key) {
+ case GLFW_KEY_F1:
+ m_angle_tolerance += step;
+ break;
+ case GLFW_KEY_F2:
+ m_distance_tolerance += step;
+ break;
+ case GLFW_KEY_F3:
+ m_cusp_limit += step;
+ break;
+ case GLFW_KEY_F4:
+ curve_recursion_limit += step * 1000.0;
+ break;
+ case GLFW_KEY_F6:
+ curve_collinearity_epsilon += step;
+ break;
+ case GLFW_KEY_F7:
+ curve_angle_tolerance_epsilon += step;
+ break;
+ 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){}
+static void mouse_button_callback(GLFWwindow* window, int but, int state, int modif){}
+
+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_set_line_width(ctx,20);
+ vkvg_move_to(ctx,100,100);
+ vkvg_rel_line_to(ctx,100,100);
+ vkvg_rel_line_to(ctx,100,-50);
+ 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_stroke(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, 400, 50);
+ vkvg_curve_to (ctx, 400, 50, 600,5,600,100);
+ vkvg_curve_to (ctx, 600, 5, 800,50,800,50);
+
+ vkvg_move_to (ctx, 400, 150);
+ vkvg_curve_to (ctx, 0, 0, 800, 0, 300, 350);
+ vkvg_curve_to (ctx, 500, 500, 300, 0, 500, 700);
+
+ //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,0.5);
+ 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_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, 0,0,0,0.5);
+ vkvg_stroke(ctx);
+
+ vkvg_arc(ctx, 150, 100, 100, 0, M_PI*2);
+ vkvg_fill(ctx);
+ vkvg_arc(ctx, 200, 200, 100, 0, M_PI*2);
+ vkvg_stroke(ctx);
+
+ vkvg_set_line_width(ctx, 90);
+ vkvg_arc(ctx, 120, 500, 100, 0, M_PI*2);
+ 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,50);
+ 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,0.5);
+ vkvg_set_line_width(ctx,30);
+
+ vkvg_move_to(ctx,100,100);
+ vkvg_line_to(ctx,100,200);
+ vkvg_line_to(ctx,100,300);
+ //vkvg_line_to(ctx,100,0);
+ 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.0);
+ vkvg_paint(ctx);
+
+ vkvg_test_fill(ctx);
+ vkvg_test_fill2(ctx);
+
+
+ //test_line_join(ctx);
+
+ //vkvg_test_clip(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_BILINEAR);
+ 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);
+}
+
+void cairo_test_fill_rule (VkvgContext cr){
+ vkvg_set_line_width (cr, 6);
+
+ //vkvg_scale(cr,3,3);
+ vkvg_set_source_rgba(cr,1,0,0,1);
+ vkvg_move_to(cr,50,150);
+ vkvg_rel_line_to(cr,50,70);
+ vkvg_rel_line_to(cr,50,0);
+ vkvg_rel_line_to(cr,50,-70);
+ vkvg_rel_line_to(cr,0,-60);
+ vkvg_rel_line_to(cr,-50,-30);
+ vkvg_rel_line_to(cr,-50,0);
+ vkvg_rel_line_to(cr,-50,30);
+ vkvg_close_path(cr);
+
+
+// vkvg_set_line_join(cr,VKVG_LINE_JOIN_ROUND);
+ vkvg_set_source_rgb (cr, 0, 0.7, 0);
+ vkvg_rectangle (cr, 12, 12, 232, 70);
+ //vkvg_stroke (cr);
+// vkvg_new_sub_path (cr);
+ vkvg_arc (cr, 64, 64, 40, 0, M_PI*2);
+ //vkvg_close_path(cr);
+
+ vkvg_new_sub_path (cr);
+ vkvg_arc_negative (cr, 192, 64, 40, 2*M_PI, 0);
+ //vkvg_close_path(cr);
+
+ //vkvg_rectangle (cr, 30, 30, 20, 200);
+ //vkvg_rectangle (cr, 130, 30, 20, 200);
+ //vkvg_set_fill_rule (cr, vkvg_FILL_RULE_EVEN_ODD);
+
+ vkvg_fill_preserve(cr);
+
+ vkvg_set_source_rgb (cr, 0, 0, 0);
+ vkvg_stroke (cr);
+}
+void cairo_test_text (VkvgContext cr) {
+ vkvg_text_extents_t extents;
+
+ const char *utf8 = "vkvg";
+ float x,y;
+
+ vkvg_select_font_face (cr, "times");
+ vkvg_set_font_size (cr, 100.0);
+ vkvg_text_extents (cr, utf8, &extents);
+ vkvg_set_source_rgb(cr,0,0,0);
+
+ x=25.0;
+ y=150.0;
+
+ vkvg_move_to (cr, x,y);
+ vkvg_show_text (cr, utf8);
+
+ /* draw helping lines */
+ vkvg_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
+ vkvg_set_line_width (cr, 6.0);
+ vkvg_arc (cr, x, y, 10.0, 0, 2*M_PI);
+ vkvg_fill (cr);
+ vkvg_move_to (cr, x,y);
+ vkvg_rel_line_to (cr, 0, -extents.height);
+ vkvg_rel_line_to (cr, extents.width, 0);
+ vkvg_rel_line_to (cr, extents.x_bearing, -extents.y_bearing);
+ vkvg_stroke (cr);
+}
+void cairo_test_clip (VkvgContext cr){
+ vkvg_arc (cr, 128.0, 128.0, 76.8, 0, 2 * M_PI);
+ vkvg_clip (cr);
+ //vkvg_new_path (cr); /* current path is not
+ // consumed by vkvg_clip() */
+ vkvg_set_source_rgba(cr, 0, 0, 0, 1);
+ vkvg_rectangle (cr, 0, 0, 256, 256);
+ vkvg_fill (cr);
+ vkvg_set_source_rgba (cr, 0, 1, 0, 1);
+ vkvg_move_to (cr, -100, -100);
+ vkvg_line_to (cr, 256, 256);
+ vkvg_move_to (cr, 356, -100);
+ vkvg_line_to (cr, 0, 256);
+ vkvg_set_line_width (cr, 10.0);
+ vkvg_stroke (cr);
+}
+void cairo_test_curves (VkvgContext cr){
+ float x=25.6, y=128.0;
+ float x1=102.4, y1=230.4,
+ x2=153.6, y2=25.6,
+ x3=230.4, y3=128.0;
+
+ vkvg_set_source_rgb (cr, 0, 0, 0);
+ vkvg_move_to (cr, x, y);
+ vkvg_curve_to (cr, x1, y1, x2, y2, x3, y3);
+
+ vkvg_set_line_width (cr, 10.0);
+ vkvg_stroke (cr);
+
+ vkvg_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
+ vkvg_set_line_width (cr, 6.0);
+ vkvg_move_to (cr,x,y); vkvg_line_to (cr,x1,y1);
+ vkvg_move_to (cr,x2,y2); vkvg_line_to (cr,x3,y3);
+ vkvg_stroke (cr);
+}
+void cairo_test_rounded_rect (VkvgContext cr) {
+ /* a custom shape that could be wrapped in a function */
+ float x0 = 25.6, /* parameters like vkvg_rectangle */
+ y0 = 25.6,
+ rect_width = 204.8,
+ rect_height = 204.8,
+ radius = 102.4; /* and an approximate curvature radius */
+
+ float x1,y1;
+
+ x1=x0+rect_width;
+ y1=y0+rect_height;
+ if (!rect_width || !rect_height)
+ return;
+ if (rect_width/2<radius) {
+ if (rect_height/2<radius) {
+ vkvg_move_to (cr, x0, (y0 + y1)/2);
+ vkvg_curve_to (cr, x0 ,y0, x0, y0, (x0 + x1)/2, y0);
+ vkvg_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1)/2);
+ vkvg_curve_to (cr, x1, y1, x1, y1, (x1 + x0)/2, y1);
+ vkvg_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1)/2);
+ } else {
+ vkvg_move_to (cr, x0, y0 + radius);
+ vkvg_curve_to (cr, x0 ,y0, x0, y0, (x0 + x1)/2, y0);
+ vkvg_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius);
+ vkvg_line_to (cr, x1 , y1 - radius);
+ vkvg_curve_to (cr, x1, y1, x1, y1, (x1 + x0)/2, y1);
+ vkvg_curve_to (cr, x0, y1, x0, y1, x0, y1- radius);
+ }
+ } else {
+ if (rect_height/2<radius) {
+ vkvg_move_to (cr, x0, (y0 + y1)/2);
+ vkvg_curve_to (cr, x0 , y0, x0 , y0, x0 + radius, y0);
+ vkvg_line_to (cr, x1 - radius, y0);
+ vkvg_curve_to (cr, x1, y0, x1, y0, x1, (y0 + y1)/2);
+ vkvg_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1);
+ vkvg_line_to (cr, x0 + radius, y1);
+ vkvg_curve_to (cr, x0, y1, x0, y1, x0, (y0 + y1)/2);
+ } else {
+ vkvg_move_to (cr, x0, y0 + radius);
+ vkvg_curve_to (cr, x0 , y0, x0 , y0, x0 + radius, y0);
+ vkvg_line_to (cr, x1 - radius, y0);
+ vkvg_curve_to (cr, x1, y0, x1, y0, x1, y0 + radius);
+ vkvg_line_to (cr, x1 , y1 - radius);
+ vkvg_curve_to (cr, x1, y1, x1, y1, x1 - radius, y1);
+ vkvg_line_to (cr, x0 + radius, y1);
+ vkvg_curve_to (cr, x0, y1, x0, y1, x0, y1- radius);
+ }
+ }
+ vkvg_close_path (cr);
+
+ vkvg_set_source_rgb (cr, 0.5, 0.5, 1);
+ vkvg_fill_preserve (cr);
+ vkvg_set_source_rgba (cr, 0.5, 0, 0, 0.5);
+ vkvg_set_line_width (cr, 10.0);
+ vkvg_stroke (cr);
+}
+void cairo_test_fill_and_stroke2 (VkvgContext cr){
+ vkvg_move_to (cr, 128.0, 25.6);
+ vkvg_line_to (cr, 230.4, 230.4);
+ vkvg_rel_line_to (cr, -102.4, 0.0);
+ vkvg_curve_to (cr, 51.2, 230.4, 51.2, 128.0, 128.0, 128.0);
+ vkvg_close_path (cr);
+
+ vkvg_move_to (cr, 64.0, 25.6);
+ vkvg_rel_line_to (cr, 51.2, 51.2);
+ vkvg_rel_line_to (cr, -51.2, 51.2);
+ vkvg_rel_line_to (cr, -51.2, -51.2);
+ vkvg_close_path (cr);
+
+ /*vkvg_translate(cr,100,100);
+ vkvg_move_to (cr, 100, 100);
+ vkvg_line_to(cr,300,300);
+ vkvg_line_to(cr,100,300);*/
+
+
+ vkvg_set_line_width (cr, 10.0);
+ vkvg_set_source_rgb (cr, 0, 0, 1);
+ vkvg_fill_preserve (cr);
+ vkvg_set_source_rgb (cr, 0, 0, 0);
+ vkvg_stroke (cr);
+}
+void cairo_print_arc_neg (VkvgContext cr){
+ float xc = 128.0;
+ float yc = 128.0;
+ float radius = 100.0;
+ float angle1 = 45.0 * (M_PI/180.0); /* angles are specified */
+ float angle2 = 180.0 * (M_PI/180.0); /* in radians */
+
+ vkvg_set_source_rgba(cr, 0, 0, 0, 1);
+ vkvg_set_line_width (cr, 10.0);
+ vkvg_arc_negative (cr, xc, yc, radius, angle1, angle2);
+ vkvg_stroke (cr);
+
+ /* draw helping lines */
+ vkvg_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
+ vkvg_set_line_width (cr, 6.0);
+
+ vkvg_arc (cr, xc, yc, 10.0, 0, 2*M_PI);
+ vkvg_fill (cr);
+
+ vkvg_arc (cr, xc, yc, radius, angle1, angle1);
+ vkvg_line_to (cr, xc, yc);
+ vkvg_arc (cr, xc, yc, radius, angle2, angle2);
+ //vkvg_line_to (cr, xc, yc);
+ vkvg_stroke (cr);
+
+}
+void cairo_test_line_caps (VkvgContext cr) {
+ vkvg_set_source_rgb (cr, 0, 0, 0);
+ vkvg_set_line_width (cr, 30.0);
+ vkvg_set_line_cap (cr, VKVG_LINE_CAP_BUTT); /* default */
+ vkvg_move_to (cr, 64.0, 50.0); vkvg_line_to (cr, 64.0, 200.0);
+ vkvg_stroke (cr);
+ vkvg_set_line_cap (cr, VKVG_LINE_CAP_ROUND);
+ vkvg_move_to (cr, 128.0, 50.0); vkvg_line_to (cr, 128.0, 200.0);
+ vkvg_stroke (cr);
+ vkvg_set_line_cap (cr, VKVG_LINE_CAP_SQUARE);
+ vkvg_move_to (cr, 192.0, 50.0); vkvg_line_to (cr, 192.0, 200.0);
+ vkvg_stroke (cr);
+
+ /* draw helping lines */
+ vkvg_set_source_rgb (cr, 1, 0.2, 0.2);
+ vkvg_set_line_width (cr, 2.56);
+ vkvg_move_to (cr, 64.0, 50.0); vkvg_line_to (cr, 64.0, 200.0);
+ vkvg_move_to (cr, 128.0, 50.0); vkvg_line_to (cr, 128.0, 200.0);
+ vkvg_move_to (cr, 192.0, 50.0); vkvg_line_to (cr, 192.0, 200.0);
+ vkvg_stroke (cr);
+}
+void cairo_test_line_joins (VkvgContext cr) {
+ vkvg_set_source_rgb (cr, 0, 0, 0);
+ vkvg_set_line_width (cr, 40.96);
+ vkvg_move_to (cr, 76.8, 84.48);
+ vkvg_rel_line_to (cr, 51.2, -51.2);
+ vkvg_rel_line_to (cr, 51.2, 51.2);
+ vkvg_set_line_join (cr, VKVG_LINE_JOIN_MITER); /* default */
+ vkvg_stroke (cr);
+
+ vkvg_move_to (cr, 76.8, 161.28);
+ vkvg_rel_line_to (cr, 51.2, -51.2);
+ vkvg_rel_line_to (cr, 51.2, 51.2);
+ vkvg_set_line_join (cr, VKVG_LINE_JOIN_BEVEL);
+ vkvg_stroke (cr);
+
+ vkvg_move_to (cr, 76.8, 238.08);
+ vkvg_rel_line_to (cr, 51.2, -51.2);
+ vkvg_rel_line_to (cr, 51.2, 51.2);
+ vkvg_set_line_join (cr, VKVG_LINE_JOIN_ROUND);
+ vkvg_stroke (cr);
+}
+void cairo_print_arc (VkvgContext cr) {
+ float xc = 128.0;
+ float yc = 128.0;
+ float radius = 100.0;
+ float angle1 = 45.0 * (M_PI/180.0); /* angles are specified */
+ float angle2 = 180.0 * (M_PI/180.0); /* in radians */
+
+ vkvg_set_source_rgba(cr, 0, 0, 0, 1);
+ vkvg_set_line_width (cr, 10.0);
+ vkvg_arc (cr, xc, yc, radius, angle1, angle2);
+ vkvg_stroke (cr);
+
+ /* draw helping lines */
+ vkvg_set_source_rgba(cr, 1, 0.2, 0.2, 0.6);
+ vkvg_set_line_width (cr, 6.0);
+
+ vkvg_arc (cr, xc, yc, 10.0, 0, 2*M_PI);
+ vkvg_fill (cr);
+
+ vkvg_arc (cr, xc, yc, radius, angle1, angle1);
+ vkvg_line_to (cr, xc, yc);
+ vkvg_arc (cr, xc, yc, radius, angle2, angle2);
+ vkvg_stroke (cr);
+}
+static float rotation = 0.f;
+void cairo_tests () {
+ 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,0.7,0.7,0.7,1);
+ vkvg_paint(ctx);
+
+ vkvg_set_matrix(ctx,&mat);
+ /*
+ vkvg_set_source_rgba(ctx,0,1,0,1);
+ vkvg_rectangle(ctx,0,0,600,600);
+ vkvg_fill(ctx);
+
+ vkvg_clip(ctx);
+
+ vkvg_set_source_rgba(ctx,1,0,0,1);
+ vkvg_paint(ctx);
+ //vkvg_rectangle(ctx,00,00,1024,800);
+ //vkvg_fill(ctx);
+
+ vkvg_reset_clip(ctx);
+ vkvg_set_source_rgba(ctx,0,0,1,1);
+ vkvg_set_line_width(ctx,20);
+ vkvg_move_to(ctx,0,0);
+ vkvg_rel_line_to(ctx,800,800);
+ vkvg_stroke(ctx);*/
+
+// cairo_test_clip(ctx);
+// vkvg_reset_clip(ctx);
+ //test_img_surface (ctx);
+
+ cairo_print_arc(ctx);
+
+ vkvg_translate(ctx,200,0);
+ cairo_test_fill_rule(ctx);
+
+ vkvg_translate(ctx,250,0);
+ cairo_test_rounded_rect(ctx);
+
+
+/*
+ vkvg_set_operator(ctx, VKVG_OPERATOR_CLEAR);
+ vkvg_rectangle(ctx,100,100,500,500);
+ vkvg_fill(ctx);
+ vkvg_set_operator(ctx, VKVG_OPERATOR_OVER);
+*/
+
+
+ vkvg_translate(ctx,-450,250);
+ cairo_test_fill_and_stroke2(ctx);
+
+ vkvg_translate(ctx,250,0);
+ cairo_print_arc_neg(ctx);
+
+ vkvg_translate(ctx,250,0);
+ cairo_test_text(ctx);
+
+ vkvg_translate(ctx,-500,250);
+ cairo_test_curves(ctx);
+
+ vkvg_translate(ctx,250,0);
+ cairo_test_line_joins(ctx);
+
+ vkvg_translate(ctx,250,0);
+ cairo_test_line_caps(ctx);
+
+ 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 (VkvgContext ctx) {
+ //VkvgContext ctx = vkvg_create(surf);
+ vkvg_set_source_rgba(ctx,0.5,0.5,0.5,1);
+ vkvg_paint(ctx);
+
+ 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 print_float (VkvgContext ctx){
+ char str[50];
+ float penY = 20, penX = 10, dy = 18;
+
+ vkvg_set_source_rgb(ctx,1,1,1);
+ vkvg_set_font_size(ctx,14 );
+ vkvg_select_font_face(ctx, "mono");
+
+ sprintf (str, "frame (µs): %.0lf", frameTime);
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+ penY += dy;
+ sprintf (str, "fps: %lf", floor(1000000 / frameTime));
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+ penY += dy;
+ sprintf (str, "Angle tol: %f", ctx->m_angle_tolerance);
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+ penY += dy;
+ sprintf (str, "Dist tol: %f", ctx->m_distance_tolerance);
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+ penY += dy;
+ sprintf (str, "Cups lim: %f", ctx->m_cusp_limit);
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+ penY += dy;
+ sprintf (str, "Recurs lim: %f", ctx->curve_recursion_limit);
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+ penY += dy;
+ sprintf (str, "Colinear €: %f", ctx->curve_collinearity_epsilon);
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+ penY += dy;
+ sprintf (str, "Angle tol €: %f", ctx->curve_angle_tolerance_epsilon);
+ vkvg_move_to(ctx,penX,penY);
+ vkvg_show_text(ctx, str);
+}
+
+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 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 simple_rectangle_fill () {
+ VkvgContext ctx = vkvg_create(surf);
+ vkvg_set_source_rgba(ctx,0,1,0,1);
+ vkvg_rectangle(ctx,100,100,200,200);
+ vkvg_fill(ctx);
+ vkvg_destroy(ctx);
+}
+void simple_rectangle_stroke () {
+ VkvgContext ctx = vkvg_create(surf);
+ vkvg_set_source_rgba(ctx,0,0,1,1);
+ vkvg_set_line_width(ctx,10.f);
+ vkvg_rectangle(ctx,100,100,200,200);
+ vkvg_stroke(ctx);
+ vkvg_destroy(ctx);
+}
+int main(int argc, char *argv[]) {
+
+ //dumpLayerExts();
+
+ vk_engine_t* e = vkengine_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, 1024, 800);
+ VkhPresenter r = e->renderer;
+ vkengine_set_key_callback (e, key_callback);
+
+ device = vkvg_device_create (r->dev->phy, r->dev->dev, r->qFam, 0);
+ surf = vkvg_surface_create(device, 1024, 800);
+
+ //test_svg();
+ //
+
+
+ //test_grad_transforms();
+ //cairo_tests();
+ //test_colinear();
+
+ vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf));
+
+ /*
+ while (!vkengine_should_close (e)) {
+ glfwPollEvents();
+ //test_1();
+ cairo_tests();
+ //simple_paint();
+ //simple_rectangle_stroke();
+ //simple_rectangle_fill();
+ //test_img_surface();
+ //multi_test1();
+ //test_painting();
+ if (!vkh_presenter_draw (r))
+ vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf));
+ }
+ */
+ struct timeval before , after;
+
+
+ while (!vkengine_should_close (e)) {
+
+
+ VkvgContext ctx = vkvg_create(surf);
+
+ gettimeofday(&before , NULL);
+
+ vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0);
+ vkvg_paint(ctx);
+
+ ctx->m_angle_tolerance = m_angle_tolerance;
+ ctx->m_distance_tolerance = m_distance_tolerance;
+ ctx->m_cusp_limit = m_cusp_limit;
+ ctx->curve_recursion_limit = curve_recursion_limit;
+ ctx->curve_angle_tolerance_epsilon = curve_angle_tolerance_epsilon;
+ ctx->curve_collinearity_epsilon = curve_collinearity_epsilon;
+
+ //vkvg_test_curves(ctx);
+ //vkvg_test_curves2(ctx);
+ test_svg(ctx);
+
+
+ print_float(ctx);
+
+ gettimeofday(&after , NULL);
+
+ vkvg_destroy(ctx);
+
+ glfwPollEvents();
+ if (!vkh_presenter_draw (r))
+ vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf));
+
+ frameTime = time_diff(before , after);
+ }
+
+ vkDeviceWaitIdle(e->dev->dev);
+
+ vkvg_surface_destroy (surf);
+ vkvg_device_destroy (device);
+
+ vkengine_destroy (e);
+
+ return 0;
+}