commit 8c469723a93d7f64a12c15a2fbc9af0e396253b7
parent 25104c0f73448eb83495f3b8539ad6fecc2153d7
Author: Nihal Jere <nihal@nihaljere.xyz>
Date: Mon, 26 Sep 2022 12:52:52 -0500
adjust surface size based on content
Diffstat:
M | main.c | | | 24 | ++++++++++++++++++++++-- |
M | smallpond.lua | | | 94 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- |
2 files changed, 112 insertions(+), 6 deletions(-)
diff --git a/main.c b/main.c
@@ -14,6 +14,7 @@
cairo_t *cr;
FT_Face face;
cairo_font_face_t *cface;
+cairo_surface_t *surface;
int
draw_line(lua_State *L)
@@ -92,10 +93,30 @@ glyph_extents(lua_State *L)
}
int
+create_surface(lua_State *L)
+{
+ double width = lua_tonumber(L, -2);
+ double height = lua_tonumber(L, -1);
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(surface);
+
+ surface = cairo_pdf_surface_create("out.pdf", width, height);
+ cr = cairo_create(surface);
+
+ cairo_set_font_face(cr, cface);
+ cairo_set_font_size(cr, 32.0);
+
+ return 0;
+}
+
+int
main(int argc, char *argv[])
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
+ lua_pushcfunction(L, create_surface);
+ lua_setglobal(L, "create_surface");
lua_pushcfunction(L, draw_glyph);
lua_setglobal(L, "draw_glyph");
lua_pushcfunction(L, draw_line);
@@ -125,12 +146,11 @@ main(int argc, char *argv[])
return 1;
}
- cairo_surface_t *surface = cairo_pdf_surface_create("out.pdf", 648, 864);
+ surface = cairo_image_surface_create (CAIRO_FORMAT_A8, 1, 1);
cr = cairo_create(surface);
cairo_set_font_face(cr, cface);
cairo_set_font_size(cr, 32.0);
-
if (luaL_dofile(L, "smallpond.lua")) {
fprintf(stderr, "lua error: %s\n", lua_tostring(L, -1));
return 1;
diff --git a/smallpond.lua b/smallpond.lua
@@ -306,17 +306,103 @@ for i, el in ipairs(staff) do
end
end
+-- calculate extents
+local xmin = 0
+local ymin = 0
+local xmax = 0
+local ymax = 0
for i, d in ipairs(drawables) do
if d.kind == "glyph" then
- draw_glyph(d.glyph, d.x, d.y)
+ -- TODO
+ local w, h = glyph_extents(glyph)
+ elseif d.kind == "line" then
+ if d.x1 < xmin then
+ xmin = d.x1
+ elseif d.x1 > xmax then
+ xmax = d.x1
+ end
+
+ if d.x2 < xmin then
+ xmin = d.x2
+ elseif d.x2 > xmax then
+ xmax = d.x2
+ end
+
+ if d.y1 < ymin then
+ ymin = d.y1
+ elseif d.y1 > ymax then
+ ymax = d.y1
+ end
+
+ if d.y2 < ymin then
+ ymin = d.y2
+ elseif d.y2 > ymax then
+ ymax = d.y2
+ end
+ elseif d.kind == "quad" then
+ if d.x1 < xmin then
+ xmin = d.x1
+ elseif d.x1 > xmax then
+ xmax = d.x1
+ end
+
+ if d.x2 < xmin then
+ xmin = d.x2
+ elseif d.x2 > xmax then
+ xmax = d.x2
+ end
+
+ if d.y1 < ymin then
+ ymin = d.y1
+ elseif d.y1 > ymax then
+ ymax = d.y1
+ end
+
+ if d.y2 < ymin then
+ ymin = d.y2
+ elseif d.y2 > ymax then
+ ymax = d.y2
+ end
+
+ if d.x3 < xmin then
+ xmin = d.x3
+ elseif d.x3 > xmax then
+ xmax = d.x3
+ end
+
+ if d.x4 < xmin then
+ xmin = d.x4
+ elseif d.x4 > xmax then
+ xmax = d.x4
+ end
+
+ if d.y3 < ymin then
+ ymin = d.y3
+ elseif d.y3 > ymax then
+ ymax = d.y3
+ end
+
+ if d.y4 < ymin then
+ ymin = d.y4
+ elseif d.y4 > ymax then
+ ymax = d.y4
+ end
+ end
+end
+
+create_surface(xmax - xmin, ymax - ymin)
+
+for i, d in ipairs(drawables) do
+ if d.kind == "glyph" then
+ draw_glyph(d.glyph, d.x - xmin, d.y - ymin)
elseif d.kind == "line" then
- draw_line(d.t, d.x1, d.y1, d.x2, d.y2)
+ draw_line(d.t, d.x1 - xmin, d.y1 - ymin, d.x2 - xmin, d.y2 - ymin)
elseif d.kind == "quad" then
- draw_quad(d.t, d.x1, d.y1, d.x2, d.y2, d.x3, d.y3, d.x4, d.y4)
+ draw_quad(d.t, d.x1 - xmin, d.y1 - ymin, d.x2 - xmin, d.y2 - ymin, d.x3 - xmin, d.y3 - ymin, d.x4 - xmin, d.y4 - ymin)
end
end
-- draw staff
for y=0,em*4,em do
- draw_line(1, xoffset, y + yoffset, x + xoffset, y + yoffset)
+ draw_line(1, xoffset - xmin, y + yoffset - ymin, x + xoffset - xmin, y + yoffset - ymin)
end