summaryrefslogtreecommitdiffstats
path: root/apps/plugins/lua/include_lua/draw_poly.lua
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lua/include_lua/draw_poly.lua')
-rw-r--r--apps/plugins/lua/include_lua/draw_poly.lua103
1 files changed, 103 insertions, 0 deletions
diff --git a/apps/plugins/lua/include_lua/draw_poly.lua b/apps/plugins/lua/include_lua/draw_poly.lua
new file mode 100644
index 0000000000..fd76a582b1
--- /dev/null
+++ b/apps/plugins/lua/include_lua/draw_poly.lua
@@ -0,0 +1,103 @@
+--[[ Lua Poly Drawing functions
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2017 William Wilgus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+]]
+
+--[[ Exposed Functions
+ _poly.polygon
+ _poly.polyline
+]]
+
+if not rb.lcd_framebuffer then rb.splash(rb.HZ, "No Support!") return nil end
+
+local _poly = {} do
+ local BSAND = 8 -- blits color to dst if src <> 0
+ local _NIL = nil -- nil placeholder
+
+ local _abs = math.abs
+ local _copy = rocklib_image.copy
+ local _line = rocklib_image.line
+ local flood_fill = require("draw_floodfill")
+
+ -- draws a non-filled figure based on points in t-points
+ local function polyline(img, x, y, t_points, color, bClosed, bClip)
+ if #t_points < 2 then error("not enough points", 3) end
+
+ local pt_first_last
+
+ if bClosed then
+ pt_first_last = t_points[1]
+ else
+ pt_first_last = t_points[#t_points]
+ end
+
+ for i = 1, #t_points, 1 do
+ local pt1 = t_points[i]
+
+ local pt2 = t_points[i + 1] or pt_first_last-- first and last point
+
+ _line(img, pt1[1] + x, pt1[2] + y, pt2[1] + x, pt2[2] + y, color, bClip)
+ end
+
+ end
+
+ -- draws a closed figure based on points in t_points
+ _poly.polygon = function(img, x, y, t_points, color, fillcolor, bClip)
+ if #t_points < 2 then error("not enough points", 3) end
+
+ if fillcolor then
+ local x_min, x_max = 0, 0
+ local y_min, y_max = 0, 0
+ local w, h = 0, 0
+ -- find boundries of polygon
+ for i = 1, #t_points, 1 do
+ local pt = t_points[i]
+ if pt[1] < x_min then x_min = pt[1] end
+ if pt[1] > x_max then x_max = pt[1] end
+ if pt[2] < y_min then y_min = pt[2] end
+ if pt[2] > y_max then y_max = pt[2] end
+ end
+ w = _abs(x_max) + _abs(x_min)
+ h = _abs(y_max) + _abs(y_min)
+ x_min = x_min - 2 -- leave a border to use flood_fill
+ y_min = y_min - 2
+
+ local fill_img = _newimg(w + 3, h + 3)
+ _clear(fill_img, 0x1)
+
+ for i = 1, #t_points, 1 do
+ local pt1 = t_points[i]
+ local pt2 = t_points[i + 1] or t_points[1]-- first and last point
+ _line(fill_img, pt1[1] - x_min, pt1[2] - y_min,
+ pt2[1]- x_min, pt2[2] - y_min, 0)
+
+ end
+ flood_fill(fill_img, fill_img:width(), fill_img:height() , 0x1, 0x0)
+ _copy(img, fill_img, x - 1, y - 1, _NIL, _NIL, _NIL, _NIL, bClip, BSAND, fillcolor)
+ end
+
+ polyline(img, x, y, t_points, color, true, bClip)
+ end
+
+ -- expose internal functions to the outside through _poly table
+ _poly.polyline = polyline
+end
+return _poly