From af7b2bafbdbe36758026bdd14bfabd5a702b0be5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Wed, 25 Apr 2018 04:42:36 +0200 Subject: [PATCH] simplify path handling, prevent closing on same position, other debug --- include/vkvg.h | 1 + src/vectors.c | 4 +- src/vkvg_context.c | 156 +++++++++++++----------------- src/vkvg_context_internal.c | 70 ++++++-------- src/vkvg_context_internal.h | 20 ++-- src/vkvg_fonts.c | 8 +- src/vkvg_surface.c | 1 + tests/test1.c | 188 +++++++++++++++++++++++++----------- 8 files changed, 247 insertions(+), 201 deletions(-) diff --git a/include/vkvg.h b/include/vkvg.h index cf2f9e9..7822a35 100644 --- a/include/vkvg.h +++ b/include/vkvg.h @@ -145,6 +145,7 @@ void vkvg_destroy (VkvgContext ctx); void vkvg_flush (VkvgContext ctx); void vkvg_close_path (VkvgContext ctx); +void vkvg_new_sub_path (VkvgContext ctx); void vkvg_line_to (VkvgContext ctx, float x, float y); void vkvg_rel_line_to (VkvgContext ctx, float x, float y); void vkvg_move_to (VkvgContext ctx, float x, float y); diff --git a/src/vectors.c b/src/vectors.c index 018795d..236ce45 100644 --- a/src/vectors.c +++ b/src/vectors.c @@ -22,6 +22,8 @@ #include "vectors.h" +#define ROUNDF(f, c) (((float)((int)((f) * (c))) / (c))) + inline vec2 vec2_create (float x, float y) { vec2 v = {x,y}; return v; @@ -98,7 +100,7 @@ vec2d vec2d_sub (vec2d a, vec2d b){ return r; } bool vec2_equ (vec2 a, vec2 b){ - if ((a.x == b.x) && (a.y == b.y)) + if ((ROUNDF(a.x,10000) == ROUNDF(b.x,10000)) && (ROUNDF(a.y,10000) == ROUNDF(b.y,10000))) return true; return false; } diff --git a/src/vkvg_context.c b/src/vkvg_context.c index 1476c89..2766e8d 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -40,7 +40,6 @@ VkvgContext vkvg_create(VkvgSurface surf) ctx->sizeVertices = VKVG_VBO_SIZE; ctx->sizeIndices = VKVG_IBO_SIZE; ctx->sizePathes = VKVG_PATHES_SIZE; - ctx->curPos.x = ctx->curPos.y = 0; ctx->lineWidth = 1; ctx->pSurf = surf; @@ -158,39 +157,37 @@ void vkvg_destroy (VkvgContext ctx) free(ctx); } - +void vkvg_new_sub_path (VkvgContext ctx){ + _finish_path(ctx); +} void vkvg_close_path (VkvgContext ctx){ - if (ctx->pathPtr % 2 == 0)//current path is empty + if (_current_path_is_empty(ctx)) return; //check if at least 3 points are present if (ctx->pointCount - ctx->pathes [ctx->pathPtr-1] > 2){ //set end idx of path to the same as start idx ctx->pathes[ctx->pathPtr] = ctx->pathes [ctx->pathPtr-1]; //if last point of path is same pos as first point, remove it - if (vec2_equ(ctx->points[ctx->pointCount-1], ctx->points[ctx->pathes[ctx->pathPtr]])) - ctx->pointCount--; - //start new path + //if (vec2_equ(ctx->points[ctx->pointCount-1], ctx->points[ctx->pathes[ctx->pathPtr]])) + // ctx->pointCount--; _check_pathes_array(ctx); ctx->pathPtr++; - } + }else + _finish_path(ctx); } void vkvg_rel_line_to (VkvgContext ctx, float x, float y){ - vkvg_line_to(ctx, ctx->curPos.x + x, ctx->curPos.y + y); + vec2 cp = _get_current_position(ctx); + vkvg_line_to(ctx, cp.x + x, cp.y + y); } void vkvg_line_to (VkvgContext ctx, float x, float y) { vec2 p = {x,y}; - if (ctx->curPosExists){ - if (vec2_equ(ctx->curPos,p)) - return; - if (_current_path_is_empty (ctx)){ - _start_sub_path (ctx); - _add_curpos(ctx); - } - - _add_point_cp_update(ctx, x, y); - }else + if (_current_path_is_empty(ctx)) vkvg_move_to(ctx, x,y); + else if (vec2_equ(_get_current_position(ctx),p)) + return; + + _add_point(ctx,x,y); } void vkvg_arc (VkvgContext ctx, float xc, float yc, float radius, float a1, float a2){ @@ -202,22 +199,20 @@ void vkvg_arc (VkvgContext ctx, float xc, float yc, float radius, float a1, floa float step = M_PI/radius; float a = a1; - if (ctx->curPosExists){ + if (_current_path_is_empty(ctx)) + vkvg_move_to(ctx, v.x, v.y); + else vkvg_line_to(ctx, v.x, v.y); - a+=step; - }else - _set_current_point(ctx, v); + + a+=step; if (a2 == a1) return; - if (_current_path_is_empty (ctx)) - _start_sub_path (ctx); - while(a < a2){ v.x = cos(a)*radius + xc; v.y = sin(a)*radius + yc; - _add_point (ctx,v.x,v.y); + _add_point (ctx, v.x, v.y); a+=step; } @@ -225,10 +220,8 @@ void vkvg_arc (VkvgContext ctx, float xc, float yc, float radius, float a1, floa vec2 lastP = v; v.x = cos(a)*radius + xc; v.y = sin(a)*radius + yc; - if (vec2_equ (v,lastP)) - _set_current_point(ctx, v); - else - _add_point_cp_update(ctx,v.x,v.y); + if (!vec2_equ (v,lastP))//this test should not be required + _add_point (ctx, v.x, v.y); } void vkvg_arc_negative (VkvgContext ctx, float xc, float yc, float radius, float a1, float a2) { while (a2 > a1) @@ -239,17 +232,16 @@ void vkvg_arc_negative (VkvgContext ctx, float xc, float yc, float radius, float float step = M_PI/radius; float a = a1; - if (ctx->curPosExists){ + if (_current_path_is_empty(ctx)) + vkvg_move_to(ctx, v.x, v.y); + else { vkvg_line_to(ctx, v.x, v.y); - a+=step; - }else - _set_current_point(ctx, v); + } - if (a2 == a1) - return; + a-=step; - if (_current_path_is_empty (ctx)) - _start_sub_path (ctx); + if (a2 == a1)//double check if this test should not be in the previous if + return; while(a > a2){ v.x = cos(a)*radius + xc; @@ -262,59 +254,41 @@ void vkvg_arc_negative (VkvgContext ctx, float xc, float yc, float radius, float vec2 lastP = v; v.x = cos(a)*radius + xc; v.y = sin(a)*radius + yc; - if (vec2_equ (v,lastP)) - _set_current_point(ctx, v); - else - _add_point_cp_update(ctx,v.x,v.y); + //if (!vec2_equ (v,lastP)) + _add_point (ctx, v.x, v.y); } void vkvg_rel_move_to (VkvgContext ctx, float x, float y) { - vkvg_move_to(ctx, ctx->curPos.x + x, ctx->curPos.y + y); + vec2 cp = _get_current_position(ctx); + vkvg_move_to(ctx, cp.x + x, cp.y + y); } void vkvg_move_to (VkvgContext ctx, float x, float y) { _finish_path(ctx); - - ctx->curPos.x = x; - ctx->curPos.y = y; - ctx->curPosExists = true; + _start_sub_path(ctx, x, y); } void vkvg_curve_to (VkvgContext ctx, float x1, float y1, float x2, float y2, float x3, float y3) { - vec2 p = ctx->curPos; - vec2 p1 = {x1,y1}; - - if (_current_path_is_empty(ctx)){ - _start_sub_path(ctx); - if (!ctx->curPosExists) - p = p1; - if (!vec2_equ (p,p1)) - _add_point (ctx, p.x, p.y); - } + if (_current_path_is_empty(ctx)) + vkvg_move_to(ctx, x1, y1); - _recursive_bezier (ctx, p.x, p.y, x1, y1, x2, y2, x3, y3, 0); - _add_point_cp_update (ctx, x3, y3); + vec2 cp = _get_current_position(ctx); + _recursive_bezier (ctx, cp.x, cp.y, x1, y1, x2, y2, x3, y3, 0); + _add_point(ctx,x3,y3); } void vkvg_rel_curve_to (VkvgContext ctx, float x1, float y1, float x2, float y2, float x3, float y3) { - vkvg_curve_to (ctx, ctx->curPos.x + x1, ctx->curPos.y + y1, ctx->curPos.x + x2, ctx->curPos.y + y2, ctx->curPos.x + x3, ctx->curPos.y + y3); + vec2 cp = _get_current_position(ctx); + vkvg_curve_to (ctx, cp.x + x1, cp.y + y1, cp.x + x2, cp.y + y2, cp.x + x3, cp.y + y3); } void vkvg_rectangle (VkvgContext ctx, float x, float y, float w, float h){ _finish_path (ctx); - //set start to current idx in point array - ctx->pathes[ctx->pathPtr] = ctx->pointCount; - _check_pathes_array(ctx); - ctx->pathPtr++; - - _add_point (ctx, x, y); + _start_sub_path(ctx, x, y); _add_point (ctx, x + w, y); _add_point (ctx, x + w, y + h); _add_point (ctx, x, y + h); vkvg_close_path (ctx); - - ctx->curPos.x = x; - ctx->curPos.y = y; } void vkvg_clip_preserve (VkvgContext ctx){ vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineClipping); @@ -335,11 +309,20 @@ void vkvg_clip (VkvgContext ctx){ vkvg_clip_preserve(ctx); _clear_path(ctx); } +void vkvg_stroke (VkvgContext ctx) +{ + vkvg_stroke_preserve(ctx); + _clear_path(ctx); +} +void vkvg_fill (VkvgContext ctx){ + vkvg_fill_preserve(ctx); + _clear_path(ctx); +} void vkvg_fill_preserve (VkvgContext ctx){ if (ctx->pathPtr == 0) //nothing to fill return; - if (ctx->pathPtr % 2 != 0) //current path is not finished, close it - vkvg_close_path(ctx); + _finish_path(ctx); + if (ctx->pointCount * 4 > ctx->sizeIndices - ctx->indCount)//flush if vk buff is full vkvg_flush(ctx); @@ -351,7 +334,6 @@ void vkvg_fill_preserve (VkvgContext ctx){ while (ptrPath < ctx->pathPtr){ if (!_path_is_closed(ctx, ptrPath)) - //close path ctx->pathes[ptrPath+1] = ctx->pathes[ptrPath]; uint32_t firstPtIdx = ctx->pathes[ptrPath]; @@ -365,7 +347,7 @@ void vkvg_fill_preserve (VkvgContext ctx){ _add_vertex(ctx, v); } - vkCmdDraw (ctx->cmd,pathPointCount,1,firstVertIdx,0); + vkCmdDraw (ctx->cmd, pathPointCount, 1, firstVertIdx ,0); ptrPath+=2; } @@ -375,16 +357,12 @@ void vkvg_fill_preserve (VkvgContext ctx){ vkCmdDrawIndexed (ctx->cmd,6,1,0,0,0); vkCmdSetStencilReference(ctx->cmd,VK_STENCIL_FRONT_AND_BACK, 0x0); } -void vkvg_fill (VkvgContext ctx){ - vkvg_fill_preserve(ctx); - _clear_path(ctx); -} void vkvg_stroke_preserve (VkvgContext ctx) { - _finish_path(ctx); - if (ctx->pathPtr == 0)//nothing to stroke return; + _finish_path(ctx); + if (ctx->pointCount * 4 > ctx->sizeIndices - ctx->indCount) vkvg_flush(ctx); @@ -398,9 +376,14 @@ void vkvg_stroke_preserve (VkvgContext ctx) while (ptrPath < ctx->pathPtr){ uint32_t firstIdx = ctx->vertCount; + i = ctx->pathes[ptrPath]; if (_path_is_closed(ctx,ptrPath)){ lastPathPointIdx = _get_last_point_of_closed_path(ctx,ptrPath); + //prevent closing on the same position, this could be generalize + //to prevent processing of two consecutive point at the same position + if (vec2_equ(ctx->points[i], ctx->points[lastPathPointIdx])) + lastPathPointIdx--; iL = lastPathPointIdx; }else{ lastPathPointIdx = ctx->pathes[ptrPath+1]; @@ -436,6 +419,7 @@ void vkvg_stroke_preserve (VkvgContext ctx) _add_vertex(ctx, v); v.pos = vec2_sub(p0, vhw); _add_vertex(ctx, v); + _add_tri_indices_for_rect(ctx, firstIdx); iL = i++; @@ -497,11 +481,6 @@ void vkvg_stroke_preserve (VkvgContext ctx) } _record_draw_cmd(ctx); } -void vkvg_stroke (VkvgContext ctx) -{ - vkvg_stroke_preserve(ctx); - _clear_path(ctx); -} void _vkvg_fill_rectangle (VkvgContext ctx, float x, float y, float width, float height){ Vertex v[4] = { @@ -517,8 +496,9 @@ void _vkvg_fill_rectangle (VkvgContext ctx, float x, float y, float width, float _add_tri_indices_for_rect(ctx, firstIdx); } void vkvg_paint (VkvgContext ctx){ - _vkvg_fill_rectangle (ctx, 0, 0, ctx->pSurf->width, ctx->pSurf->height); - _record_draw_cmd(ctx); +// _vkvg_fill_rectangle (ctx, 0, 0, ctx->pSurf->width, ctx->pSurf->height); +// _record_draw_cmd(ctx); + vkCmdDrawIndexed (ctx->cmd,6,1,0,0,0); } inline void vkvg_set_source_rgb (VkvgContext ctx, float r, float g, float b) { @@ -677,8 +657,6 @@ void vkvg_save (VkvgContext ctx){ sav->pathes = (uint32_t*)malloc (sav->pathPtr * sizeof(uint32_t)); memcpy (sav->pathes, ctx->pathes, sav->pathPtr * sizeof(uint32_t)); - sav->curPos = ctx->curPos; - sav->curPosExists=ctx->curPosExists; sav->curRGBA = ctx->curRGBA; sav->lineWidth = ctx->lineWidth; sav->lineCap = ctx->lineCap; @@ -744,8 +722,6 @@ void vkvg_restore (VkvgContext ctx){ memset (ctx->pathes, 0, ctx->sizePathes * sizeof(uint32_t)); memcpy (ctx->pathes, sav->pathes, ctx->pathPtr * sizeof(uint32_t)); - ctx->curPos = sav->curPos; - ctx->curPosExists=sav->curPosExists; ctx->curRGBA = sav->curRGBA; ctx->lineWidth = sav->lineWidth; ctx->lineCap = sav->lineCap; diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index b2a0f55..7e9fe34 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -41,39 +41,50 @@ void _check_pathes_array (VkvgContext ctx){ ctx->sizePathes += VKVG_PATHES_SIZE; ctx->pathes = (uint32_t*) realloc (ctx->pathes, ctx->sizePathes*sizeof(uint32_t)); } +//when empty, ptr is even, else it's odd +//when empty, no current point is defined. inline bool _current_path_is_empty (VkvgContext ctx) { return ctx->pathPtr % 2 == 0; } +//this function expect that current point exists +inline vec2 _get_current_position (VkvgContext ctx) { + return ctx->points[ctx->pointCount-1]; +} //this function expect that current path is empty -void _start_sub_path (VkvgContext ctx) { +void _start_sub_path (VkvgContext ctx, float x, float y) { //set start to current idx in point array ctx->pathes[ctx->pathPtr] = ctx->pointCount; + _add_point(ctx, x, y); _check_pathes_array(ctx); ctx->pathPtr++; } -void _add_point (VkvgContext ctx, float x, float y){ - vec2 v = {x,y}; - ctx->points[ctx->pointCount] = v; - ctx->pointCount++; +void _finish_path (VkvgContext ctx){ + if (_current_path_is_empty(ctx)) + return; + //set end index of current path to last point in points array + ctx->pathes[ctx->pathPtr] = ctx->pointCount - 1; + _check_pathes_array(ctx); + ctx->pathPtr++; } -inline void _set_current_point (VkvgContext ctx, vec2 cp) { - ctx->curPos = cp; - ctx->curPosExists = true; +void _clear_path (VkvgContext ctx){ + ctx->pathPtr = 0; + ctx->pointCount = 0; } -void _add_point_cp_update(VkvgContext ctx, float x, float y){ - ctx->curPos.x = x; - ctx->curPos.y = y; - ctx->curPosExists = true; - ctx->points[ctx->pointCount] = ctx->curPos; - ctx->pointCount++; +inline bool _path_is_closed (VkvgContext ctx, uint32_t ptrPath){ + return (ctx->pathes[ptrPath] == ctx->pathes[ptrPath+1]); } -void _add_point_v2(VkvgContext ctx, vec2 v){ - ctx->curPos = v; - ctx->points[ctx->pointCount] = ctx->curPos; +uint32_t _get_last_point_of_closed_path(VkvgContext ctx, uint32_t ptrPath){ + if (ptrPath+2 < ctx->pathPtr) //this is not the last path + return ctx->pathes[ptrPath+2]-1; //last p is p prior to first idx of next path + return ctx->pointCount-1; //last point of path is last point of point array +} +void _add_point (VkvgContext ctx, float x, float y){ + vec2 v = {x,y}; + ctx->points[ctx->pointCount] = v; ctx->pointCount++; } -void _add_curpos (VkvgContext ctx){ - ctx->points[ctx->pointCount] = ctx->curPos; +void _add_point_vec2(VkvgContext ctx, vec2 v){ + ctx->points[ctx->pointCount] = v; ctx->pointCount++; } float _normalizeAngle(float a) @@ -236,27 +247,6 @@ inline void _update_push_constants (VkvgContext ctx) { VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(push_constants),&ctx->pushConsts); } -void _finish_path (VkvgContext ctx){ - if (ctx->pathPtr % 2 == 0)//current path is empty - return; - //set end index of current path to last point in points array - ctx->pathes[ctx->pathPtr] = ctx->pointCount - 1; - _check_pathes_array(ctx); - ctx->pathPtr++; -} -void _clear_path (VkvgContext ctx){ - ctx->pathPtr = 0; - ctx->pointCount = 0; - ctx->curPosExists = false; -} -inline bool _path_is_closed (VkvgContext ctx, uint32_t ptrPath){ - return (ctx->pathes[ptrPath] == ctx->pathes[ptrPath+1]); -} -uint32_t _get_last_point_of_closed_path(VkvgContext ctx, uint32_t ptrPath){ - if (ptrPath+2 < ctx->pathPtr) //this is not the last path - return ctx->pathes[ptrPath+2]-1; //last p is p prior to first idx of next path - return ctx->pointCount-1; //last point of path is last point of point array -} void _update_descriptor_set (VkvgContext ctx, VkhImage img, VkDescriptorSet ds){ VkDescriptorImageInfo descSrcTex = vkh_image_get_descriptor (img, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); VkWriteDescriptorSet writeDescriptorSet = { diff --git a/src/vkvg_context_internal.h b/src/vkvg_context_internal.h index f3abb74..995dcf7 100644 --- a/src/vkvg_context_internal.h +++ b/src/vkvg_context_internal.h @@ -131,8 +131,6 @@ typedef struct _vkvg_context_t { uint32_t* pathes; size_t sizePathes; - vec2 curPos; //current position handling - bool curPosExists; vec4 curRGBA; //is store in pushConsts => may be removed. float lineWidth; @@ -149,15 +147,18 @@ typedef struct _vkvg_context_t { }vkvg_context; bool _current_path_is_empty (VkvgContext ctx); -void _start_sub_path (VkvgContext ctx); +void _start_sub_path (VkvgContext ctx, float x, float y); void _check_pathes_array (VkvgContext ctx); +void _finish_path (VkvgContext ctx); +void _clear_path (VkvgContext ctx); +bool _path_is_closed (VkvgContext ctx, uint32_t ptrPath); +uint32_t _get_last_point_of_closed_path (VkvgContext ctx, uint32_t ptrPath); + float _normalizeAngle (float a); -void _set_current_point (VkvgContext ctx, vec2 cp); +vec2 _get_current_position (VkvgContext ctx); void _add_point (VkvgContext ctx, float x, float y); -void _add_point_cp_update (VkvgContext ctx, float x, float y); -void _add_point_v2 (VkvgContext ctx, vec2 v); -void _add_curpos (VkvgContext ctx); +void _add_point_vec2 (VkvgContext ctx, vec2 v); void _vkvg_fill_rectangle (VkvgContext ctx, float x, float y, float width, float height); void _create_vertices_buff (VkvgContext ctx); @@ -177,11 +178,6 @@ void _submit_ctx_cmd (VkvgContext ctx); void _wait_and_reset_ctx_cmd(VkvgContext ctx); void _update_push_constants (VkvgContext ctx); -void _finish_path (VkvgContext ctx); -void _clear_path (VkvgContext ctx); -bool _path_is_closed (VkvgContext ctx, uint32_t ptrPath); -uint32_t _get_last_point_of_closed_path (VkvgContext ctx, uint32_t ptrPath); - void _createDescriptorPool (VkvgContext ctx); void _init_descriptor_sets (VkvgContext ctx); void _update_descriptor_set (VkvgContext ctx, VkhImage img, VkDescriptorSet ds); diff --git a/src/vkvg_fonts.c b/src/vkvg_fonts.c index cd372f5..1a61a44 100644 --- a/src/vkvg_fonts.c +++ b/src/vkvg_fonts.c @@ -356,7 +356,10 @@ void _show_text (VkvgContext ctx, const char* text){ Vertex v = {}; - vec2 pen = ctx->curPos; + vec2 pen = {0,0}; + + if (!_current_path_is_empty(ctx)) + pen = _get_current_position(ctx); for (int i=0; i < glyph_count; ++i) { _char_ref* cr = f->charLookup[glyph_info[i].codepoint]; @@ -399,6 +402,9 @@ void _show_text (VkvgContext ctx, const char* text){ pen.x += (glyph_pos[i].x_advance >> 6); pen.y -= (glyph_pos[i].y_advance >> 6); } + + vkvg_move_to(ctx, pen.x, pen.y); + _flush_chars_to_tex(dev,f); //_show_texture(ctx); return; } diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c index 218c99a..89035c6 100644 --- a/src/vkvg_surface.c +++ b/src/vkvg_surface.c @@ -182,6 +182,7 @@ VkvgSurface vkvg_surface_create_from_image (VkvgDevice dev, const char* filePath vkvg_paint (ctx); vkvg_destroy (ctx); + vkh_image_destroy (tmpImg); return surf; diff --git a/tests/test1.c b/tests/test1.c index e4c4287..f668a89 100644 --- a/tests/test1.c +++ b/tests/test1.c @@ -64,15 +64,18 @@ void vkvg_test_clip(VkvgContext ctx){ vkvg_clip(ctx); } void vkvg_test_fill(VkvgContext ctx){ - vkvg_set_source_rgba(ctx,0.1,0.1,0.8,1.0); - vkvg_move_to(ctx,100,100); - 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_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); } @@ -318,6 +321,7 @@ void test_img_surface (VkvgContext ctx) { vkvg_set_source_surface(ctx, imgSurf, 0, 0); vkvg_paint(ctx); vkvg_flush(ctx); + vkvg_set_source_rgba(ctx,0,0,0,1); vkvg_surface_destroy(imgSurf); } void test_line_caps (VkvgContext ctx) { @@ -370,11 +374,11 @@ void test_line_join (VkvgContext ctx){ //vkvg_scale(ctx,2,2); - vkvg_set_line_width(ctx,40); + vkvg_set_line_width(ctx,10); vkvg_set_source_rgba(ctx,0,0,0,1); - vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); + //vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); //vkvg_rectangle(ctx,x,y,dx,dy); vkvg_move_to(ctx,x,y); @@ -388,6 +392,7 @@ void test_line_join (VkvgContext ctx){ 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); @@ -397,22 +402,33 @@ void test_line_join (VkvgContext ctx){ vkvg_rel_line_to(ctx,-50,0); vkvg_rel_line_to(ctx,-50,30); vkvg_close_path(ctx); - vkvg_stroke(ctx); + vkvg_fill(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_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_line_join(ctx,VKVG_LINE_JOIN_MITER); + +// 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); @@ -431,52 +447,107 @@ void test_colinear () { } void multi_test1 () { - VkvgSurface surf2 = vkvg_surface_create (device,1024,800);; - VkvgContext ctx = vkvg_create(surf2); + //VkvgSurface surf2 = vkvg_surface_create (device,1024,800);; + VkvgContext ctx = vkvg_create(surf); - vkvg_set_source_rgba(ctx,0.01,0.1,0.3,1.0); + vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0); vkvg_paint(ctx); + // vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND); - test_line_join(ctx); + //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); +// vkvg_set_source_rgba (ctx,0.02,0.8,0.3,1.0); +// vkvg_rectangle (ctx,200,200,300,300); +// vkvg_fill (ctx); + + //test_line_caps(ctx); - test_line_caps(ctx); +// test_text(ctx); - test_text(ctx); - vkvg_test_fill2(ctx); - vkvg_test_fill(ctx); + +// vkvg_test_fill(ctx); +// vkvg_test_fill2(ctx); + +// vkvg_test_stroke(ctx); // vkvg_translate(ctx, 10,10); // vkvg_rotate(ctx, 0.2); //vkvg_scale(ctx, 2,2); - vkvg_test_stroke(ctx); - vkvg_test_gradient (ctx); - vkvg_test_curves(ctx); - //test_img_surface(ctx); +// vkvg_test_gradient (ctx); +// vkvg_test_curves(ctx); +// vkvg_test_curves2(ctx); + + test_img_surface(ctx); vkvg_destroy(ctx); - ctx = vkvg_create(surf); +// ctx = vkvg_create(surf); - vkvg_set_source_rgba(ctx,0.0,0.0,0.0,1); - vkvg_paint(ctx); +// vkvg_set_source_rgba(ctx,0.0,0.0,0.0,1); +// vkvg_paint(ctx); - vkvg_set_source_surface(ctx, surf2, 0, 0); - vkvg_paint(ctx); +// vkvg_set_source_surface(ctx, surf2, 0, 0); +// vkvg_paint(ctx); - vkvg_destroy(ctx); - vkvg_surface_destroy(surf2); +// 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_clip (VkvgContext cr){ vkvg_arc (cr, 128.0, 128.0, 76.8, 0, 2 * M_PI); vkvg_clip (cr); @@ -650,16 +721,19 @@ void cairo_tests () { VkvgContext ctx = vkvg_create(surf); vkvg_set_source_rgba(ctx,0.7,0.7,0.7,1); vkvg_paint(ctx); - cairo_print_arc(ctx); + //cairo_print_arc(ctx); //cairo_test_clip(ctx); - vkvg_translate(ctx,200,0); - cairo_test_rounded_rect(ctx); - vkvg_translate(ctx,250,0); - cairo_test_curves(ctx); - vkvg_translate(ctx,200,0); - cairo_test_fill_and_stroke2(ctx); - vkvg_translate(ctx,-650,300); - cairo_print_arc_neg(ctx); + //vkvg_translate(ctx,200,0); + cairo_test_fill_rule(ctx); + + //cairo_test_rounded_rect(ctx); + //vkvg_translate(ctx,250,0); + //cairo_test_curves(ctx); +// vkvg_translate(ctx,200,0); +// cairo_test_fill_and_stroke2(ctx); +// vkvg_translate(ctx,-650,300); + //vkvg_translate(ctx,250,0); + //cairo_print_arc_neg(ctx); //vkvg_test_fill_and_stroke(ctx); vkvg_destroy(ctx); @@ -696,7 +770,7 @@ int main(int argc, char *argv[]) { surf = vkvg_surface_create (device,1024,800); - multi_test1(); + //multi_test1(); //test_grad_transforms(); -- 2.47.3