ref: fc6a696cb43ffd4dd373118bdae89a4053341414
dir: /api.c/
#include "a.h" Image *canvas; int width; int height; int nostroke; Image *stroke; int strokewidth; int nofill; Image *fill; void initstate(void) { Rectangle r; width = 500; height = 500; r = Rect(0, 0, width, height); canvas = allocimage(display, r, screen->chan, 0, DWhite); nostroke = 0; stroke = display->black; strokewidth = 1; nofill = 0; fill = display->white; } void drawcanvas(void) { draw(screen, screen->r, canvas, nil, ZP); flushimage(display, 1); } int csize(lua_State *L) { int w, h; w = luaL_checkinteger(L, 1); h = luaL_checkinteger(L, 2); if(drawing) return 0; width = w; height = h; resize(L, w, h); return 0; } int cbackground(lua_State *L) { Image *i; int n; n = luaL_checkinteger(L, 1); i = getcolor(n); draw(canvas, canvas->r, i, nil, ZP); return 0; } int cnostroke(lua_State*) { nostroke = 1; return 0; } int cstroke(lua_State *L) { int n; n = luaL_checkinteger(L, 1); stroke = getcolor(n); nostroke = 0; return 0; } int cnofill(lua_State*) { nofill = 1; return 0; } int cfill(lua_State *L) { int n; n = luaL_checkinteger(L, 1); fill = getcolor(n); nofill = 0; return 0; } int cstrokewidth(lua_State *L) { int n; n = luaL_checkinteger(L, 1); strokewidth = n; return 0; } int cline(lua_State *L) { Point p1, p2; int x1, x2, y1, y2; x1 = luaL_checkinteger(L, 1); y1 = luaL_checkinteger(L, 2); x2 = luaL_checkinteger(L, 3); y2 = luaL_checkinteger(L, 4); p1 = Pt(x1, y1); p2 = Pt(x2, y2); if(!nostroke) line(canvas, p1, p2, 0, 0, strokewidth, stroke, ZP); return 0; } int csquare(lua_State *L) { Rectangle r; Point p1, p2; int x, y, w; x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); w = luaL_checkinteger(L, 3); p1 = Pt(x, y); p2 = addpt(p1, Pt(w, w)); r = Rpt(p1, p2); if(!nofill) draw(canvas, r, fill, nil, ZP); if(!nostroke) border(canvas, r, strokewidth, stroke, ZP); return 0; } int crect(lua_State *L) { Rectangle r; Point p1, p2; int x, y, w, h; x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); w = luaL_checkinteger(L, 3); h = luaL_checkinteger(L, 4); p1 = Pt(x, y); p2 = addpt(p1, Pt(w, h)); r = Rpt(p1, p2); if(!nofill) draw(canvas, r, fill, nil, ZP); if(!nostroke) border(canvas, r, strokewidth, stroke, ZP); return 0; } int ccircle(lua_State *L) { Point p; int x, y, a; x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); a = luaL_checkinteger(L, 3); p = Pt(x, y); if(!nofill) fillellipse(canvas, p, a, a, fill, ZP); if(!nostroke) ellipse(canvas, p, a, a, strokewidth, stroke, ZP); return 0; } int cellipse(lua_State *L) { Point p; int x, y, a, b; x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); a = luaL_checkinteger(L, 3); b = luaL_checkinteger(L, 4); p = Pt(x, y); if(!nofill) fillellipse(canvas, p, a, b, fill, ZP); if(!nostroke) ellipse(canvas, p, a, b, strokewidth, stroke, ZP); return 0; } int carc(lua_State *L) { Point p; int x, y, a, b, c, d; x = luaL_checkinteger(L, 1); y = luaL_checkinteger(L, 2); a = luaL_checkinteger(L, 3); b = luaL_checkinteger(L, 4); c = luaL_checkinteger(L, 5); d = luaL_checkinteger(L, 6); p = Pt(x, y); if(!nofill) fillarc(canvas, p, a, b, fill, ZP, c, d); if(!nostroke) arc(canvas, p, a, b, strokewidth, stroke, ZP, c, d); return 0; } int ctriangle(lua_State *L) { Point p[4]; int x1, y1, x2, y2, x3, y3; x1 = luaL_checkinteger(L, 1); y1 = luaL_checkinteger(L, 2); x2 = luaL_checkinteger(L, 3); y2 = luaL_checkinteger(L, 4); x3 = luaL_checkinteger(L, 5); y3 = luaL_checkinteger(L, 6); p[0] = Pt(x1, y1); p[1] = Pt(x2, y2); p[2] = Pt(x3, y3); p[3] = p[0]; if(!nofill) fillpoly(canvas, p, 3, 0, fill, ZP); if(!nostroke) poly(canvas, p, 4, 0, 0, strokewidth, stroke, ZP); return 0; } void registerfunc(lua_State *L, const char *name, int(*f)(lua_State*)) { lua_pushcfunction(L, f); lua_setglobal(L, name); } void registerfuncs(lua_State *L) { registerfunc(L, "size", csize); registerfunc(L, "background", cbackground); registerfunc(L, "noStroke", cnostroke); registerfunc(L, "stroke", cstroke); registerfunc(L, "strokeWidth", cstrokewidth); registerfunc(L, "noFill", cnofill); registerfunc(L, "fill", cfill); registerfunc(L, "line", cline); registerfunc(L, "square", csquare); registerfunc(L, "rect", crect); registerfunc(L, "circle", ccircle); registerfunc(L, "ellipse", cellipse); registerfunc(L, "arc", carc); registerfunc(L, "triangle", ctriangle); }