From dcfc12d0fc7826b84bcfbb374164d40df1c34732 Mon Sep 17 00:00:00 2001 From: hkc Date: Tue, 9 Apr 2024 22:56:28 +0300 Subject: [PATCH] Added circle and ring drawing functions --- example.lua | 8 +++---- src/api_draw.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/example.lua b/example.lua index e45e6bb..bbe9e82 100644 --- a/example.lua +++ b/example.lua @@ -17,16 +17,16 @@ function tick(t) Draw.line(0xFFFF00FF, 8, 100, 100, 200, 100, 300, 600, 100, 100) --> { Vec2, ... } -- Color ARGB, thickness, x, y, w, h - Draw.rect(0xFFFF000F, 1, 100, 700, 320, 240) --> Rect + Draw.rect(0xFFFF000F, 4, 100, 700, 320, 240) --> Rect -- Color ARGB, x, y, w, h Draw.rect_fill(0xFF00FFFF, 100, 700, 320, 240) --> Rect - --[[ -- Color ARGB, radius, x, y, start, end - Draw.circle(0xFFFF0000, 20, 300, 300) --> Rect + Draw.circle(0xFFFF0000, 40, 300, 300, t, t + math.pi / 2) --> Rect -- Color ARGB, outer, inner, x, y, start, end - Draw.ring(0xFF00FF00, 30, 20, 300, 300) --> Rect + Draw.ring(0xFFFFFFFF, 30, 20, 300, 300, t, t + math.pi) --> Rect + --[[ -- font, text, size, x, y, Color ARGB Draw.text(font, "Hello, world!", 32, 400, 400, 0xFFFF00FF) --> Rect diff --git a/src/api_draw.c b/src/api_draw.c index e39f064..d1fd151 100644 --- a/src/api_draw.c +++ b/src/api_draw.c @@ -3,6 +3,7 @@ #include #include #include +#include int api_draw_clear(lua_State *L); int api_draw_pixel(lua_State *L); @@ -10,6 +11,8 @@ int api_draw_line(lua_State *L); int api_draw_poly(lua_State *L); int api_draw_rect(lua_State *L); int api_draw_rect_fill(lua_State *L); +int api_draw_circle(lua_State *L); +int api_draw_ring(lua_State *L); bool loadapi_draw(lua_State *lua) { const struct luaL_Reg api_draw[] = { @@ -19,6 +22,8 @@ bool loadapi_draw(lua_State *lua) { { "poly", api_draw_poly }, { "rect", api_draw_rect }, { "rect_fill", api_draw_rect_fill }, + { "circle", api_draw_circle }, + { "ring", api_draw_ring }, }; lua_newtable(lua); luaL_setfuncs(lua, api_draw, 0); @@ -150,3 +155,56 @@ int api_draw_rect_fill(lua_State *L) { return 0; } +int api_draw_circle(lua_State *L) { + cairo_t *cr = global_context.cairo_context.cairo; + int color = luaL_checkinteger(L, 1); + double a, r, g, b; + argb_to_cairo(color, &a, &r, &g, &b); + + lua_Number radius = luaL_checknumber(L, 2); + lua_Number x = luaL_checknumber(L, 3); + lua_Number y = luaL_checknumber(L, 4); + + lua_Number start = 0.0, end = M_PI * 2.0; + if (lua_gettop(L) > 4) { + start = luaL_checknumber(L, 5); + end = luaL_checknumber(L, 6); + } + + cairo_set_source_rgba(cr, r, g, b, a); + cairo_move_to(cr, x, y); + cairo_arc(cr, x, y, radius, start, end); + cairo_fill(cr); + return 0; +} + +int api_draw_ring(lua_State *L) { + cairo_t *cr = global_context.cairo_context.cairo; + int color = luaL_checkinteger(L, 1); + double a, r, g, b; + argb_to_cairo(color, &a, &r, &g, &b); + + lua_Number outer = luaL_checknumber(L, 2); + lua_Number inner = luaL_checknumber(L, 3); + if (outer < inner) { + lua_Number tmp = outer; + outer = inner; + inner = tmp; + } + + lua_Number x = luaL_checknumber(L, 4); + lua_Number y = luaL_checknumber(L, 5); + + lua_Number start = 0.0, end = M_PI * 2.0; + if (lua_gettop(L) > 5) { + start = luaL_checknumber(L, 6); + end = luaL_checknumber(L, 7); + } + + cairo_set_line_width(cr, outer - inner); + cairo_set_source_rgba(cr, r, g, b, a); + cairo_arc(cr, x, y, (outer + inner) / 2.0, start, end); + cairo_stroke(cr); + + return 0; +}