smallpond

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/smallpond
Log | Files | Refs

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:
Mmain.c | 24++++++++++++++++++++++--
Msmallpond.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