From 1b9752712064b6ff6677a58891d79242095815b7 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Mon, 26 May 2025 12:53:41 -0500 Subject: [PATCH] draw2d uses object prototype for command creation --- scripts/modules/draw2d.js | 195 ++++++++++++-------------------------- 1 file changed, 60 insertions(+), 135 deletions(-) diff --git a/scripts/modules/draw2d.js b/scripts/modules/draw2d.js index a20362a3..5ed93060 100644 --- a/scripts/modules/draw2d.js +++ b/scripts/modules/draw2d.js @@ -17,10 +17,19 @@ var commands = [] var renderer_actor = null var renderer_id = null +// Prototype object for commands +var command_proto = null + // Set the renderer draw.set_renderer = function(actor, id) { renderer_actor = actor renderer_id = id + + // Create prototype object with common fields + command_proto = { + kind: "renderer", + id: id + } } // Clear accumulated commands @@ -60,27 +69,21 @@ draw.flush = function() { } // Helper to add a command -function add_command(cmd) { +function add_command(op, data, prop, value) { + var cmd = Object.create(command_proto) + cmd.op = op + if (data) cmd.data = data + if (prop) cmd.prop = prop + if (value !== undefined) cmd.value = value commands.push(cmd) } // Drawing functions draw.point = function(pos, size, opt = {color: Color.white}, pipeline) { if (opt.color) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "set", - prop: "drawColor", - value: opt.color - }) + add_command("set", null, "drawColor", opt.color) } - add_command({ - kind: "renderer", - id: renderer_id, - op: "point", - data: {points: [pos]} - }) + add_command("point", {points: [pos]}) } draw.point[prosperon.DOC] = ` :param pos: A 2D position ([x, y]) where the point should be drawn. @@ -139,12 +142,7 @@ function software_ellipse(pos, radii, opt) [cx + x, cy - y], [cx - x, cy - y] ].filter(pt => within_wedge(pt[0]-cx, pt[1]-cy, start, end, full_circle)) if (pts.length) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "point", - data: {points: pts} - }) + add_command("point", {points: pts}) } } @@ -204,12 +202,7 @@ function software_ellipse(pos, radii, opt) } } if (strips.length) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "rects", - data: {rects: strips} - }) + add_command("rects", {rects: strips}) } } @@ -224,13 +217,7 @@ var ellipse_def = { draw.ellipse = function(pos, radii, def, pipeline) { var opt = def ? {...ellipse_def, ...def} : ellipse_def if (opt.color) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "set", - prop: "drawColor", - value: opt.color - }) + add_command("set", null, "drawColor", opt.color) } if (opt.thickness <= 0) opt.thickness = Math.max(radii[0], radii[1]) software_ellipse(pos, radii, opt) @@ -251,20 +238,9 @@ draw.line = function(points, def, pipeline) opt = line_def if (opt.color) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "set", - prop: "drawColor", - value: opt.color - }) + add_command("set", null, "drawColor", opt.color) } - add_command({ - kind: "renderer", - id: renderer_id, - op: "line", - data: {points: points} - }) + add_command("line", {points: points}) } draw.cross = function render_cross(pos, size, def, pipe) { @@ -289,24 +265,14 @@ draw.arrow = function render_arrow(start, end, wingspan = 4, wingangle = 10, def function software_outline_rect(rect, thickness) { if (thickness <= 0) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "fillRect", - data: {rect: rect} - }) + add_command("fillRect", {rect: rect}) return; } /* stroke swallows the whole thing → fill instead */ if ((thickness << 1) >= rect.width || (thickness << 1) >= rect.height) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "fillRect", - data: {rect: rect} - }) + add_command("fillRect", {rect: rect}) return } @@ -315,20 +281,15 @@ function software_outline_rect(rect, thickness) x1 = rect.x + rect.width, y1 = rect.y + rect.height - add_command({ - kind: "renderer", - id: renderer_id, - op: "rects", - data: { - rects: [ - { x:x0, y:y0, width:rect.width, height:thickness }, // top - { x:x0, y:y1-thickness, width:rect.width, height:thickness }, // bottom - { x:x0, y:y0+thickness, width:thickness, - height:rect.height - (thickness<<1) }, // left - { x:x1-thickness, y:y0+thickness, width:thickness, - height:rect.height - (thickness<<1) } // right - ] - } + add_command("rects", { + rects: [ + { x:x0, y:y0, width:rect.width, height:thickness }, // top + { x:x0, y:y1-thickness, width:rect.width, height:thickness }, // bottom + { x:x0, y:y0+thickness, width:thickness, + height:rect.height - (thickness<<1) }, // left + { x:x1-thickness, y:y0+thickness, width:thickness, + height:rect.height - (thickness<<1) } // right + ] }) } @@ -363,22 +324,17 @@ function software_round_rect(rect, radius, thickness = 1) const r_in = radius - thickness /* straight bands (top/bottom/left/right) ------------------------- */ - add_command({ - kind: "renderer", - id: renderer_id, - op: "rects", - data: { - rects: [ - { x:x0 + radius, y:y0, width:rect.width - (radius << 1), - height:thickness }, // top - { x:x0 + radius, y:y1 - thickness + 1, - width:rect.width - (radius << 1), height:thickness }, // bottom - { x:x0, y:y0 + radius, width:thickness, - height:rect.height - (radius << 1) }, // left - { x:x1 - thickness + 1, y:y0 + radius, width:thickness, - height:rect.height - (radius << 1) } // right - ] - } + add_command("rects", { + rects: [ + { x:x0 + radius, y:y0, width:rect.width - (radius << 1), + height:thickness }, // top + { x:x0 + radius, y:y1 - thickness + 1, + width:rect.width - (radius << 1), height:thickness }, // bottom + { x:x0, y:y0 + radius, width:thickness, + height:rect.height - (radius << 1) }, // left + { x:x1 - thickness + 1, y:y0 + radius, width:thickness, + height:rect.height - (radius << 1) } // right + ] }) /* corner arcs ---------------------------------------------------- */ @@ -406,12 +362,7 @@ function software_round_rect(rect, radius, thickness = 1) ) } - add_command({ - kind: "renderer", - id: renderer_id, - op: "rects", - data: {rects: strips} - }) + add_command("rects", {rects: strips}) } /* ------------------------------------------------------------------------ @@ -427,31 +378,21 @@ function software_fill_round_rect(rect, radius) y1 = rect.y + rect.height - 1 /* main column */ - add_command({ - kind: "renderer", - id: renderer_id, - op: "rects", - data: { - rects: [ - { x:x0 + radius, y:y0, width:rect.width - (radius << 1), - height:rect.height } - ] - } + add_command("rects", { + rects: [ + { x:x0 + radius, y:y0, width:rect.width - (radius << 1), + height:rect.height } + ] }) /* side columns */ - add_command({ - kind: "renderer", - id: renderer_id, - op: "rects", - data: { - rects: [ - { x:x0, y:y0 + radius, width:radius, - height:rect.height - (radius << 1) }, - { x:x1 - radius + 1, y:y0 + radius, width:radius, - height:rect.height - (radius << 1) } - ] - } + add_command("rects", { + rects: [ + { x:x0, y:y0 + radius, width:radius, + height:rect.height - (radius << 1) }, + { x:x1 - radius + 1, y:y0 + radius, width:radius, + height:rect.height - (radius << 1) } + ] }) /* corner caps */ @@ -471,12 +412,7 @@ function software_fill_round_rect(rect, radius) ) } - add_command({ - kind: "renderer", - id: renderer_id, - op: "rects", - data: {rects: caps} - }) + add_command("rects", {rects: caps}) } var rect_def = { @@ -487,13 +423,7 @@ var rect_def = { draw.rectangle = function render_rectangle(rect, def, pipeline) { var opt = def ? {...rect_def, ...def} : rect_def if (opt.color) { - add_command({ - kind: "renderer", - id: renderer_id, - op: "set", - prop: "drawColor", - value: opt.color - }) + add_command("set", null, "drawColor", opt.color) } var t = opt.thickness|0 @@ -502,12 +432,7 @@ draw.rectangle = function render_rectangle(rect, def, pipeline) { if (opt.radius) software_fill_round_rect(rect, opt.radius) else - add_command({ - kind: "renderer", - id: renderer_id, - op: "fillRect", - data: {rect: rect} - }) + add_command("fillRect", {rect: rect}) return }