]> O.S.I.I.S - jp/vkvg.git/commitdiff
simplify path handling, prevent closing on same position, other debug
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 25 Apr 2018 02:42:36 +0000 (04:42 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 25 Apr 2018 02:42:36 +0000 (04:42 +0200)
include/vkvg.h
src/vectors.c
src/vkvg_context.c
src/vkvg_context_internal.c
src/vkvg_context_internal.h
src/vkvg_fonts.c
src/vkvg_surface.c
tests/test1.c

index cf2f9e9d19e9451eebb6f1b8e27703ed470d6f83..7822a3528e02566b8ac1edc5e3e2e0db41406123 100644 (file)
@@ -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);
index 018795daeb061ff01aa1d010ded9ec9709cd1e50..236ce4565feae55fea1b672f11a7b919110170be 100644 (file)
@@ -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;
 }
index 1476c89736e7fddfcea5595a2867f6766aef3649..2766e8d4c2509aacf36ff5efd12dc767893d98ab 100644 (file)
@@ -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;
index b2a0f557d7690d551c2baba4c10d0004b8bfc8ae..7e9fe34bb4d54ff4367def299610eb560c3ab7cb 100644 (file)
@@ -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 = {
index f3abb747bbd7d92a6f7abfa8ea58900dbb86da87..995dcf7e35002ea91df55b6096f19bb503971a9b 100644 (file)
@@ -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);
index cd372f523773f8053172703f25877e18423a5427..1a61a443dcdccf5b40f747f3ac0c1bc53dedfb02 100644 (file)
@@ -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;
 }
index 218c99a181a721e27cfd9c9306cd7997d63f7d00..89035c63523526ee529a033013356865076ba5de 100644 (file)
@@ -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;
index e4c4287d001a68d1384964e3bb5035b8abe262ea..f668a894fb0d147826cea5a4c0893741df74c3c5 100644 (file)
@@ -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();