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);
#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;
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;
}
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;
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){
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;
}
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)
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;
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);
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);
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];
_add_vertex(ctx, v);
}
- vkCmdDraw (ctx->cmd,pathPointCount,1,firstVertIdx,0);
+ vkCmdDraw (ctx->cmd, pathPointCount, 1, firstVertIdx ,0);
ptrPath+=2;
}
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);
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];
_add_vertex(ctx, v);
v.pos = vec2_sub(p0, vhw);
_add_vertex(ctx, v);
+
_add_tri_indices_for_rect(ctx, firstIdx);
iL = i++;
}
_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] =
{
_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) {
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;
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;
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)
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 = {
uint32_t* pathes;
size_t sizePathes;
- vec2 curPos; //current position handling
- bool curPosExists;
vec4 curRGBA; //is store in pushConsts => may be removed.
float lineWidth;
}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);
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);
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];
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;
}
vkvg_paint (ctx);
vkvg_destroy (ctx);
+
vkh_image_destroy (tmpImg);
return surf;
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);
}
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) {
//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);
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,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);
}
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);
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);
surf = vkvg_surface_create (device,1024,800);
- multi_test1();
+ //multi_test1();
//test_grad_transforms();